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

时间:2019-07-03 21:42:56

标签: c++ ms-media-foundation

我正在尝试使用IMFSinkWriter渲染音频样本(IMFSample),但是在调用IMFSinkWriter::BeginWriting方法时遇到了问题,因为它返回了代码:MF_E_MULTIPLE_SUBSCRIBERS。发生这种情况是因为我正在呼叫IMFStreamSink::BeginGetEvent(Callback, null)

我尝试调用方法(BeginWriting)而不先调用(BeginGetEvent),令人惊讶的是,该方法正常工作,并且我可以成功处理音频样本。

问题是创建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);

我为收集器创建IMFPresenetationClock:

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

这部分我配置了流接收器:

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

如果我在此处调用BeginGetEvent,则不会创建SinkWriter。如果在创建SinkWriter之后调用,我会成功,但是我不能再次使用BeginGetEvent,因为它将返回我:MF_E_MULTIPLE_SUBSCRIBERS。

我使用此代码创建了SinkWriter,创建过程很好,但是在第三行,如果我在IMFStreamSink中调用(BeginGetEvent),则会收到错误代码。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

通过使用Sink Writer API,您可以将Media Foundation原语(SAR)的管理和独占控制委派给Sink Writer实例。它是事件的订阅者,只能有一个。

也就是说,如果您想自己处理IMFMediaEventGenerator,则不能使用Sink Writer API。

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