FFmpeg 推流拉流推流分离,造成内存泄漏的bug记录

1. 前言

对于一个追求稳定的系统来说,驱动端使用FFmpeg拉流、推流。播放端使用RTMP流播放,但实际情况要求RTMP流具备7*24小时不间断播放的能力,就实际情况来说,硬盘录像机或摄像头,在取它们的流的时候,经常会遇到一种情况,就是取流总是中断,取流一旦中断,会造成推流端故障,进而播放不出来流。所以我在之前,进行了读写分离的操作,拉流和推流是两个线程运行,拉流取出帧,然后放入vector中,推流线程从vector中不断取出第一帧,然后推送。

2.问题出现

在某些情况下,拉流线程运行的居然比推流线程快,导致vector的尺寸不断增大,最终内存泄漏。(比如使用海康威视SDK取流,拉流线程就比推流线程运行的快)。

3. 问题解决

为解决这种问题,在双线程的基础上,做了一个修改,仍然有两个线程,一个是拉流线程,一个是推流线程,所不同的是,拉流线程连接正常的情况下,由拉流线程自行推流,推流的同时,拉流线程始终保留最后一帧到内存中,当拉流线程出现视频源连接故障,推流线程自动接着不断推送最后一帧到流媒体服务端。最终,问题得到解决。

4. 总结

对于读写分离的系统来说,如果使用C++语言,不可避免的要使用vector,但要注意读写线程的速度,如果读线程快于写线程,会造成内存泄漏。对此有两种解决方式:

1. 降低读写端的速度,比如Sleep,但要注意,这样有可能会丢失一些数据,因此慎用

2. 仍然读写分离,正常情况下,读线程负责写,异常时,写线程写,正常时再切换回来。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值