1. 前言
对于一个追求稳定的系统来说,驱动端使用FFmpeg拉流、推流。播放端使用RTMP流播放,但实际情况要求RTMP流具备7*24小时不间断播放的能力,就实际情况来说,硬盘录像机或摄像头,在取它们的流的时候,经常会遇到一种情况,就是取流总是中断,取流一旦中断,会造成推流端故障,进而播放不出来流。所以我在之前,进行了读写分离的操作,拉流和推流是两个线程运行,拉流取出帧,然后放入vector中,推流线程从vector中不断取出第一帧,然后推送。
2.问题出现
在某些情况下,拉流线程运行的居然比推流线程快,导致vector的尺寸不断增大,最终内存泄漏。(比如使用海康威视SDK取流,拉流线程就比推流线程运行的快)。
3. 问题解决
为解决这种问题,在双线程的基础上,做了一个修改,仍然有两个线程,一个是拉流线程,一个是推流线程,所不同的是,拉流线程连接正常的情况下,由拉流线程自行推流,推流的同时,拉流线程始终保留最后一帧到内存中,当拉流线程出现视频源连接故障,推流线程自动接着不断推送最后一帧到流媒体服务端。最终,问题得到解决。
4. 总结
对于读写分离的系统来说,如果使用C++语言,不可避免的要使用vector,但要注意读写线程的速度,如果读线程快于写线程,会造成内存泄漏。对此有两种解决方式:
1. 降低读写端的速度,比如Sleep,但要注意,这样有可能会丢失一些数据,因此慎用
2. 仍然读写分离,正常情况下,读线程负责写,异常时,写线程写,正常时再切换回来。