我一直在尝试编写一个小应用程序,为您创建视频,您可以发送自己的图像。为了对视频进行编码,我使用了媒体基础库。
一切正常。我能够创建一个非常短的视频,但是一旦我尝试创建一个大视频,我的应用程序就会开始占用大量内存并最终因为内存和崩溃而挨饿。内存范围为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 []关键字将其删除,但它没有任何用处。
答案 0 :(得分:3)
@jeff回答
如果你的代码是通过整个函数执行并返回S_OK,那么我看不到它,我不相信它在这个函数中。但是你应该修复一个事实,即你有多个退出点而不调用SafeRelease(..)。