Применить MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE к IMFSinkWriter

В настоящее время я создаю файл 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, если возможно, я хочу сохранить текущий путь ,

Если у кого-то есть какие-либо подсказки / решения / обходные пути, пожалуйста, дайте мне знать.

0

Решение

Вы должны быть в состоянии запросить 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, как описано Вот

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]