【obs-studio开源项目从入门到放弃】obs高级输出内存泄露
文章目录
- 前言
- 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高级输出内存泄露相关推荐
- 【obs-studio开源项目从入门到放弃】obs 配置 srt推流
文章目录 前言 srt协议简介 obs 配置srt推流 srt的配置示例 srs流媒体服务器配置srt服务 播放 srt 流 ffmpeg 推拉流 srt 总结 技术参考 前言 现在各大云厂商都支持上 ...
- 【obs-studio开源项目从入门到放弃】obs-studio项目简介和架构
文章目录 前言 一.obs-studio项目简介 二.windows平台的编译步骤 三.obs的核心线程 obs视频渲染线程 obs视频编码线程 obs音频编码线程 rtmp发送线程 四.常用插件的介 ...
- 【obs-studio开源项目从入门到放弃】预览窗口中source的UI操作绘制处理
文章目录 前言 获取鼠标位置 绘制选中框 裁剪源 拉伸源 移动源 总结 前言 obs-studio项目简介和架构:https://blog.csdn.net/qq_33844311/article/d ...
- 【obs-studio开源项目从入门到放弃】video_thread 视频编码线程理解
文章目录 前言 1.视频编码线程的创建时机 video_output_open函数创建视频编码线程 2.视频编码线程的工作内容 video_output_cur_frame 线程真正的工作函数 详细解 ...
- 你用的那些开源项目可能已经被放弃维护!
在国内开源之路上,BAT 这些大型互联网科技公司走在前列. 有数据为证:截至 2019 年 3 月 22 日,阿里开源的总项目数为 1243 个,百度开源的总项目数为 746 个,腾讯开源的总项目数为 ...
- 中英文拼写检测纠正开源项目使用入门 word-checker 1.1.0
项目简介 word-checker 本项目用于单词拼写检查.支持英文单词拼写检测,和中文拼写检测. 特性说明 可以迅速判断当前单词是否拼写错误 可以返回最佳匹配结果 可以返回纠正匹配列表,支持指定返回 ...
- 钱少事多,开源项目维护人员几乎集体出走
聚焦源代码安全,网罗国内外最新资讯! 作者:Steven J. Vaughan-Nichols 编译:奇安信代码卫士 最近,Linux 内核稳定版本的维护人员 Greg Kroah-Hartman ...
- linux开源项目github,GitHub 上的优质 Linux 开源项目,真滴牛逼!
作为一名互联网人,提起 Linux 大家都不陌生,尤其是日常跟 Linux 操作系统打交道最多的,最熟悉不过了.互联网上关于 Linux 相关的教程和资料也非常的多,但是当你从中筛选出真正对自己有帮助 ...
- GitHub 上的优质 Linux 开源项目,真滴牛逼!
作为一名互联网人,提起 Linux 大家都不陌生,尤其是日常跟 Linux 操作系统打交道最多的,最熟悉不过了.互联网上关于 Linux 相关的教程和资料也非常的多,但是当你从中筛选出真正对自己有帮助 ...
最新文章
- Social regularizations
- 2016年6月TIOBE编程语言排行榜:涨幅最大的名字很长
- File类、递归、字节流
- JavaScript+ Canvas开发趣味小游戏《贪吃蛇》
- jsp if else c标签 总结
- jsp ---- JSTL
- Google Map 附近查询
- 中国的码农们,沉睡了20年,该醒醒了
- iir 滤波器 结构介绍
- 上海瀚示中文显示电子拣货标签 智能仓储物流工匠级革新
- 解决esp8266无法连接手机和电脑热点的问题
- Revealing Module(揭示模块)模式
- 网络工程属于计算机还是通信,通信工程属于计算机大类吗 哪个大类
- 【设计模式02】 抽象工厂模式
- 结构化数据、半结构化数据、非结构化数据
- 大龄程序员的前途令人担忧
- java 1 2 等于_java 判断语句中一个等于号和两个等于号的区别是什么?
- [uboot] (第一章)uboot流程——概述
- [重庆思庄每日技术分享]-oracle11g到ORACLE 816的dblink访问报 ORA-03150错误
- C++版本OpenCv教程(四十二)霍夫变换原理及直线检测