Я пытаюсь использовать 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
.