文章目录

  • 前言
  • FFmpeg高级输出内存泄露
  • 内存泄露原因
  • 解决办法

前言

obs系列文章入口:obs-studio项目简介和架构

FFmpeg高级输出内存泄露

已解决
PR: obs-ffmpeg: Fix ffmpeg_output memory leak

obs高级输出的介绍: 【obs-studio开源项目从入门到放弃】obs 的高级输出 ffmpeg-output

最近长时间推流测试发现,obs的高级输出存在内存泄露。泄露速度不是很快,大约每分钟泄露1M多内存,12个小时泄露700多M。但是如果长时间录制或者使用FFmpeg高级输出推流,会因内存泄露导致崩溃。

内存泄露原因

obs-ffmpeg-output.c 在 receive_video()receive_audio() 都调用了av_packet_alloc() 来申请 AVPacket 内存空间,但是在process_packet() 使用完 AVpacket后,并没有调用 av_packet_free() 来释放内存,因此会产生内存泄露。

解决办法

修改源码 obs-ffmpeg-output.c av_interleaved_write_frame 使用完 packet后,调用 av_packet_free() 释放 packet的内存。

static int process_packet(struct ffmpeg_output *output)
{AVPacket *packet;bool new_packet = false;int ret;pthread_mutex_lock(&output->write_mutex);if (output->packets.num) {packet = output->packets.array[0];da_erase(output->packets, 0);new_packet = true;}pthread_mutex_unlock(&output->write_mutex);if (!new_packet)return 0;/*blog(LOG_DEBUG, "size = %d, flags = %lX, stream = %d, ""packets queued: %lu",packet.size, packet.flags,packet.stream_index, output->packets.num);*/if (stopping(output)) {uint64_t sys_ts = get_packet_sys_dts(output, packet);if (sys_ts >= output->stop_ts)return 0;}output->total_bytes += packet->size;ret = av_interleaved_write_frame(output->ff_data.output, packet);if (ret < 0) {//av_packet_free(&packet); //此处注释掉ffmpeg_log_error(LOG_WARNING, &output->ff_data,"process_packet: Error writing packet: %s",av_err2str(ret));return ret;}//=== 解决内存泄露:释放 packet 内存===av_packet_free(&packet);//===================================return 0;
}

av_packet_alloc 和 av_packet_free 源码

/*** Allocate an AVPacket and set its fields to default values.  The resulting* struct must be freed using av_packet_free().** @return An AVPacket filled with default values or NULL on failure.** @note this only allocates the AVPacket itself, not the data buffers. Those* must be allocated through other means such as av_new_packet.** @see av_new_packet*/
AVPacket *av_packet_alloc(void)
{AVPacket *pkt = av_malloc(sizeof(AVPacket));if (!pkt)return pkt;get_packet_defaults(pkt);return pkt;
}/*** Free the packet, if the packet is reference counted, it will be* unreferenced first.** @param pkt packet to be freed. The pointer will be set to NULL.* @note passing NULL is a no-op.*/
void av_packet_free(AVPacket **pkt)
{if (!pkt || !*pkt)return;av_packet_unref(*pkt);av_freep(pkt);
}

【obs-studio开源项目从入门到放弃】obs高级输出内存泄露相关推荐

  1. 【obs-studio开源项目从入门到放弃】obs 配置 srt推流

    文章目录 前言 srt协议简介 obs 配置srt推流 srt的配置示例 srs流媒体服务器配置srt服务 播放 srt 流 ffmpeg 推拉流 srt 总结 技术参考 前言 现在各大云厂商都支持上 ...

  2. 【obs-studio开源项目从入门到放弃】obs-studio项目简介和架构

    文章目录 前言 一.obs-studio项目简介 二.windows平台的编译步骤 三.obs的核心线程 obs视频渲染线程 obs视频编码线程 obs音频编码线程 rtmp发送线程 四.常用插件的介 ...

  3. 【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理

    文章目录 前言 获取鼠标位置 绘制选中框 裁剪源 拉伸源 移动源 总结 前言 obs-studio项目简介和架构:https://blog.csdn.net/qq_33844311/article/d ...

  4. 【obs-studio开源项目从入门到放弃】video_thread 视频编码线程理解

    文章目录 前言 1.视频编码线程的创建时机 video_output_open函数创建视频编码线程 2.视频编码线程的工作内容 video_output_cur_frame 线程真正的工作函数 详细解 ...

  5. 你用的那些开源项目可能已经被放弃维护!

    在国内开源之路上,BAT 这些大型互联网科技公司走在前列. 有数据为证:截至 2019 年 3 月 22 日,阿里开源的总项目数为 1243 个,百度开源的总项目数为 746 个,腾讯开源的总项目数为 ...

  6. 中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0

    项目简介 word-checker 本项目用于单词拼写检查.支持英文单词拼写检测,和中文拼写检测. 特性说明 可以迅速判断当前单词是否拼写错误 可以返回最佳匹配结果 可以返回纠正匹配列表,支持指定返回 ...

  7. 钱少事多,开源项目维护人员几乎集体出走

     聚焦源代码安全,网罗国内外最新资讯! 作者:Steven J. Vaughan-Nichols 编译:奇安信代码卫士 最近,Linux 内核稳定版本的维护人员 Greg Kroah-Hartman ...

  8. linux开源项目github,GitHub 上的优质 Linux 开源项目,真滴牛逼!

    作为一名互联网人,提起 Linux 大家都不陌生,尤其是日常跟 Linux 操作系统打交道最多的,最熟悉不过了.互联网上关于 Linux 相关的教程和资料也非常的多,但是当你从中筛选出真正对自己有帮助 ...

  9. GitHub 上的优质 Linux 开源项目,真滴牛逼!

    作为一名互联网人,提起 Linux 大家都不陌生,尤其是日常跟 Linux 操作系统打交道最多的,最熟悉不过了.互联网上关于 Linux 相关的教程和资料也非常的多,但是当你从中筛选出真正对自己有帮助 ...

最新文章

  1. Social regularizations
  2. 2016年6月TIOBE编程语言排行榜:涨幅最大的名字很长
  3. File类、递归、字节流
  4. JavaScript+ Canvas开发趣味小游戏《贪吃蛇》
  5. jsp if else c标签 总结
  6. jsp ---- JSTL
  7. Google Map 附近查询
  8. 中国的码农们,沉睡了20年,该醒醒了
  9. iir 滤波器 结构介绍
  10. 上海瀚示中文显示电子拣货标签 智能仓储物流工匠级革新
  11. 解决esp8266无法连接手机和电脑热点的问题
  12. Revealing Module(揭示模块)模式
  13. 网络工程属于计算机还是通信,通信工程属于计算机大类吗 哪个大类
  14. 【设计模式02】 抽象工厂模式
  15. 结构化数据、半结构化数据、非结构化数据
  16. 大龄程序员的前途令人担忧
  17. java 1 2 等于_java 判断语句中一个等于号和两个等于号的区别是什么?
  18. [uboot] (第一章)uboot流程——概述
  19. [重庆思庄每日技术分享]-oracle11g到ORACLE 816的dblink访问报 ORA-03150错误
  20. C++版本OpenCv教程(四十二)霍夫变换原理及直线检测

热门文章

  1. 江苏电信拥抱“互联网+”,加快混改步伐
  2. 进制转化器 python3.10
  3. u盘数据损坏怎么恢复?
  4. elementui中el-table实现翻页、全选
  5. linux 文件系统 备份
  6. 使用Navicat设计数据库模型并生成表
  7. 【181010】VC++斗地主游戏网络版源码
  8. 计算机网络方面的期刊,计算机网络或数据库方面论文有什么发表期刊
  9. 【通用大语言模型】GLM-130B:一个开放的双语预训练模型
  10. 数据库自研创新,星环科技发布国产化全面替代方案