Windows Media Foundation 音视频采集 小记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows Media Foundation 音视频采集 小记相关的知识,希望对你有一定的参考价值。

写在前面

我是个讲文明的人…… 不过有的时候实在忍不住了也要吐槽几句:

1. 我真是跟不上时代,到现在了还在研究 Windows 应用开发…… 咳;

2. DirectShow 是傻X!我只是想要获取 Camera 裸数据,尼玛却要让我学习神马各种 .ax, filter, graph... 相关资料少、又晦涩;

3. 在此祝愿 Windows XP 及其之前的版本早点退出历史舞台,这样 DirectShow 就不是必须的了!

 

音视频采集

Windows 7 以后, Media Foundation 支持音视频采集。视频采集设备必须支持 UVC 1.1 驱动。音频采集设备通过 Windows Audio Session API (WASAPI) 来支持。
采集设备在 Media Foundation 中表现为 Media Source 对象,暴露出 IMFMediaSource 接口。但是一般情况下应用程序不会直接用这个接口,而会使用更高层的API,比如 Source Reader 来控制采集设备。
枚举采集设备们:
1 调用 MFCreateAttributes 函数创建属性库;
2 设置 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 属性(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID 或 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
3 调用 MFEnumDeviceSources 函数就会得到一组 IMFActivate 指针。每个指针就是一个设备;
4 调用 GetAllocatedString 函数 可以获取设备名称,其中,
4.1 用 GetAllocatedString 函数 的 MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME 参数可以获取显示名称
4.2 用 GetAllocatedString 函数 的 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK 参数可以获取视频采集设备的物理名称,名称是唯一的,但不好阅读
4.3 用 GetAllocatedString 函数 的 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID 参数可以获取音频采集设备的物理名称,名称是唯一的,但不好阅读
5 调用 IMFActivate::ActivateObject 或 MFCreateDeviceSource 方法来创建一个可用的 Media Source 对象实例。
对于具体的一个采集设备(创建好了的 Media Source),获取设备所支持的格式,并设置采集格式:
1 调用 IMFMediaSource::CreatePresentationDescriptor 获取媒体源(Media Source)的表现描述符(presentation descriptor)
2 调用 IMFPresentationDescriptor::GetStreamDescriptorByIndex 获取视频流的流描述符(Stream Descriptor)
3 调用 IMFStreamDescriptor::GetMediaTypeHandler 获取流描述符的媒体类型句柄(IMFMediaTypeHandler)
4 调用 IMFMediaTypeHandler:: 的 GetMediaTypeCount 和 GetMediaTypeByIndex 来获取每一条目的格式(IMFMediaType,每一条目的格式包含许多属性,如宽高、采样格式、帧率),另外,教程还有一些实用函数,用于打印 IMFAttributes 。
5 最后, IMFMediaTypeHandler::SetCurrentMediaType 设置指定条目的格式(IMFMediaType)。如果要修改 IMFMediaType 的某个属性(比如 Frame Rate)的话,就调用 IMFMediaType::SetItem 来设置具体的属性(比如 MF_MT_FRAME_RATE)。具体要看代码来理解。

相关文档:

https://msdn.microsoft.com/en-us/library/dd940328.aspx (设备使用时中途丢失的处理,待学)

 

 

其他功能

视频采集并显示(MFCaptureD3D): https://msdn.microsoft.com/en-us/library/dd743690.aspx 

音视频采集 + 编码(Transcode): https://msdn.microsoft.com/en-us/library/ff485863.aspx

播放媒体文件:https://msdn.microsoft.com/en-us/library/ms703190.aspx

 

 

代码地址

在 Windows SDK 的 Samples\multimedia\mediafoundation 目录中

 

以上是关于Windows Media Foundation 音视频采集 小记的主要内容,如果未能解决你的问题,请参考以下文章

Windows Media Foundation:获取 AAC 解码数据

Windows Media Foundation MFCreateSourceReaderFromURL 函数中的内存泄漏。任何替代功能?

在 Windows 10 上为 Qt 构建 WMF(Windows Media Foundation)媒体驱动程序插件

Microsoft Windows Server 2008 R2 中的 Microsoft Media Foundation

Windows 7 CoreAudio Media Foundation - IID_IAudioStreamVolume 的 uuidof

用于 Windows RT 的 Media Foundation Audio MFT 的最小实现