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)。具体要看代码来理解。
相关文档:
其他功能
视频采集并显示(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 的最小实现