由于项目里页面有许多视频资料需要展示给用户查看,因此需要做一个视频列表,原设计是列表显示视频第一帧图,但实际上很多视频第一帧是纯黑底色。
于是想到用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");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-06-20 正则表达式在线生成工具
2018-06-20 在C#中使用正则表达式自动匹配并获取所需要的数据
2018-06-20 C#直接解析Json键值对
2017-06-20 Nginx命令
2017-06-20 Nginx反向代理图片总结
2011-06-20 借东西的小人阿莉埃蒂
2009-06-20 诚招美工