gpt4 book ai didi

c++ - 使用 SinkWriter(媒体基础)c++ 时发生内存泄漏

转载 作者:行者123 更新时间:2023-11-28 00:31:04 26 4
gpt4 key购买 nike

我一直在尝试编写一个小应用程序来为您创建视频,您可以发送自己的图像。为了对视频进行编码,我使用了媒体基础库。

一切正常。我能够创建一个非常短的视频,但是一旦我尝试创建一个大视频,我的应用程序就会开始占用大量内存并最终因内存不足而崩溃。内存在 1.5 GB 的范围内。

我做了一些调试,发现这个方法会泄漏内存。在尝试大量删除和释放内存组合后,我无法找出问题所在。你能帮我解决一下吗?这是添加边框的方法。

 HRESULT VideoCompressor::addFrame(BYTE* bitmapBytes)
{
const long imageBufferWidth = VIDEO_WIDTH * 4;
const DWORD bufferLength = imageBufferWidth * VIDEO_HEIGHT;
IMFSample *sample = NULL;
BYTE *dataBuffer = NULL;
IMFMediaBuffer *sampleBuffer = NULL;
DWORD maxLength;
//std::shared_ptr<BYTE> *dataBuffer = NULL;

if (!SUCCEEDED(MFCreateMemoryBuffer(bufferLength, &sampleBuffer)))
return E_FAIL;

sampleBuffer->GetMaxLength(&maxLength);
if (!SUCCEEDED(sampleBuffer->Lock(&dataBuffer, NULL, NULL)))
return E_FAIL;

if (MFCopyImage(dataBuffer, imageBufferWidth,
(BYTE *) bitmapBytes, imageBufferWidth,
imageBufferWidth, VIDEO_HEIGHT)
!= S_OK)
return E_FAIL;

sampleBuffer->Unlock();
sampleBuffer->SetCurrentLength(bufferLength);

if (!SUCCEEDED(MFCreateSample(&sample)))
return E_FAIL;

if (!(SUCCEEDED(sample->AddBuffer(sampleBuffer))))
return E_FAIL;


if(!(SUCCEEDED(sample->SetSampleTime(startTime))))
return E_FAIL;

if(!(SUCCEEDED(sample->SetSampleDuration(durationTime))))
return E_FAIL;

if(!(SUCCEEDED(writer->WriteSample(/*streamIndex*/ 0, sample))))
return E_FAIL;

startTime = startTime + durationTime;

//sample->Release();
//sampleBuffer->Release();

SafeRelease(&sample);
SafeRelease(&sampleBuffer);

return S_OK;
}

SafeRelease 的实现是

template <class T> void SafeRelease(T **_object)
{
if (*_object)
{
(*_object)->Release();
*_object = NULL;
}
}

我怀疑它与 BYTE *dataBuffer 有关。我尝试使用 delete [] 关键字删除它,但没有任何用处。

最佳答案

由@jeff 回答

如果你的代码执行了整个函数并返回 S_OK,那么我看不到它,我不相信它在这个函数中。但是,您应该解决您有多个退出点的事实,而无需调用 SafeRelease(..)。

关于c++ - 使用 SinkWriter(媒体基础)c++ 时发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com