Media Foundation IMFSourceReader正在消耗过多的内存

问题描述 投票:0回答:1

我不知道这是否不是源阅读器的基本行为,但是即使我发布了每个样本,它也会不断消耗内存,直到读取的文件大小为止。

来源读者:

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,但我想我可以解决这个问题)

c++ ms-media-foundation
1个回答
0
投票

有点晚,但是仍然是一个问题(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

© www.soinside.com 2019 - 2024. All rights reserved.