问题描述
在使用基于MediaFoundation框架的转码时,会遇到当使用AMD的AVC硬件编码器时,输出的结果会有很严重的马赛克和画面闪烁。
解决方法
在配置AMD的AVC硬件编码器属性时,需要额外设置最大宏块处理速度(MF_VIDEO_MAX_MB_PER_SEC)这个参数。这个参数可以通过查询编码器的参数得到。
怎么实现
- 创建SinkWriter;
- 在IMFSinkWriter::SetInputMediaType调用之后,调用 IMFSinkWriter::GetServiceForStream(stream_idx, GUID_NULL, IID_PPV_ARGS(&mft)) 得到编码器的MFT;
- 通过IMFTransform::GetAttributes接口得到属性组,然后查询MF_VIDEO_MAX_MB_PER_SEC参数的值;
- 创建新的创建SinkWriter;
- 在IMFSinkWriter::SetInputMediaType调用时,将MF_VIDEO_MAX_MB_PER_SEC参数的值设置到最后一个参数里。
解析
之所以要创建两次SinkWriter,是因为发现在调用IMFSinkWriter::SetInputMediaType之后就无法对同一个SinkWriter再次设置编码器参数,所以第一个SinkWriter的作用只是为了去取MF_VIDEO_MAX_MB_PER_SEC参数的值。