Windows Media Foundation MFCreateSourceReaderFromURL 函数中的内存泄

Memory leak in Windows Media Foundation MFCreateSourceReaderFromURL function. Any alternative functions?

本文关键字:内存 函数 Media Foundation MFCreateSourceReaderFromURL Windows      更新时间:2023-10-16

在Windows 10上,Windows Media Foundation函数(MFCreateSourceReaderFromURL(中存在错误。每次使用后都会导致内存泄漏。 是否有任何替代功能可以在没有内存泄漏的情况下使用?Windows Media 基础似乎充满了错误,那么我该如何避免它?

证明内存泄漏,运行以下代码 (x86( 并每秒观察到巨大的内存泄漏:

#include <mfapi.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#pragma comment (lib, "Mfreadwrite.lib")
#pragma comment (lib, "Mfplat.lib")
#pragma comment (lib, "mfuuid.lib")
int main()
{
while (true)
{
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
{
return 1;
}
if (FAILED(MFStartup(MF_VERSION)))
{
return 1;
}
IMFSourceReader* sourceReader = nullptr;
if (FAILED(MFCreateSourceReaderFromURL(L"C:/any_audio_file.wav", nullptr, &sourceReader)))
{
return 1;
}
sourceReader->Release();
MFShutdown();
CoUninitialize();
}
return 0;
}

题外话:太沮丧了。我使用 DirectShow 只是为了发现 RenderFile 网络音频流中存在错误。几天后更改为替代(Windows Media Foundation(,发现那里有内存泄漏。Microsoft。

编辑:仅当文件名末尾没有 *.mp3(并且内容为 mp3(时,才会发生内存泄漏。或者,如果文件名末尾没有 *.wav(并且内容是波浪( 例: 有mp3文件"音乐.mp3"。将名称更改为"音乐"或"音乐.wav"。将发生内存泄漏。

根据代码,您在一个线程中调用了 APIMFSshutdownCoUninitialize多个时间。每个线程只能调用一次这两个 API。

下面是修改后的代码,它与更真实的使用场景相匹配。您可以将此代码构建为发布(而不是调试(并运行它,您将看到在 60 秒内只有少量内存增加 (150 kb(。小幅增加是由于 DLL 缓存的大小增加(预期(和正在创建的工作队列数增加(预期(。因此,目前我没有看到任何内存泄漏的迹象。

if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) // <- Should only be called once per thread
{
return 1;
}
if (FAILED(MFStartup(MF_VERSION))) // <- Should only be called once per thread
{
return 1;
}
while (true)
{
IMFSourceReader* sourceReader = nullptr;
OutputDebugString(L"MFCreateSourceReaderFromURL rn");
if (FAILED(MFCreateSourceReaderFromURL(L"maybe-next-time", nullptr, &sourceReader)))
{
return 1;
}
sourceReader->Release();
Sleep(100); // <- Make sure to yield the processor before continuing with the loop 
}
MFShutdown(); // <- Should only be called once per thread
CoUninitialize(); // <- Should only be called once per thread

如果你们端的内存泄漏不是由此引起的,你介意分享一个可以代表真实单词用法的代码示例吗?

这是Windows Media Foundation Microsoft中的一个错误。评论中也证实了这一点。

溶液:

不要在专业软件中使用Microsoft Windows Media Foundation,因为它充满了隐藏的错误和内存泄漏。