使用SinkWriter对视频进行编码时,请更改h.264质量

时间:2012-11-08 10:42:14

标签: windows-7 encoding h.264 ms-media-foundation

我正在使用Microsoft Media Foundation对H.264视频文件进行编码。

我正在使用SinkWriter来创建视频文件。输入是一个缓冲区(MFVideoFormat_RGB32),我在其中绘制帧,输出为MFVideoFormat_H264

编码有效,它会创建一个包含框架的视频文件。但我想设置该视频文件的质量。更具体地说,我想在H.264编码器上设置CODECAPI_AVEncCommonQuality属性。

为了获得H.264编码器的句柄,我在SinkWriter上调用GetServiceForStream。然后我设置CODECAPI_AVEncCommonQuality属性。

问题是我的财产变更被忽略了。如documentation中所述:

  

要在Windows 7中设置此参数,请在调用IMFTransform :: SetOutputType之前设置该属性。设置输出类型后,编码器会忽略更改。

问题是我没有手动创建H.264编码器。我在SinkWriter上设置输入和输出类型,SinkWriter自动创建H.264编码器。一旦创建了编码器,它就会调用IMFTransform::SetOutputType方法,而我无法再更改CODECAPI_AVEncCommonQuality属性。该文档还说明在Windows 8中不会忽略属性更改,但我需要在Windows 7上运行它。

在Windows 7上使用SinkWriter时,您知道如何更改编码文件的质量吗?

在MSDN论坛上PS:Someone asked the same question,他似乎没有得到答案。

1 个答案:

答案 0 :(得分:2)

正如文档所说,在设置输出类型后,您无法更改CODECAPI_AVEncCommonQuality属性,并且SinkWriter会设置输出类型,然后才能获得编码器。

为了绕过这个问题,我设法创建了一个类工厂并在Media Foundation中注册它,以便SinkWriter使用它来创建一个新的编码器。在我的班级工厂中,我创建了一个新的H264编码器,并在将它传递给SinkWriter之前设置了我想要的任何属性。

我已经详细介绍了在MSDN论坛上创建此类工厂所采取的步骤:http://social.msdn.microsoft.com/Forums/en-US/mediafoundationdevelopment/thread/6da521e9-7bb3-4b79-a2b6-b31509224638

这是我在Windows 7上解决问题的唯一方法。