将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter
Apply MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE to IMFSinkWriter
目前,我正在使用以下文章中的方法(转码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 属性
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 使用 std::应用于 std::bind
- 如何将Affine3d应用于Vector3d
- 运算符 += 应用于 std::valarray<int*>
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 在运行时将更改的环境变量应用于 QApplication
- Strcmp 类行为应用于C++中的对象列表
- 如何将 ItemDelegate 设置为仅应用于 QTreeView 中的父列
- 什么是应用于C 和CMAKE的定义
- 将对象方法从向量应用于C 的第二个向量中的对象
- STL:将功能应用于Adchacent_difference的结果,而无需额外的容器
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 如何将垂直纹理应用于QT Surface3D
- 如何将[[nodiscard]]属性应用于lambda
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译
- 将 QPropertyAnimation 应用于 QRect