IMFMediaSink,如何设置编码器属性?

Posted

技术标签:

【中文标题】IMFMediaSink,如何设置编码器属性?【英文标题】:IMFMediaSink, how to set an encoder property? 【发布时间】:2015-01-24 16:46:56 【问题描述】:

我实现了一个 IMFMediaSink 接口,该接口通过本机 h264 编解码器对特定源进行编码(我们谈论的是 Windows 8 Modern(Metro)接口)。我想更改 h264 编解码器的默认选项,该怎么做?

我在网上搜索了一下,有点明白ICodecAPI接口和我想做的事情有关,但是怎么用呢?有没有人可以查看一些示例代码来尝试了解该怎么做?

我知道我可以将 MF_SINK_WRITER_ENCODER_CONFIG 用于 sinkwriter,但不幸的是我没有使用该类。

【问题讨论】:

【参考方案1】:

可能是这样的:

尝试从IMFMediaSink 在您的 h264 流上获取IMFStreamSinkGetStremSinkCountGetStreamSinkByIndex 应该可以帮助您。

然后在IMFMediaSink 对象上调用GetMediaTypeHandler。 在IMFMediaTypeHandler 上致电GetCurrentMediaType。 现在您应该有一个指向IMFMediaType 的指针,它派生自IMFAttributes。你应该可以在这里配置你的转换器。

【讨论】:

我会在这周晚些时候试一试。我不认为我可以直接通过媒体类型传递参数......如果它工作它很棒...... 您能否提供更多信息,说明您尝试了什么以及失败的错误代码是什么? 没有任何错误代码,系统只是忽略了新参数。这是一个有效的命令: spMediaType->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Base);虽然这什么都不做: spMediaType->SetUINT32(CODECAPI_AVEncCommonQualityVsSpeed, 0);我在同一个地方都试过了,任何以 CODECAPI 开头的东西都会在正常的媒体类型值工作时被忽略。 我的回答暗示使用媒体类型。顺便说一句,您需要在转换器上设置的任何内容都可以通过媒体类型完成。我还是不明白你到底不能设置什么? msdn.microsoft.com/en-us/library/windows/desktop/… 按照本文档所述,它是兼容的。我尝试了很多,它们都不起作用。我需要它们的原因是能够将编码模式从 VBR 更改为基于质量。如果我没有从 ICodecAPI 派生的任何类首先运行它,我应该如何运行该 ICodecAPI::IsSupported ?这就是我首先要达到的目标...*facepalm* 我知道如何在 Metro/Modern 之外执行此操作,问题是如何在 Windows 8+ 的 Modern 界面中执行此操作。【参考方案2】:

嘿, 我确实收到了我们建筑师的回复。他确认当前的含义是“按设计”。团队意识到了限制,但我不确定他们是否能够考虑更改设计。 我希望这有帮助, 詹姆斯

https://social.msdn.microsoft.com/Forums/windowsapps/en-US/74f02476-05aa-4520-8ee6-1b794321173e/how-to-access-icodec-property?forum=winappswithhtml5

我自己找到了解决方案。它不存在从 WinRT Metro 访问 ICodecAPI 的方法。这是设计使然,微软认为不会很快改变它。可惜了……:(

【讨论】:

以上是关于IMFMediaSink,如何设置编码器属性?的主要内容,如果未能解决你的问题,请参考以下文章

网页如何转换编码

IDEA的属性文件 (.properties )设置Unicode编码

通过 ICodecAPI 为 H.264 IMFSinkWriter 编码器设置属性

js读取文件时如何设置编码

通过java代码如何把改变xml文件的字符编码格式

HTML中怎么设置字符编码