截取视频文件第一桢的图片和转换视频格式文件为flv(支持文件格式:asf,avi,mpg,flv,3gp,mov,wmv)

前段时间写过一篇抓取视频文件中图片的帖子,如下痛并努力着-在asp.net中如何从视频文件中抓取一桢并生成图像文件
另外一种方法是采用ffmpeg解码器,来实现如功能。
代码如下:
  1 public class CatchFlv
  2    {
  3       public CatchFlv()
  4       {
  5       }

  6       /// <summary>
  7       /// @从视频文件截图,生成在视频文件所在文件夹
  8       /// 支持文件格式:asf,avi,mpg,flv,3gp,mov,wmv
  9       /// 在Web.Config 中需要两个前置配置项:
 10       /// 1.ffmpeg.exe文件的路径
 11       /// <add key="ffmpeg" value="\thread\ffmpeg\ffmpeg.exe" />
 12       /// 2.截图的尺寸大小
 13       /// <add key="CatchFlvImgSize" value="140x110" />
 14       /// 3.视频处理程序ffmpeg.exe
 15       /// </summary>
 16       /// <param name="vFileName">视频文件绝对或相对地址,如:(..)/Web/FlvFile/User1/001.avi</param> 
 17       /// <returns>成功:返回图片绝对/相对地址; 失败:返回空字符串</returns>

 18       public static string CatchImg(string vFileName)
 19       {
 20           try
 21           {
 22               string ffmpeg = System.Configuration.ConfigurationSettings.AppSettings["ffmpeg"];
 23               ffmpeg = HttpContext.Current.Server.MapPath(ffmpeg);
 24
 25               if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(vFileName))))
 26               {
 27                   return "";
 28               }

 29
 30               //获得图片相对路径/最后存储到数据库的路径,如:/Web/FlvFile/User1/00001.jpg
 31               string flv_img = System.IO.Path.ChangeExtension(vFileName, ".jpg");
 32
 33               //图片绝对路径,如:D:\Video\Web\FlvFile\User1\0001.jpg
 34               string flv_img_p = HttpContext.Current.Server.MapPath(flv_img);
 35
 36               //截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="140x110" /> 
 37               string FlvImgSize = System.Configuration.ConfigurationSettings.AppSettings["CatchFlvImgSize"];
 38
 39               System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
 40               startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
 41
 42               //此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
 43               startInfo.Arguments = " -i " + System.Web.HttpContext.Current.Server.MapPath(vFileName) + " -y -f image2 -t 0.001 -s " + FlvImgSize + " " + flv_img_p;
 44               try
 45               {
 46                   System.Diagnostics.Process.Start(startInfo);
 47               }

 48               catch
 49               {
 50                   return "";
 51               }

 52               System.Threading.Thread.Sleep(4000);
 53               ///注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
 54               if (System.IO.File.Exists(flv_img_p))
 55               {
 56                   return flv_img;
 57               }

 58               return "";
 59           }

 60           catch
 61           {
 62               return "";
 63           }

 64
 65       }

 66
 67       /// <summary>
 68       /// @视频文件格式转换,生成在视频文件所在文件夹
 69       /// 支持文件格式:asf,avi,mpg,flv,3gp,mov,wmv
 70       /// 在Web.Config 中需要两个前置配置项:
 71       /// 1.ffmpeg.exe文件的路径
 72       /// <add key="ffmpeg" value="\thread\ffmpeg\ffmpeg.exe" />
 73       /// 2.截图的尺寸大小
 74       /// <add key="CatchFlvSize" value="240x180" /> 
 75       /// 3.视频处理程序ffmpeg.exe
 76       /// </summary>
 77       /// <param name="vFileName">视频文件绝对或相对地址,如:(..)/Web/FlvFile/User1/001.avi</param> 
 78       /// <returns>成功:返回flv文件绝对/相对地址; 失败:返回空字符串</returns>

 79       public static string ChangeMediaFormat(string vFileName)
 80       {
 81           try
 82           {
 83               string ffmpeg = System.Configuration.ConfigurationSettings.AppSettings["ffmpeg"];
 84               string wks_url = System.Configuration.ConfigurationSettings.AppSettings["wks_local"];
 85               ffmpeg = wks_url+ffmpeg;
 86               if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(wks_url+vFileName)))
 87               {
 88                   return "";
 89               }

 90
 91               string flv_fot = System.IO.Path.ChangeExtension(vFileName, ".flv");
 92               string flv_fot_p = wks_url+flv_fot;
 93
 94               //尺寸大小,配置在Web.Config中,如:<add key="CatchFlvSize" value="240x180" /> 
 95               string FlvImgSize = System.Configuration.ConfigurationSettings.AppSettings["CatchFlvSize"];
 96
 97               System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
 98               startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
 99
100               //此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
101               startInfo.Arguments = " -i " + wks_url+vFileName + " -ab 56 -ar 22050 -b 500 -r 15 -s  " + FlvImgSize + " " + flv_fot_p;
102
103               try
104               {
105                   System.Diagnostics.Process.Start(startInfo);
106               }

107               catch
108               {
109                   return "";
110               }

111
112               ///注意:文件格式转换成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
113               System.Threading.Thread.Sleep(6000);
114               if (System.IO.File.Exists(flv_fot_p))
115               {
116                   WKS.Common.ImagesSet.DeleteOleImg(wks_url+vFileName);
117                   return flv_fot;
118               }

119
120               return "";
121           }

122           catch
123           {
124               return "";
125           }

126       }
     
127    }

128    
但是,这种方法不知道ffmpeg什么时候生成结果,生成什么样的结果,因此也存在一定局限性.
posted @ 2006-11-03 16:43 Robin Zhang 阅读(...) 评论(...) 编辑 收藏