将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter

时间:2018-06-27 01:28:45

标签: c++ ms-media-foundation wmv

当前,我正在使用以下文章中的方法(转码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设置此标志之外,我已经有一个有效的代码,如果可能的话,保持当前状态。

如果有人有任何线索/解决方案/解决方法,请告诉我。

1 个答案:

答案 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属性