DirectShow捕获+mencoder+ffmpeg+sox

转载 2012年03月21日 08:48:52

DirectShow捕获+mencoder+ffmpeg+sox 

打造小巧的音视频制作、加工软件

  捕获音视频并进行加工处理,是常见的应用。录制一段小视频,加上广告,贴上字幕,再搞点音乐什么的,可以上传到视频网站上去,不管是做营销宣传,还是纯粹的娱乐目的,都很常见。当然,你可以使用市面上的很多的视频处理软件,不过,很多需要收取较高的费用或者需要破解,搞不好还会中毒。而事实上你可能只需要其中的一部分功能,而有的需求则需要使用几款软件同时合作才能实现。这个时候,做一下软件定制,搞一个完全符合自己需求的软件,不仅省去了诸多麻烦,使用起来也会得心应手、事半功倍。

  本人最近做了一个小软件,实现音视频捕获,然后进行轻度的加工处理,功能不多,但是简单、易用,最重要的是完全符合客户的需求。既然是小项目,没有必要做深层的音视频编码和格式封装,而且客户也没有那么高的需求,因此,充分的利用开源程序,是最恰当的方式。这里和大家分享一下经验。

主要需求:

1. 采集摄像头和麦克风,并生成文件

2. 为录制的视频添加字幕

3. 为录制的视频背景音乐,背景音的音量要能调节

4. 添加片头和片尾

5. 最终生成的文件体积要小,方便上传至视频共享网站(优酷、土豆等)

  需求比较简单,就这几项,但如果真的从轮子造起,那就不知道要造到猴年马月了。先上一张产品照,养养胃口:

 

     

技术分析

  1. 首先是音视频捕获,可以采用DirectShow技术(说到DirectShow,需要说明一下,我使用的是Windows SDK 7.1所带的dshow,有些人用的是dx9中的dshow,我没有对比区别)。因为这里不是做直播或监控,所以没必要实时对每一帧做处理,所以决定不采用SampleGrabber的回调形式,直接让它生成AVI文件,然后再做处理。这里因为我们还想做预览,所以需要对视频做两次RenderStream。对了,别忘了还有音频哦:)。

 

 

  2. 因为需要到要上传,所以需要对采集后的视频文件做编码处理,直接调用ffmpeg即可,可以把你几百MB的采集视频压缩为1MB。这里不采用mencoder,因为它似乎对avi文件的处理有问题。考虑到之后要添加背景音,为了保证背景音和麦克风同时存在,需要抽取音频单独处理,同样是调用ffmpeg,这里把代码列上,相信你在其他地方也能用的上:

 

  3. 音频处理,就是调用sox了。它是个好东西啊,不仅可以做音频的合并、分割,也能做混音和音量调节,这就是选择它的原因。注意,音量调节是针对原始音乐的,-v 传入的参数,指的是针对原始音量的调整幅值。大于1为增大音量,小于1减小音量,负数表示还需要对音频进行反相变换。sox还能做其他的声音处理效果,大家可以自己Google之。

  4. 添加字幕。需要调用mencoder,因为我对它进行了封装,这里不方便展示,只把字幕相关的参数列出来,以供参考。其中-subfont-text-scale后面的参数是字体的大小,-subfont参数输入的是字体文件的绝对路径,一般是C:\WINDOWS\Fonts\中的文件。

-subcp cp936 -sub-fuzziness 1 -subfont-autoscale 3 -subfont-text-scale %d -subfont-blur 2 -subfont-outline 2 -subfont %s

  5. 添加片头片尾,也就是视频合并了。合并的前提是它们的编码要一致,所以有必要对它们进行重新编码,按照录制后视频的处理方式进行处理。我把它们都转换成了mp4文件,然后就可以很方便的合并了。mp4合并是我之前就已经写好的程序,直接拿来用了。如果你没有,可以调用mp4box来做这件事情。参数我直接贴上了,大家就不用再找了。顺便说一句,如果你发现你的mp4文件存在同一时刻的音频帧和视频帧相距较远,导致网络播放时无法快起的问题,也可以用mp4box来解决:

 

