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

标签 c++ memory ms-media-foundation

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

一切正常。我能够创建一个非常短的视频,但是一旦我尝试创建一个大视频,我的应用程序就会开始占用大量内存并最终因内存不足而崩溃。内存在 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/

相关文章:

c++ - 如何在 Solaris 上修复 SIGBUS

windows - 神秘的 MFSourceFilter

c# - 在windows 8.1(通用应用程序)中解码mp3

c++ - runif 的性能

linux - 删除缓存不起作用

c++ - 在 C++ 中读取二进制文件时丢失数据

c++ - 从文件中读取未知长度的 int 数组

UWP AAC 在媒体基础库中编码,类未注册

c++ - 无法让 ifstream 在 XCode 中工作

C++内存分配和链表实现