算能科技
直播中

刘杰

8年用户 1390经验值
私信 关注
[问答]

SE5 ffmpeg例程内存不释放的原因?

环境:

SE5 BM1684
SophonSDK version: v23.09 LTS-SP4
sophon-soc-libsophon : 0.5.1
sophon-soc-libsophon-dev : 0.5.1
sophon-mw-soc-sophon-ffmpeg : 0.12.0
sophon-mw-soc-sophon-opencv : 0.12.0
BL2 v2.8(release):b3e005d Built : 10:53:36, Dec 27 2024
BL31 v2.8(release):b3e005d Built : 10:53:36, Dec 27 2024
U-Boot 2022.10 b3e005d (Dec 27 2024 - 10:53:31 +0800) Sophon BM1684
KernelVersion : Linux bm1684 5.4.217-bm1684-g01adf91564c4 #1 SMP Fri Dec 27 10:53:44 CST 2024 aarch64 aarch64 aarch64 GNU/Linux
HWVersion: 0x11
MCUVersion: 0x35



步骤:


1. 例程改造:

对sophon-mw_0.7.1_x86_64.tar.gz 下的解码例程test_ff_video_decode.cpp做了下简单的改造,使用循环,用于模拟反复拉取视频流的场景。
/sophon-mw_0.7.1_x86_64/opt/sophon/sophon-sample_0.7.1/samples/ff_video_decode/test_ff_video_decode.cpp
2. 主要修改的代码块:在285行调用读取文件的一个函数,读取文件类型测试视频文件也是一样的情况。并在286行改造循环拉流。



问题:


测试发现,在循环开始前先从文件读取约29M文件后(大于34M后释放一部分),循环(拉取一段时间后,停止,再拉取)拉取视频流时,会出现内存上升问题。
测试场景:解码6路4K路和4路2K H264视频流测试:
不调用readDataFromFile函数时:每轮循环结束时,系统内存会释放部分,最终在360M左右。
调用readDataFromeFile函数时,每轮循环结束时,系统内存不释放,下一次会继续增长。
      

回帖(1)

刘超

2025-4-25 18:26:59

在SE5 BM1684平台上运行ffmpeg例程时出现内存不释放的问题,可能由以下原因导致:




1. FFmpeg资源未正确释放


原因分析:

FFmpeg的API要求显式释放分配的资源(如AVFrameAVPacketAVCodecContext等),遗漏释放步骤会导致内存泄漏。


解决方案:  



  • 检查释放流程,确保以下函数被正确调用:
    av_frame_free(&frame);          // 释放AVFrame
    av_packet_free(&packet);        // 释放AVPacket
    avcodec_free_context(&codec_ctx); // 释放AVCodecContext
    avformat_close_input(&fmt_ctx); // 关闭AVFormatContext

  • 全局资源清理:在程序退出前调用:
    avformat_network_deinit();      // 清理网络相关资源




2. Sophon SDK硬件加速组件的资源泄漏


原因分析:

BM1684的硬件解码/编码器可能分配了显存或硬件资源,若未调用SDK专用接口释放,会导致内存泄漏。


解决方案:  



  • 查阅Sophon SDK文档,确认是否需要调用额外接口(如bm_free_device_mem)。

  • 示例代码(参考SDK示例):
    bm_handle_t handle;
    bm_dev_request(&handle, 0);     // 初始化设备句柄
    // ...使用硬件解码...
    bm_dev_free(handle);            // 显式释放设备资源




3. Sophon-FFmpeg插件自身缺陷


原因分析:

sophon-mw-soc-sophon-ffmpeg 0.12.0可能存在已知的内存管理漏洞。


解决方案:  



  • 升级SDK:确认是否最新版本已修复该问题(如升级至v23.09 LTS-SP4后续版本)。

  • 提交Issue:通过Sophon社区反馈问题。




4. 异步处理或多线程问题


原因分析:

多线程或异步解码时,若未正确同步资源释放,可能导致资源残留。


解决方案:  



  • 检查线程退出逻辑,确保所有子线程完成任务后再释放资源。

  • 使用引用计数:对共享资源(如AVFrame)通过av_frame_ref/av_frame_unref管理。




5. 工具验证与调试


步骤:  



  1. 简化复现代码:编写最小示例,仅包含解码/编码流程,排除无关逻辑。

  2. 内存检测工具

    • 使用valgrind --leak-check=full(需交叉编译支持)。

    • Sophon SDK内置工具(如bmmon)监控显存使用。


  3. 关闭硬件加速:通过av_dict_set(&opts, "hwaccel", "none", 0)切换为软解码,确认问题是否消失。




总结步骤



  1. 检查代码释放逻辑,确保所有FFmpeg资源正确释放。

  2. 验证硬件资源管理,调用SDK专用接口释放显存。

  3. 升级或回退SDK版本,排除已知缺陷。

  4. 使用工具定位泄漏点,缩小问题范围。

  5. 联系技术支持:若问题仍未解决,提供复现代码和环境详情至Sophon支持团队




通过上述步骤,可系统性地定位并解决内存泄漏问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分