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

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

1 ответ

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

Другие вопросы по тегам