即上一篇中上传涉及到的 一个视频生成截图的问题,这个很简单,这是上一篇中的代码片段

  1. #region 视频上传,生成默认展示图片(自动剪切)
  2. try
  3. {
  4. string fileSavePath = DateTime.Now.ToString("yyyyMMdd");//当天时间最为文件夹
  5. string fileName = DateTime.Now.ToString("yyyyMMddHHmmssfff");//生成的文件名称
  6.  
  7. string videoPath = Consts.VIDEOINFOSAVEPATH + fileSavePath + "/";
  8. string gengeratedPicPath = Consts.VIDEOPICTURESAVEPATH + fileSavePath + "/";
  9. Thread.Sleep();
  10. fileUpLoadVideo = Request.UpLoad(videoPath, 0, gengeratedPicPath, fileName, "480x360");
  11. }
  12. catch (Exception ex)
  13. {
  14. fileUpLoadVideo = new FileUpLoadResult()
  15. {
  16. Status = false,
  17. FileSavePath = null,
  18. ErrorMsg = ex.Message
  19. };
  20. }
  21. #endregion

其中红色部分就是上传和截图的实现,以下脚本是上传:

  1. /// <summary>
  2. /// 文件上传
  3. /// </summary>
  4. /// <param name="httpRequestBase">request</param>
  5. /// <param name="saveFilePath">文件保存路径</param>
  6. /// <param name="saveNo">如果是多文件上传,用于指定,上传第几个元素 比如 0 ,1</param>
  7. /// <returns></returns>
  8. public static FileUpLoadResult UpLoad(this HttpRequestBase httpRequestBase, string saveFilePath, int? saveNo, string generatedPicturePath, string fileName, string generatedPicSize = "480x360")
  9. {
  10. FileUpLoadResult result = new FileUpLoadResult();
  11. if (httpRequestBase.Files.Count > )
  12. {
  13. if (saveNo != null)
  14. {
  15. #region 单文件上传
  16. HttpPostedFileBase file = httpRequestBase.Files[int.Parse(saveNo.ToString())];
  17. if (file.ContentLength > )
  18. {
  19. int startIndex = file.FileName.LastIndexOf(".") + ;
  20. string fileExtension = file.FileName.Substring(startIndex, file.FileName.Length - startIndex);//获取文件文件后缀
  21. string path = HttpContext.Current.Server.MapPath(saveFilePath + fileName + "." + fileExtension);
  22.  
  23. //判断文件路径是否存在,否,重新创建
  24. if (!Directory.Exists(HttpContext.Current.Server.MapPath(saveFilePath)))
  25. {
  26. try
  27. { Directory.CreateDirectory(HttpContext.Current.Server.MapPath(saveFilePath)); }
  28. catch { }
  29. }
  30.  
  31. //file.SaveAs(path);
  32.  
  33. try
  34. {
  35. Thread.Sleep();
  36. Stream stream = file.InputStream;
  37. byte[] b = new byte[stream.Length];//新建一个字节数组
  38. stream.Read(b, , b.Length);
  39. // 设置当前流的位置为流的开始
  40. stream.Seek(, SeekOrigin.Begin);
  41.  
  42. using (FileStream fstream = new FileStream(path, FileMode.Create, FileAccess.Write))
  43. {
  44. fstream.Write(b, , b.Length);
  45. }
  46. stream.Close();
  47.  
  48. }
  49. catch { }
  50.  
  51. #region MyRegion
  52. //如果是视频,生成截图
  53. if (new string[] { "mp4", "flv" }.Contains(fileExtension))
  54. {
  55. result.ShowImagePath = CatchImage.CatchImg(path, generatedPicturePath, fileName, generatedPicSize);
  56.  
  57. if (!string.IsNullOrEmpty(result.ShowImagePath))
  58. {
  59. //result.ShowImagePath = generatedPicturePath + title;
  60. result.Status = true;
  61. result.FileSavePath = new string[] { saveFilePath + fileName + "." + fileExtension };
  62. result.ErrorMsg = "";
  63. }
  64. else {
  65.  
  66. try { File.Delete(path); } catch { }
  67.  
  68. result.Status = false;
  69. result.FileSavePath = null;
  70. result.ErrorMsg = "生成截图失败,视频上传失败!";
  71. }
  72. }
  73. else {
  74. result.Status = true;
  75. result.FileSavePath = new string[] { saveFilePath + fileName + "." + fileExtension };
  76. result.ErrorMsg = "图片上传成功";
  77. }
  78. #endregion
  79. }
  80. #endregion
  81. }
  82. else
  83. {
  84. #region 文件批量上传
  85. string[] urllist = new string[httpRequestBase.Files.Count];
  86. for (int i = ; i < httpRequestBase.Files.Count; i++)
  87. {
  88. HttpPostedFileBase file = httpRequestBase.Files[i];
  89. if (file.ContentLength > )
  90. {
  91. int startIndex = file.FileName.LastIndexOf(".") + ;
  92. string fileExtension = file.FileName.Substring(startIndex, file.FileName.Length - startIndex);//获取文件文件后缀
  93. string title = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + fileExtension;
  94. string path = HttpContext.Current.Server.MapPath(saveFilePath) + title;
  95.  
  96. //判断文件路径是否存在,否,重新创建
  97. if (!Directory.Exists(HttpContext.Current.Server.MapPath(saveFilePath)))
  98. {
  99. try
  100. { Directory.CreateDirectory(HttpContext.Current.Server.MapPath(saveFilePath)); }
  101. catch { }
  102. }
  103. //file.SaveAs(path);
  104. try
  105. {
  106. Stream stream = file.InputStream;
  107. byte[] b = new byte[stream.Length];//新建一个字节数组
  108. stream.Read(b, , b.Length);
  109. // 设置当前流的位置为流的开始
  110. stream.Seek(, SeekOrigin.Begin);
  111.  
  112. using (FileStream fstream = new FileStream(path, FileMode.Create, FileAccess.Write))
  113. {
  114. fstream.Write(b, , b.Length);
  115. }
  116. stream.Close();
  117.  
  118. }
  119. catch { }
  120.  
  121. urllist[i] = saveFilePath + title;
  122. }
  123. }
  124. #endregion
  125. result = new FileUpLoadResult()
  126. {
  127. Status = true,
  128. FileSavePath = urllist,
  129. ErrorMsg = "图片上传成功"
  130. };
  131. }
  132. }
  133. else
  134. {
  135. result = new FileUpLoadResult()
  136. {
  137. Status = false,
  138. FileSavePath = null,
  139. ErrorMsg = "请选择上传文件!"
  140. };
  141. }
  142. return result;
  143. }

