从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称
Get encoder name from SinkWriter or ICodecAPI or IMFTransform
>我正在使用SinkWriter来使用媒体基础对视频进行编码。
初始化 SinkWriter 后,我想获取它使用的基础编码器,并打印出它的名称,以便我可以看到它使用的编码器。(就我而言,编码器很可能是 MF 中包含的 H.264 视频编码器)。
我可以获取对编码器的 ICodecAPI 和 IMFTransform 接口的引用(使用 pSinkWriter->GetServiceForStream
),但我不知道如何使用这些接口获取编码器的友好名称。
有谁知道如何从接收器写入器获取编码器的友好名称?还是从其ICodecAPI
或IMFTransform
界面?
到目前为止,这是一个有效的解决方案,我不能 100% 确定它有效,但可以做的是:
1)在启动时枚举所有可以使用的编解码器(如我在本例中理解的H264编码器)并订阅设置更改事件
MFT_REGISTER_TYPE_INFO TransformationOutput = { MFMediaType_Video, MFVideoFormat_H264 };
DWORD nFlags = MFT_ENUM_FLAG_ALL;
UINT32 nCount = 0;
CLSID* pClsids;
MFTEnum( MFT_CATEGORY_VIDEO_ENCODER, nFlags, NULL, &TransformationOutput, NULL, &pClsids, &nCount);
// Ok here we assume nCount is 1 and we got the MS encoder
ICodecAPI *pMsEncoder;
hr = CoCreateInstance(pClsids[0], NULL, CLSCTX_INPROC_SERVER, __uuidof(ICodecAPI), (void**)&pMsEncoder);
// nCodecIds is supposed to be an array of identifiers to distinguish the sender
hr = pMsEncoder->RegisterForEvent(CODECAPI_AVEncVideoOutputFrameRate, (LONG_PTR)&nCodecIds[0]);
2)不是100%确定在设置流的输入媒体类型时是否也设置了帧速率设置,但无论如何,您可以尝试在从SinkWriter
检索到的ICodecAPI
上设置相同的属性。然后,在获取事件后,您应该能够通过将lParam1
与传递的值进行比较来识别编解码器。但这仍然非常糟糕,因为它依赖于所有编码器都支持事件通知的事实,并且如果我关于在流构造上生成的事件的假设是错误的,则需要更改不必要的参数。
有了IMFTransform
,你没有编码器的友好名称。
你拥有的选项之一是检查转换输出类型并与众所周知的 GUID 进行比较以识别编码器,特别是你将有一个子类型MFVideoFormat_H264
与 H264 编码器 MFT。
另一种选择是访问编码器的CLSID
(IMFTransform
不会得到它,但您可能会以其他方式获得它,例如通过IMFActivate
或查询MFT_TRANSFORM_CLSID_Attribute
属性,或通过IPersist*
接口)。然后,可以在注册表中查找友好名称或枚举转换,并通过比较 CLSID 在该列表中查找转换。
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 绝对编码器十六进制输入
- 如何使用QT创建器获取网页源代码?
- *新的编码器*格式和运算符
- 我们如何跳过帧,计算帧数并使用视频阅读器获取当前帧
- Arduino RPM代码与正交编码器600ppr
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 使用列表迭代器获取所有值
- 如何将 MATLAB 图像处理库内置函数转换为 MATLAB 编码器代码生成不支持的 C++?
- 通过交互器获取向量中的索引
- Openh264 编码器增加了 IDR 或 I 帧的数量
- 确定输入"conscalc: calc"的类型时出错。不能联合编码器。具有不同字段集的结构类型
- 将原始视频图像转换为VPX编码器的I420
- 使用 MATLAB 编码器将代码从注册估算器应用程序导出到C++
- 如何读取旋转编码器
- 如何从迭代器获取列表
- 防止编码器错误 - 忘记在"std::enable_if<>::type"中添加"::type" (SFINAE)
- MT4交易平台API管理器 - 获取每组证券
- 如何使用Imebra库将压缩像素(用我自己的编码器压缩)回到DICOM图像文件中
- 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称