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

{
public CatchFlv()

{
}

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

{
try

{
string ffmpeg = System.Configuration.ConfigurationSettings.AppSettings["ffmpeg"];
ffmpeg = HttpContext.Current.Server.MapPath(ffmpeg);

if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(vFileName))))

{
return "";
}

//获得图片相对路径/最后存储到数据库的路径,如:/Web/FlvFile/User1/00001.jpg
string flv_img = System.IO.Path.ChangeExtension(vFileName, ".jpg");

//图片绝对路径,如:D:/Video/Web/FlvFile/User1/0001.jpg
string flv_img_p = HttpContext.Current.Server.MapPath(flv_img);

//截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="140x110" />
string FlvImgSize = System.Configuration.ConfigurationSettings.AppSettings["CatchFlvImgSize"];

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;

//此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
startInfo.Arguments = " -i " + System.Web.HttpContext.Current.Server.MapPath(vFileName) + " -y -f image2 -t 0.001 -s " + FlvImgSize + " " + flv_img_p;
try

{
System.Diagnostics.Process.Start(startInfo);
}
catch

{
return "";
}
System.Threading.Thread.Sleep(4000);

/**//**//**////注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
if (System.IO.File.Exists(flv_img_p))

{
return flv_img;
}
return "";
}
catch

{
return "";
}

}


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

{
try

{
string ffmpeg = System.Configuration.ConfigurationSettings.AppSettings["ffmpeg"];
string wks_url = System.Configuration.ConfigurationSettings.AppSettings["wks_local"];
ffmpeg = wks_url+ffmpeg;
if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(wks_url+vFileName)))

{
return "";
}

string flv_fot = System.IO.Path.ChangeExtension(vFileName, ".flv");
string flv_fot_p = wks_url+flv_fot;

//尺寸大小,配置在Web.Config中,如:<add key="CatchFlvSize" value="240x180" />
string FlvImgSize = System.Configuration.ConfigurationSettings.AppSettings["CatchFlvSize"];

System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;

//此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
startInfo.Arguments = " -i " + wks_url+vFileName + " -ab 56 -ar 22050 -b 500 -r 15 -s " + FlvImgSize + " " + flv_fot_p;

try

{
System.Diagnostics.Process.Start(startInfo);
}
catch

{
return "";
}


/**//**//**////注意:文件格式转换成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
System.Threading.Thread.Sleep(6000);
if (System.IO.File.Exists(flv_fot_p))

{
WKS.Common.ImagesSet.DeleteOleImg(wks_url+vFileName);
return flv_fot;
}

return "";
}
catch

{
return "";
}
}
}
但是,这种方法不知道ffmpeg什么时候生成结果,生成什么样的结果,因此也存在一定局限性.
另外一种方法是采用ffmpeg解码器,来实现如功能。
代码如下:




































































































































































但是,这种方法不知道ffmpeg什么时候生成结果,生成什么样的结果,因此也存在一定局限性.