看一下部分片段(上段代码中的片段):

  1. //如果是视频,生成截图
  2. if (new string[] { "mp4", "flv" }.Contains(fileExtension))
  3. {
  4. result.ShowImagePath = CatchImage.CatchImg(path, generatedPicturePath, fileName, generatedPicSize);
  5.  
  6. if (!string.IsNullOrEmpty(result.ShowImagePath))
  7. {
  8. //result.ShowImagePath = generatedPicturePath + title;
  9. result.Status = true;
  10. result.FileSavePath = new string[] { saveFilePath + fileName + "." + fileExtension };
  11. result.ErrorMsg = "";
  12. }
  13. else {
  14.  
  15. try { File.Delete(path); } catch { }
  16.  
  17. result.Status = false;
  18. result.FileSavePath = null;
  19. result.ErrorMsg = "生成截图失败,视频上传失败!";
  20. }
  21. }
  22. else {
  23. result.Status = true;
  24. result.FileSavePath = new string[] { saveFilePath + fileName + "." + fileExtension };
  25. result.ErrorMsg = "图片上传成功";
  26. }

这里只是对mp4 flv的格式视频做了判断,直接写死了,里面的生成切图的方法:CatchImage.CatchImg(path, generatedPicturePath, fileName, generatedPicSize);见下面的代码:

  1. /// <summary>
  2. /// 图片截取 或转换格式(flv)
  3. /// </summary>
  4. public class CatchImage
  5. {
  6. //转换电影
  7. #region //运行FFMpeg的视频解码,(这里是绝对路径)
  8. /// <summary>
  9. /// 转换文件并保存在指定文件夹下面(这里是绝对路径)
  10. /// </summary>
  11. /// <param name="fileName">上传视频文件的路径(原文件)</param>
  12. /// <param name="playFile">转换后的文件的路径(网络播放文件)</param>
  13. /// <param name="imgFile">从视频文件中抓取的图片路径</param>
  14. /// <param name="videoWidthAndHeight">视频 高度、宽度 格式: 480x360</param>
  15. /// <param name="generatedPictureWidthAndHeight">生成图片的高宽 格式: 480x360</param>
  16. /// <returns>成功:返回图片虚拟地址; 失败:返回空字符串</returns>
  17. public static string ChangeFilePhy(string fileName, string playFile, string imgFile, string videoWidthAndHeight, string generatedPictureWidthAndHeight)
  18. {
  19. //取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\51aspx\ffmpeg.exe" />
  20. string ffmpeg = System.Web.HttpContext.Current.Server.MapPath("~/Tools/ffmpeg.exe");
  21. if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(fileName)))
  22. {
  23. return "";
  24. }
  25.  
  26. //获得图片和(.flv)文件相对路径/最后存储到数据库的路径,如:/Web/User1/00001.jpg
  27.  
  28. string flv_file = System.IO.Path.ChangeExtension(playFile, ".flv");
  29.  
  30. //截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />
  31. System.Diagnostics.Process FilesProcess = new System.Diagnostics.Process();
  32. FilesProcess.StartInfo.FileName = ffmpeg;
  33. FilesProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
  34. FilesProcess.StartInfo.Arguments = " -i " + fileName + " -ab 56 -ar 22050 -b 500 -r 30 -s " + videoWidthAndHeight + " " + flv_file;
  35. try
  36. {
  37. FilesProcess.Start();
  38. while (!FilesProcess.HasExited)
  39. {
  40.  
  41. }
  42. //截图
  43. //CatchImg(fileName, imgFile, generatedPictureWidthAndHeight);
  44. }
  45. catch (Exception ex)
  46. {
  47. //Console.WriteLine(ex.Message);
  48. return ex.Message;
  49.  
  50. }
  51. return "";
  52. }
  53. #endregion
  54.  
  55. //截图程序
  56. public static string CatchImg(string fileName, string imgFile, string imgFileName, string generatedPictureWidthAndHeight)
  57. {
  58. //
  59. string ffmpeg = System.Web.HttpContext.Current.Server.MapPath("~/Tools/ffmpeg.exe");
  60. //
  61. if (!Directory.Exists(HttpContext.Current.Server.MapPath(imgFile)))
  62. {
  63. try
  64. { Directory.CreateDirectory(HttpContext.Current.Server.MapPath(imgFile)); }
  65. catch { }
  66. }
  67.  
  68. string flv_img = imgFile + imgFileName + ".jpg";
  69. string cutImgFullPath = HttpContext.Current.Server.MapPath(flv_img);
  70. //
  71. System.Diagnostics.ProcessStartInfo ImgstartInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
  72. ImgstartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
  73. Thread.Sleep();
  74. //
  75. //可用参考指令
  76. ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -ss 2 -vframes 1 -s " + generatedPictureWidthAndHeight + " " + cutImgFullPath;//可用指令
  77. //ImgstartInfo.Arguments = ("-i " + fileName + " -y -f image2 -ss 00:00:06 -t 0.001 -s " + generatedPictureWidthAndHeight + " " + flv_img);
  78.  
  79. //return ExeCommand(ToolsPath + " -i " + strFullVideoFile + " -y -f image2 -ss " + StartPoint + " -t 0.001 -s " + CutImgWidth + "x" + CutImgHeight + " " + strFullOutputImg);
  80. //ImgstartInfo.Arguments = " -i " + fileName + " -y -f image2 -ss 2 -vframes 1 -s " + generatedPictureWidthAndHeight + " " + flv_img;
  81. try
  82. {
  83. System.Diagnostics.Process.Start(ImgstartInfo);
  84. Thread.Sleep();
  85. }
  86. catch (Exception ex)
  87. {
  88. //Console.WriteLine(ex.Message);
  89. return ex.Message;
  90. }
  91. //
  92. if (System.IO.File.Exists(cutImgFullPath))
  93. {
  94. return flv_img;
  95. }
  96.  
  97. return "";
  98. }
  99.  
  100. }

