我不知道这是否不是源阅读器的基本行为,但是即使我发布了每个样本,它也会不断消耗内存,直到读取的文件大小为止。
来源读者:
hr = pAttributes->SetUINT32(MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING, TRUE);
hr = MFCreateSourceReaderFromURL(wszFileName, pAttributes, &m_pReader);
代码:
hr = m_pReader->ReadSample(
(DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM,
0,
NULL,
&dwFlagss,
&time,
&pSampleTmp
);
SafeRelease(&pSampleTmp);
是否要设置一些属性,或者对此我无能为力,必须使用MediaSession或MFPlayer?如果可以,您是否可以提出如何从中获取单个样本的建议? (最好使用DXVA,但我想我可以解决这个问题)
有点晚,但是仍然是一个问题(Windows 10 November 2019更新)。
在某些情况下从媒体文件中读取样本时,确实存在与IMFMEdiaSource :: ReadSample或IMFMediaSourceCallback :: OnReadSample(同步或异步状态)有关的内存泄漏。
此问题与延迟以及释放或增加mfreadwrite.dll中的内部读取缓冲区有关。MS Media Foundation团队确实让我知道他们正在调查此行为。当我收到他们的回复时,我会在这里告诉您原因。
现在修复。
在异步模式下,您必须实现criticalSection(通常)。在OnReadSample方法中,可以在释放IMFSample之前和离开关键部分之前实现MsgWaitForMultipleObjects。这将阻止泄漏,处理器过载和能耗。
在执行IMFSourceReader :: ReadSample之后立即进入同步模式(由于响应速度不佳,因此不建议使用,请实现方法MsgWaitForMultipleObjects(如果需要,请实现WaitForSingleObject)。
这是一个可行的临时解决方案,直到Microsoft修复此问题。前提是您先取消选择所有流,然后在初始化IMFSourceReader之后直接选择了想要的流。请参阅:Remarks about SetStreamSelection
此问题可以通过MF示例AudioClip或本文复制。 Tutorial Decoding Audio