当前,我正在使用以下文章中的方法(转码API)使用Windows Media Foundation SDK创建WMV文件:https://docs.microsoft.com/en-us/windows/desktop/medfound/tutorial--using-the-sink-writer-to-encode-video
我注意到的是,如果我未设置MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE,则在指定比特率下编码WMV文件时,输出WMV文件可能已损坏(在播放过程中显示为可怕的伪像)。
根据以下文章,该标记需要设置为IMFASFContentInfo: https://docs.microsoft.com/en-us/windows/desktop/medfound/mfpkey-asfmediasink-autoadjust-bitrate-property
所以我尝试了以下方法:
IMFSinkWriter* pSinkWriter = NULL; //initialize sink writer with MFCreateSinkWriterFromURL ... IMFASFContentInfo* pContentInfo = NULL; pSinkWriter->GetServiceForStream((DWORD)MF_SINK_WRITER_MEDIASINK, GUID_NULL, __uuidof(IMFASFContentInfo), (LPVOID*)&pContentInfo); IPropertyStore* pPropStore = NULL; pContentInfo->GetEncodingConfigurationPropertyStore(0, &pPropStore); PROPVARIANT var; PropVariantInit(&var); var.vt = VT_BOOL; var.boolVal = VARIANT_TRUE; pPropStore->SetValue(MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, var); PropVariantClear(&var); //Add Video stream and BeginWriting, then start passing samples ...
但是,这些设置似乎并未应用到多路复用器,而且我仍然看到明显的流损坏伪像。
我猜想是因为MFCreateSinkWriterFromURL将在内部创建MediaSink和基础IMFASFMultiplexer,但是在创建IMFASFMultiplexer时需要设置MFASF_MULTIPLEXER_AUTOADJUST_BITRATE,因此在创建SinkWriter之后设置标志为时已晚。
如果我不使用Transcode API,而是自己创建IMFASFWriter,我想我可以在手动创建IMFASFWriter的过程中手动设置MFASF_MULTIPLEXER_AUTOADJUST_BITRATE,但是由于除了使用Transcode API设置此标志之外,我已经有一个有效的代码,如果可能的话,保持当前状态。
如果有人有任何线索/解决方案/解决方法,请告诉我。
答案 0 :(得分:0)
您应该能够使用ASF File Sink直接从Sink Writer查询到GetServiceForStream的IPropertyStore,并指定MF_SINK_WRITER_MEDIASINK像这样:
pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK, GUID_NULL, IID_PPV_ARGS(&pPropertyStore));
其中pPropertyStore指向IPropertyStore。
之后,您应按照here
的说明设置MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE属性