这是一个完整的类,可以直接拿来使用,包含视频格式转换以及  视频剪切,剪切部分的指令,写法有好多种,目前未注释的指令测试百分百可用,但是使用有一个注意点,细心的 猿类同仁应该看得出来,指令 与指令之间有空格,那么,如此一来,

"   -i   " + fileName + "  -y  -f  image2   -ss 2 -vframes 1  -s   " + generatedPictureWidthAndHeight + "   " + cutImgFullPath;//可用

这个命令中的参数,也就是说 加号中间的变量,对应的值不可以出现空格,之语中文可不可以,我已经忘记了,这是好几个月之前搞着玩的东西了。

process调用的工具 ffmpeg,一百度,一大把。

mvc5 + ef6 + autofac搭建项目(四).1视屏上传生成截图的更多相关文章

  1. mvc5 + ef6 + autofac搭建项目(四)

    在列表页面,点击新增,弹出窗口实现视屏上传,这里存在一个问题,就是大文件上传的问题,iis出于安全问题,有限制,当然这不是大问题,解决也很容易: 见截图: 请忽略视屏文件,看得懂的请装作不懂. 源码 ...

  2. mvc5 + ef6 + autofac搭建项目(三)

    前面已经基本完成了框架的搭建,后面就是实现了,后面主要说下前端的东西bootstrap的使用和相关插件. 看图: 实现比较简单,在主页面只引入共用部分的 js等相关包,毕竟不是所有页面都需要列表以及其 ...

  3. mvc5 + ef6 + autofac搭建项目(repository+uow)(一)

    直奔主题了,不那么啰嗦. 整体框架的参考来源是  O# 的框架,在此感谢锋哥一直以来的开源,让我们有的学 如下图: (图一) 一下分三个步骤说明,分别为 dbContext,repository,uo ...

  4. mvc5 + ef6 + autofac搭建项目(repository+uow)(二)

    续上篇: DBContext 在上篇 图一类库根目录创建的 DbContextBase /// <summary> /// 数据库上下文基类 /// </summary> // ...

  5. Java Web 项目的文件/文件夹上传下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  6. Linux搭建GIT 使用Eclipse创建并上传Git项目 EGit操作

    Linux搭建Git 1. gitblit服务器文档 http://gitblit.com/setup_go.html 2. 安装jdk 参考 http://blog.csdn.net/jerome_ ...

  7. Docker-生成镜像、服务搭建(redis集群、kibana、运行项目jar包)、上传镜像至阿里云

    目录 生成自己的镜像 1.下载官方tomcat镜像 2.运行镜像后将webapp目录里新增文件(官方镜像是没有页面的 具体操作见) 3.使用docker ps -a 查看刚刚修改后的容器id 4.执行 ...

  8. 搭建自己的NuGet服务器,上传自定义NuGet包

    第一步搭建NuGet服务器 创建空Web项目 安装Nuget服务,目前最新版本2.8.2 安装完成,会自动生产服务,出现如下界面 发布该网站,并部署至IIS 将.nupkg文件发布至网站的Packag ...

  9. Spring Boot2(十四):单文件上传/下载,文件批量上传

    文件上传和下载在项目中经常用到,这里主要学习SpringBoot完成单个文件上传/下载,批量文件上传的场景应用.结合mysql数据库.jpa数据层操作.thymeleaf页面模板. 一.准备 添加ma ...

