IMFSinkWriter :: BeginWriting не инициализируется, поскольку IMFMediaEventGenerator имеет ожидающие события - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать IMFSinkWriter для рендеринга аудиосэмплов (IMFSample), но у меня возникают проблемы при вызове метода IMFSinkWriter::BeginWriting, поскольку он возвращает код: MF_E_MULTIPLE_SUBSCRIBERS. Это происходит потому, что я звоню IMFStreamSink::BeginGetEvent(Callback, null).

Я попытался вызвать метод (BeginWriting) без первого вызова (BeginGetEvent), удивительно, метод работает правильно, и я могу успешно обработать аудиосэмплы.

Проблема в том, что я не могу звонить (BeginGetEvent) после создания SinkWriter.

Код, который вы используете для создания SAR (Stream Audio Render):

HRESULT Hr = E_FAIL;
IMFMediaSink *pAudioRender = NULL;
IMFStreamSink *pStreamSink = NULL;
IMFMediaTypeHandler *pMediaHandler = NULL;
IMFPresentationClock *pPresentClock = NULL;
IMFPresentationTimeSource* pTimeSource = NULL;
IMFSinkWriter *pSinkWriter = NULL;

Hr = MFCreateAudioRenderer(NULL, &pAudioRender);

Я создаю IMFPresenetationClock для сборщика:

Hr = MFCreateSystemTimeSource(&pTimeSource);
Hr = MFCreatePresentationClock(&pPresentClock);
pPresentClock ->SetTimeSource(pTimeSource);
IMFMediaSink->SetPresentationClock(pPresentClock );

В этой части я настраиваю Stream Sink:

pAudioRender->GetStreamSinkByIndex(0, &pStreamSink);
pStreamSink->GetMediaTypeHandler(&pMediaHandler);
pMediaHandler->SetCurrentMediaType(DecodePCM);

Если я вызову здесь BeginGetEvent, SinkWriter не будет создан. Если я позвоню после создания SinkWriter, я получу успех, но я не смогу снова использовать BeginGetEvent, потому что он мне вернет: MF_E_MULTIPLE_SUBSCRIBERS.

Я использовал этот код для создания SinkWriter, создание происходит хорошо, но в третьей строке я получаю код ошибки, если я вызываю (BeginGetEvent) в IMFStreamSink.

Hr = MFCreateSinkWriterFromMediaSink(pAudioRender, NULL, &pSinkWriter);
pSinkWriter->SetInputMediaType(DecodePCM);
pSinkWriter->BeginWriting(); //HR -> MF_E_MULTIPLE_SUBSCRIBERS

Я хочу использовать IMFMediaEventGenerator интерфейса IMFStreamSink для получения событий (MEStreamSinkRequestSample) для вызова метода IMFSourceReader::ReadSample.

Чтобы получить эти события, мне нужно понять, почему IMFSinkWriter::BeginWriting получает генератор событий от IMFStreamSink.

1 Ответ

0 голосов
/ 04 июля 2019

В этом случае нельзя вызывать методы IMFMediaEventGenerator.

Используя API Sink Writer, вы делегируете управление и исключительный контроль примитива Media Foundation (SAR) экземпляру Sink Writer.Это подписчик на события, и может быть только один.

То есть, если вы хотите обработать MEStreamSinkRequestSample самостоятельно, вы не можете использовать Sink Writer API.

Есть похожие вопросына форумах MSDN, например,

...