我正在尝试使用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::BeginWriting
从IMFStreamSink
获取事件生成器。
答案 0 :(得分:0)
在这种情况下,您不应该调用sudo
方法。
通过使用Sink Writer API,您可以将Media Foundation原语(SAR)的管理和独占控制委派给Sink Writer实例。它是事件的订阅者,只能有一个。
也就是说,如果您想自己处理IMFMediaEventGenerator
,则不能使用Sink Writer API。
在MSDN论坛上也有类似的问题,例如