C#调用ffmpeg从视频提取图片

  微信公众号“CSharp编程大全”的文章《C#从视频提取图片?》介绍了基于Microsoft.DirectX.AudioVideoPlayback.Video类实现从视频提取图片的方式,本来是想学习并测试该类的用法,但实际测试过程中却没有测通。百度从视频提取图片,网上用的较多的是用ffmpeg,本文记录调用ffmpeg从视频提取图片的基本用法。
  从官网文档来看(如下图所示),ffmpeg.exe支持通过不同的参数配置按多种模式提取图片,主要包括以下几种:

在这里插入图片描述
  1)按视频流逐帧导出。下面的命令从视频中按一秒钟一帧的方式导出jpeg格式的图片,主要的参数包括:-i,指定源视频文件地址,-r,设置视频流的帧率,-s,设定视频的画面大小,-f,设置设定文件格式,如果是图片,则是image2,最后是设置导出文件的文件名;

ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

  2)将视频指定时间段内容导出为图片。下面的命令从视频中指定时间点提取指定时长内的所有帧的图片,主要参数包括:-i,指定源视频文件地址,-ss,从指定时间开始转换,以秒为单位,-t,指定输出文件的持续时间,以秒为单位,-f,设置设定文件格式,如果是图片,则是image2,最后是设置导出文件的文件名;

ffmpeg -i foo.avi -ss startseconds -t seconds -f image2 foo-%03d.jpeg

  3)将视频指定帧数的内容导出为图片。下面的命令从视频中指定时间点开始提取指定帧数的图片,主要参数包括-i,指定源视频文件地址,-ss,从指定时间开始转换,以秒为单位,-vframes,等价于frames:v,指定输出的视频帧数目,-f,设置设定文件格式,如果是图片,则是image2,最后是设置导出文件的文件名。

ffmpeg -i foo.avi -ss startseconds  -vframes seconds  -f image2 foo-%03d.jpeg

  根据上述说明,编写简单的测试程序,支持按时间段和按帧数导出图片,关键代码如下:

//按时间段导图片
process.StartInfo.FileName = "ffmpeg.exe";
process.StartInfo.Arguments = @$"-i {txtVideoFile.Text} -ss {Convert.ToInt32(nudStart.Value)} -t {Convert.ToInt32(nudEnd.Value - nudStart.Value)} -f image2 {txtImgDir.Text + "\\" + "foo-%03d.jpeg"}";
process.Start();//按帧数导图片
process.StartInfo.FileName = "ffmpeg.exe";
process.StartInfo.Arguments = @$"-i {txtVideoFile.Text} -ss {Convert.ToInt32(nudStart.Value)} -vframes {Convert.ToInt32(nudEnd.Value - nudStart.Value)} -f image2 {txtImgDir.Text + "\\" + "foo-%03d.jpeg"}";
process.Start();

  测试程序界面如下图所示:
在这里插入图片描述
参考文献:
[1]https://blog.csdn.net/weixin_68436326/article/details/134047021
[2]http://ffmpeg.org/ffmpeg.html#Video-Options
[3]https://blog.csdn.net/chinaherolts2008/article/details/122611791
[4]https://blog.csdn.net/angzhuo9931/article/details/101931713
[5]https://blog.csdn.net/weixin_44350205/article/details/105886069
[6]https://zhuanlan.zhihu.com/p/637199541

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217976.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据集】全网最全的常见已公开医学影像数据集

目录 一,极市医学数据集汇总 1.CT 医学图像 ​编辑 2.恶性与良性皮肤癌 3.白内障数据集 4.胸部 X 光图像(肺炎) 5.用于图像增强的内窥镜真实合成曝光过度和曝光不足帧 6.医学家 7.乳房组织病理学图像 8.皮肤癌 MNIST:HA…

【广州华锐互动】Web3D云展编辑器能为展览行业带来哪些便利?

在数字时代中,传统的展览方式正在被全新的技术和工具所颠覆。其中,最具有革新意义的就是Web3D云展编辑器。这种编辑器以其强大的功能和灵活的应用,正在为展览设计带来革命性的变化。 广州华锐互动开发的Web3D云展编辑器是一种专门用于创建、编…

Cesium-terrain-builder编译入坑详解

本以为编译cesium-terrian-tools编译应该没那么难,不想问题重重,不想后人重蹈覆辙,也记录下点点滴滴。 目前网上存在的cesium代码版本主要有两个分支: 原始网站【不能生成layer文件,且经久不更新,使用gdal…

微信小程序富文本拓展rich-text

微信小程序富文本插件 功能介绍 支持解析<style>标签中的全局样式支持自定义默认的标签样式支持自动设置标题 若html中存在title标签,将自动把title标签的内容设置到页面的标题上,并在回调bindparse中返回,可以用于转发支持添加加载提示 可以在Parser标签内添加加载提…

selenium的基础语法

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️山水速疾来去易&#xff0c;襄樊镇固永难开 ☁️定位页面的元素 参数:抽象类By里…

4.25每日一题(通过被积函数和积分区域(不等式)选正确的坐标系求二重积分)

一、正确画出积分区域&#xff1b;通过积分区域和被积函数选择方法 二、如何根据被积函数和积分区域正确选择通过极坐标还是根据直角坐标方程计算&#xff1a; &#xff08;1&#xff09;适合极坐标的积分区域&#xff1a;圆或者部分圆 &#xff08;2&#xff09;适合极坐标的…

c语言-字符函数和字符串函数详解

文章目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4. strcpy的使用和模拟实现5. strncpy函数的使用6. strcat的使用和模拟实现7. strncat函数的使用8. strcmp的使用和模拟实现9. strncmp函数的使用10. strstr的使用和模拟实现11. strtok函数的使用12. strerro…

【数据处理】 -- 【两分钟】了解【最好】的方式 -- 【正则表达式】

直接匹配&#xff1b; 普通字符 元匹配&#xff1a; . 任意单字符 r’表示单引号里字符为其特殊含义&#xff0c;比如.不是句号是匹配符的意思 *任意次数&#xff08;换行结束&#xff09; 一次及以上 {3,4}指定次数,至少3次&#xff0c;最多4次|{3}固定4次 [\d.]单个任意…

位图及有关海量数据处理

bitset 1.给40亿个不重复的无符号整数&#xff0c;没排过序&#xff0c;给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个中 ①.如果用排序加二分查找&#xff0c;40亿个数需要16g内存&#xff0c;内存开不出这么大连续空间 ②.每个值映射一个比特位&#xff0c;…

用AI工具3分钟整理并制作出一本书的思维导图

本期教大家快速用AI工具制作出精美的思维导图。 1.用ChatGPT总结出书本内容 首先打开ChatGPT&#xff0c;在对话框中输入你想要它生成的内容&#xff0c;并且要求他以markdown代码的格式输出&#xff0c;只需要几十秒的时间。整本书的框架思维导图就生成了&#xff0c;你还可以…

【后端卷前端】

为啥现在对后端要求这么高?为啥不要求前端会后端呢? 可能是后端人太多了,要求后端需要会前端的框架(vue react angular ), 这不我为了适应市场的需求来系统的学习vue了: 生成一个基础的vue项目 创建vue项目 vue create projectname 创建vitevue npm init vitelatest p…

Jenkins 整合 Docker 自动化部署

Docker 安装 Jenkins 配置自动化部署 1. Docker 安装 Jenkins 1.1 拉取镜像文件 docker pull jenkins/jenkins1.2 创建挂载文件目录 mkdir -p $HOME/jenkins_home1.3 启动容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…