由于项目里页面有许多视频资料需要展示给用户查看,因此需要做一个视频列表,原设计是列表显示视频第一帧图,但实际上很多视频第一帧是纯黑底色。
于是想到用js利用canvas截图,最后发现由于浏览器跨域限制,这种方法只能取内部视频的帧图。问题是,现在谁还把大量视频资料放在自己的服务器上呢,那不是找死吗。。。。唉。。。。
没办法,只能再想招了,最后只能用c#后台逐个视频取对应帧图,然后跟视频路径一起存放到视频数据记录表里的办法。
本文只贴出C#后台取视频的帧图的代码。
首先,需要下载ffmpeg这个专业的视频处理工具,网上很地方都可以下,也可以点击这里去下载。实现本文功能,只需要包里的ffmpeg.exe这个可执行文件,将他复制一份到项目文件夹下——自己根据需要放一个合理的地方,本文是放在bin文件夹下。
然后就是代码咯:
/// <summary>
/// 从视频画面中截取一帧画面为图片
/// </summary>
/// <param name="videoName">视频文件pic/guiyu.mov</param>
/// <param name="widthAndHeight">图片的尺寸如:240*180</param>
/// <param name="cutTimeFrame">开始截取的时间如:"1"</param>
/// <returns></returns>
public string GetPicFromVideo(string videoName, string widthAndHeight, string cutTimeFrame)
{
var vdoName = videoName.Substring(videoName.LastIndexOf("/") + 1);
var fileName = vdoName.Split('.')[0];
var basePath = Server.MapPath("~");
var ffmpeg = basePath + "bin\\ffmpeg.exe";
var srcName = basePath + videoName.Replace("/","\\");
var objName = basePath + "Images\\VideoCover\\" + fileName + ".jpg";
var startInfo = new ProcessStartInfo(ffmpeg);
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = " -i " + srcName + " -y -f image2 -ss " + cutTimeFrame + " -t 0.001 -s " + widthAndHeight + " " + objName;
try
{
Process.Start(startInfo);
return "/Images/VideoCover/" + fileName + ".jpg";
}
catch (Exception re)
{
Log.WriteLog(re.Message);
return "";
}
}
//调用举例:
var re = GetPicFromVideo("video/MyTest.mov", "160*100", "1");