我正在使用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,他似乎没有得到答案。答案 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上解决问题的唯一方法。