IMFSinkWriter::BeginWriting 未初始化,因为 IMFMediaEventGenerator 有未决事件

IMFSinkWriter::BeginWriting does not initialize because the IMFMediaEventGenerator has pending events

我正在尝试使用 IMFSinkWriter 来呈现音频样本 (IMFSample),但是在调用 IMFSinkWriter::BeginWriting 方法时遇到问题,因为它 return 的代码是:MF_E_MULTIPLE_SUBSCRIBERS。发生这种情况是因为我正在调用 IMFStreamSink::BeginGetEvent(Callback, null).

我尝试在没有先调用 (BeginGetEvent) 的情况下调用方法 (BeginWriting),令人惊讶的是,该方法工作正常,我可以成功处理音频样本。

问题是在创建 SinkWriter 后我无法调用 (BeginGetEvent)。

用于创建 SAR(流音频渲染)的代码:

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);

我为 Collector 创建了 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,因为它会 return 我:MF_E_MULTIPLE_SUBSCRIBERS.

我使用这段代码创建了 SinkWriter,创建过程很顺利,但是在第三行,如果我在 IMFStreamSink 中调用 (BeginGetEvent),我会得到一个错误代码。

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

我想用IMFStreamSink接口的IMFMediaEventGenerator接收事件(MEStreamSinkRequestSample)来调用IMFSourceReader::ReadSample方法

为了接收这些事件,我需要了解为什么 IMFSinkWriter::BeginWritingIMFStreamSink 获取事件生成器。

在这种情况下,您不应该调用 IMFMediaEventGenerator 方法。

通过使用 Sink Writer API,您将媒体基础原语 (SAR) 的管理和独占控制委托给 Sink Writer 实例。它是事件的订阅者,并且只能有一个。

即如果要自己处理MEStreamSinkRequestSample,则不能使用Sink WriterAPI。

MSDN论坛上也有类似的问题,例如