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::BeginWriting
从 IMFStreamSink
获取事件生成器。
在这种情况下,您不应该调用 IMFMediaEventGenerator
方法。
通过使用 Sink Writer API,您将媒体基础原语 (SAR) 的管理和独占控制委托给 Sink Writer 实例。它是事件的订阅者,并且只能有一个。
即如果要自己处理MEStreamSinkRequestSample
,则不能使用Sink WriterAPI。
MSDN论坛上也有类似的问题,例如
我正在尝试使用 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::BeginWriting
从 IMFStreamSink
获取事件生成器。
在这种情况下,您不应该调用 IMFMediaEventGenerator
方法。
通过使用 Sink Writer API,您将媒体基础原语 (SAR) 的管理和独占控制委托给 Sink Writer 实例。它是事件的订阅者,并且只能有一个。
即如果要自己处理MEStreamSinkRequestSample
,则不能使用Sink WriterAPI。
MSDN论坛上也有类似的问题,例如