随机推荐

  1. WordPress RokIntroScroller插件‘thumb.php’多个安全漏洞

    漏洞名称: WordPress RokIntroScroller插件‘thumb.php’多个安全漏洞 CNNVD编号: CNNVD-201309-383 发布时间: 2013-09-24 更新时间: ...

  2. zabbix监控zookeeper

    在github找到一个不错的模板,直接导入使用.下载地址: https://github.com/zhujinhe/zookeeper-zabbix-template 监控项监控类型为外部检查 zab ...

  3. DevExpress控件学习总结 z

    1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹出菜单(popup menus),我们 ...

  4. Eclipse插件Subclipse各版本插件下载地址以及与Subverison的对应关系

    Subclipse 1.4.x includes and requires Subversion 1.5.x client features and working copy format. Subc ...

  5. background-attachment:fixed应用

    设置为fixed属性,背景相对于屏幕窗口固定,然后如果有一张全屏的图片,再来一张全屏的图片,就可以看到与平时滚动屏幕不同的切换图片.代码CSS部分: html, body,.content{ heig ...

  6. Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜

    2393: Cirno的完美算数教室 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 287  Solved: 175[Submit][Status][ ...

  7. [转]在 Mac OS X 终端里使用 Solarized 配色方案

    相信长期浸泡在终端和代码的小伙伴们都有一套自己喜爱的配色方案.以前一直在用简单.适合阅读的 Terminal.app 配色方案,换到 MacBook Pro with Retina display 后 ...

  8. hdoj 1698 Just a Hook【线段树区间修改】

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. iOS中SQLite知识点总结2

    数据库(SQLite) 01-多表查询 格式:select 字段1,字段2,... from 表名1,表名2; 别名:select 别名1.字段1 as 字段别名1,别名2.字段2 as 字段别名2, ...

  10. Apache Commons 工具类

    http://blog.csdn.net/feicongcong/article/details/53374399http://blog.csdn.net/hsienhua/article/detai ...