4

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

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

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

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

问题是我的属性更改被忽略了。如文档中所述:

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

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

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

PS:有人在msdn论坛上问过同样的问题,他似乎没有得到答案。

4

2 回答 2

4

正如文档所说,设置输出类型后您无法更改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 上解决问题的唯一方法。

于 2012-11-09T21:50:17.253 回答
0

CODECAPI_AVEncCommonRateControlMode并且CODECAPI_AVEncCommonQuality可以使用 . 传递给 h.264 编码器IMFSinkWriter->SetInputMediaType(/* ... */,, IMFAttributes pEncodingParameters)。我怀疑其他CODECAPI_值也会起作用。

CComPtr<IMFAttributes> pEncAttrs;
ATLENSURE_SUCCEEDED(MFCreateAttributes(&pEncAttrs, 1));
ATLENSURE_SUCCEEDED(pEncAttrs->SetUINT32(CODECAPI_AVEncCommonRateControlMode, eAVEncCommonRateControlMode_Quality));
ATLENSURE_SUCCEEDED(pEncAttrs->SetUINT32(CODECAPI_AVEncCommonQuality, 40));
ATLENSURE_SUCCEEDED(writer->SetInputMediaType(sink_stream, mtSource, pEncAttrs));
//                                                                   ^^^^^^^^^
于 2022-03-02T00:34:38.627 回答