В настоящее время я создаю файл WMV с помощью Windows Media Foundation SDK, используя метод (Transcode API) в следующей статье: 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; // инициализируем модуль записи приемника с помощью 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.vt = VT_BOOL; var.boolVal = VARIANT_TRUE; pPropStore-> SetValue (MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, var); PropVariantClear (вар); // Добавить видеопоток и BeginWriting, затем начать передавать образцы ...
Но настройки, кажется, не применяются к мультиплексору, и я все еще вижу очевидные артефакты поврежденного потока.
Я предполагаю, что поскольку MFCreateSinkWriterFromURL создаст MediaSink и базовый IMFASFMultiplexer внутри, однако MFASF_MULTIPLEXER_AUTOADJUST_BITRATE должен быть установлен во время создания IMFASFMultiplexer, поэтому устанавливать флаг после создания SinkWriter слишком поздно.
Если я не использую Transcode API и не создаю IMFASFWriter самостоятельно, я думаю, что я могу установить MFASF_MULTIPLEXER_AUTOADJUST_BITRATE при создании IMFASFWriter вручную, но, поскольку у меня уже есть рабочий код, кроме настроек, этот флаг с помощью Transcode API, если возможно, я хочу сохранить текущий путь ,
Если у кого-то есть какие-либо подсказки / решения / обходные пути, пожалуйста, дайте мне знать.
Вы должны быть в состоянии запросить IPropertyStore или ASF File Sink из Sink Writer напрямую, используя GetServiceForStream и указав MF_SINK_WRITER_MEDIASINK следующим образом:
pSinkWriter->GetServiceForStream(MF_SINK_WRITER_MEDIASINK, GUID_NULL, IID_PPV_ARGS(&pPropertyStore));
где pPropertyStore указывает на IPropertyStore.
После этого вы должны установить свойство MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE, как описано Вот
Других решений пока нет …