将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter

Apply MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE to IMFSinkWriter

本文关键字:应用于 IMFSinkWriter BITRATE ASFMEDIASINK MFPKEY AUTOADJUST      更新时间:2023-10-16

目前,我正在使用以下文章中的方法(转码API(使用Windows Media Foundation SDK创建WMV文件:https://learn.microsoft.com/en-us/windows/desktop/medfound/tutorial--using-the-sink-writer-to-encode-video

我注意到的是,如果我不设置MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE,当以指定的比特率编码WMV文件时,输出WMV文件可能会损坏(在播放过程中显示为可怕的伪影(。

根据以下文章,该标志需要设置为IMFASFContentInfo: https://learn.microsoft.com/en-us/windows/desktop/medfound/mfpkey-asfmediasink-autoadjust-bitrate-property

所以我尝试了以下方法:

IMFSinkWriter* pSinkWriter = NULL; 使用 MFCreateSinkWriterFromURL 初始化接收器编写器 ... IMFASFContentInfo* pContentInfo = NULL; pSinkWriter->GetServiceForStream((DWORD(MF_SINK_WRITER_MEDIASINK, GUID_NULL, __uuidof(IMFASFContentInfo(, (LPVOID*(&pContentInfo(; IPropertyStore* pPropStore = NULL; pContentInfo->GetEncodingConfigurationPropertyStore(0, &pPropStore(; 丙变异变型; PropVariantInit(&var(; var.vt = VT_BOOL; var.boolVal = VARIANT_TRUE; pPropStore->SetValue(MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, var(; PropVariantClear(&var(; 添加视频流和开始写入,然后开始传递样本 ...

但是,这些设置似乎没有应用于muxer,我仍然看到明显的流损坏的伪影。

我猜是因为MFCreateSinkWriterFromURL将在内部创建MediaSink和底层IMFASFMultiplexer,但是在创建IMFASFMultiplexer期间需要设置MFASF_MULTIPLEXER_AUTOADJUST_BITRATE,所以在创建SinkWriter后设置标志为时已晚。

如果我不使用转码 API,而是自己创建 IMFASFWriter,我想我可以在手动创建 IMFASFWriter 期间设置MFASF_MULTIPLEXER_AUTOADJUST_BITRATE,但由于除了使用转码 API 设置此标志之外,我已经有一个工作代码,如果可能的话,我想保持当前的方式。

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

你应该能够使用 GetServiceForStream 直接从接收器编写器查询 的 IPropertyStore 到 ASF 文件接收器,并指定如下所示MF_SINK_WRITER_MEDIASINK:

pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK, GUID_NULL, IID_PPV_ARGS(&pPropertyStore));

其中 pPropertyStore 指向 IPropertyStore。

之后,您应该按照此处的说明设置 MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE 属性