fmpeg已经能支持dshow设备了!
先说一下我的编译环境:
mingw+msys,ffmpeg用最新版.
在configure ffmpeg工程时,如果不特别指定,默认fdshow设备是被支持的,但编译后却没有.可以查看configure的日志文件,会发现找不到一些依赖的头文件.所以最终编译出来的ffmpeg.exe,
用ffmpeg -formats来看,在indev一项中,一般只有vfwcap,而没有dshow.
为什么会缺头文件呢?好像是有些文件中的内容是侵权的,所以mingw本身不提供,需要你自己把它搞过来.
但自己搞绝非易事,所以在网上搜到了一些文章,比如下文:
(引用自: http://www.klayge.org/2010/11/09/%E5%9C%A8mingw%E4%B8%8B%E4%BD%BF%E7%94%A8dshow%E7%9A%84%E6%96%B9%E6%B3%95/)
用MinGW编译DShow的东西,经常遇到没找到IBaseFilter的问题。本质上是MinGW的w32api并没有提供完整的DShow头文件所致。经过一番折腾,得到了下面的解决方案:
1. 从http://sourceforge.net/projects/mingw-w64/下载mingw-w64-headers,我这里用的是mingw-w64-headers-20100717.tar.xz
2. 把mingw-w64-headersinclude目录下的strmif.h、rpcndr.h、uuids.h、ksuuids.h、control.h拷贝到MinGWinclude,覆盖原有文件。
3. 打开strmif.h,删掉所有”__MINGW_EXTENSION”。
4. 打开rpcndr.h,删掉所有”__MINGW_EXTENSION”,并在第81行”typedef int ssize_t;”的前后分别加上”#ifdef _SSIZE_T_”和”#endif”。
5. 打开vmr9.h,查找”MixerPref9_RenderTargetMask = 0x000FF000″一行,在后面加上”,”;查找”wchar_t szDescription[512]“,在后面加上”;”。(这个最莫名其妙了,原作者居然都没加)
6. 打开Windows SDK的wmr9.h,把接口都添到MinGW的vmr9.h中。
至此,DShow相关的东西就可以用MinGW编译了,不再会报缺少接口。
新增和修改过的文件可以在这里下载:
DShow patch for MinGW我下载了他的patch,并覆盖,发现还是不行.
唉,这个太老了,mingw的dshow相关文档又有新内容了.
查看新的编译错误,发现是找不到ddraw.h还有dsound.h两个文件.其实这两个文件只需从微软提供的directx sdk中复制过来就行了.之后编译就能顺利通过了,并最终能在ffmpeg -formats中看到dshow.
你可以用ffplay.exe播放dshow设备来进行测试.当然应先看一下dshow设备列表:
ffplay -list_devices true -f dshow video=0
之后就可以播放一个了,比如:
ffplay -f dshow video="USB video capture 0"
注意名字有空格时要用引号括起来.