gpt4 book ai didi

c# - ffmpeg 可能存在 sws_scale 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 23:13:07 27 4
gpt4 key购买 nike

我正在解码相机编解码器,然后总是将其编码为 H264更具体地说qsv如果支持。目前有2个摄像头要测试。一种是H264编码,一个是rawvideo .问题来自 rawvideo .像素格式为BGR24并缩放到 NV12
我将简化代码,因为它与任何其他示例一样。

avcodec_send_packet()
// while
avcodec_receive_frame()

// if frame is not EAGAIN convert BGR24 to NV12
if (_pConvertContext == null)
{
_pConvertContext = CreateContext(sourcePixFmt, targePixFmt);
}

if (_convertedFrameBufferPtr == IntPtr.Zero)
{
int buffSize = ffmpeg.av_image_get_buffer_size(targePixFmt, sourceFrame->width, sourceFrame->height, 1);
_convertedFrameBufferPtr = Marshal.AllocHGlobal(buffSize);
ffmpeg.av_image_fill_arrays(ref _dstData, ref _dstLinesize, (byte*)_convertedFrameBufferPtr, targePixFmt, sourceFrame->width, sourceFrame->height, 1);
}

return ScaleImage(_pConvertContext, sourceFrame, targePixFmt, _dstData, _dstLinesize);

比例图像 方法
ffmpeg.sws_scale(ctx, sourceFrame->data, sourceFrame->linesize, 0, sourceFrame->height, dstData, dstLinesize);

AVFrame* f = ffmpeg.av_frame_alloc();

var data = new byte_ptrArray8();
data.UpdateFrom(dstData);
var linesize = new int_array8();
linesize.UpdateFrom(dstLinesize);

f->data = data;
f->linesize = linesize;
f->width = sourceFrame->width;
f->height = sourceFrame->height;
f->format = (int)targePixelFormat;

return f;

之后将缩放帧发送到编码器并接收它并写入文件。之后我调用 av_frame_free(&frame)在从方法返回的帧上。但是当我设置断点时,即使在调用 av_frame_alloc() 之后,我也可以看到帧的地址是相同的。并且每次都打扫。我认为这就是内存泄漏的原因。如果我这样做 深度克隆 f在返回之前一切都很好。为什么会发生这种情况,而相同的逻辑适用于其他相机?

最佳答案

好吧,经过 3 天的时间试图弄清楚为什么它只发生在某些相机上,我已经使用 进行了内存转储。调试诊断 2 带有内存泄漏跟踪器。事实证明 分配了大量内存_aligned_offset_malloc 如下图所示。我使用的是 ffmpeg 4.2.2,降级到 4.0.2 为我解决了这个问题。现在没有内存泄漏。我正在使用 32位版本。

enter image description here

关于c# - ffmpeg 可能存在 sws_scale 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60458699/

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