mp4box.exe -cat input_1.mp4 -cat input_2.mp4 out.mp4


  基本上,主要技术就是这些了,毕竟是定制项目,不方便完全贴出来。下面贴几张处理后的效果图:

 

  字幕。。。

 片尾广告。。。


 

+++++++++++++++++++++++++++++++++++++++++++++++++++++

  HaibinDev软件工作室。(版权所有,转载请注明作者和出处~)

+++++++++++++++++++++++++++++++++++++++++++++++++++++

基于DirectShow视频及图片捕获软件的开发(写的非常详细)在后几篇博客 我会更新

我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等。DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起...
  • laoyi19861011
  • laoyi19861011
  • 2011年03月08日 15:53
  • 5202

使用DirectShow捕获视频,并截图保存

direct show ISampleGrabber ISampleGrabberCB dshow 视频捕获 摄像头捕获 视频流截图 视像头截图...
  • longji
  • longji
  • 2016年12月04日 16:45
  • 1241

directshow抓取摄像头数据的封装类

摘自:http://blog.chinaunix.net/uid-8272118-id-2033249.html 网上流传很广的CCaptureVideo类有一些小问题,而且使用起来也不是特...
  • xiaojun111111
  • xiaojun111111
  • 2016年01月15日 14:11
  • 407

directshow 无窗模式,可按钮触发截图事件

//无窗模式,可按钮触发截图 #include #include #include #include #include #include #include ...
  • luoliba007
  • luoliba007
  • 2014年09月17日 15:28
  • 1271

[DirectShow] [bug调研] 捕获多个摄像头时 后续的摄像头初始化失败

场景》 项目里实现了RenderFilter,可同时接收若干个摄像头的音视频数据并渲染 问题》 当添加多个摄像头时(每一个摄像头会单独创建一个IGraphBuilder进行Filter管理),在部...
  • felicityWSH
  • felicityWSH
  • 2017年03月01日 10:37
  • 529

机器视觉学习笔记(2)——基于DirectShow的多摄像头视频采集

机器视觉学习笔记(2)——基于DirectShow的多摄像头视频采集标签: 机器视觉 博客1.为什么使用DirectShow笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoC...
  • xuelabizp
  • xuelabizp
  • 2015年12月03日 11:09
  • 4025

DirectShow抓拍图片

“源于DirectShow自带的例子StillCap” DirectShow抓拍图片需要用到两个接口:ISampleGrabberCB和ISampleGrabber。"CB"的意思就是 Ca...
  • l5201314131413141314
  • l5201314131413141314
  • 2011年12月28日 15:33
  • 1385

DirectShow应用——音频捕捉

现在的所谓多媒体电脑一般都会有声卡(软声卡或硬声卡),有声卡就能进行音频的捕捉。大家一定熟悉Windows自带的附件“录音机”程序,可以通过麦克风进行录音,最终生成一个Wave文件。读完本文之后,你就...
  • markman101
  • markman101
  • 2010年06月30日 10:55
  • 2703

使用DirectShow.NET获取摄像头视频流

开源社区提供了DirectShow的.NET版本,为C#开发者提供了便利。这里分享下如何用DirectShow.NET API来启动摄像头,以及获取视频流数据。 参考原文:Read Barcode ...
  • yushulx
  • yushulx
  • 2016年09月29日 10:37
  • 3442

DirectShow中利用SampleGrabber捕获摄像头每一帧图像,并转为BMP文件信息写入内存

关于怎样枚举设备、建立Filter Graph等问题,我就不多说了,说也说不清楚,因为我也是才接触DirectShow。网上这类资料还是很多,百度知道的比我多多了。这里主要介绍一下自己在学习了Stil...
  • yangpan011
  • yangpan011
  • 2016年09月20日 15:43
  • 426
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectShow捕获+mencoder+ffmpeg+sox
举报原因:
原因补充:

(最多只允许输入30个字)