1. 前言
在某些企业,由于视频网络不佳,导致FFmpeg在拉流的时候,总是中断,顺带者,推流端也总是中断。
2. 解决思路
2个线程,拉流一个独立的线程,推流一个独立的线程。两个线程之间,用vector<AVPacket*> Pkts做桥梁。
当拉流线程获取一个新的帧后, 使用线程锁,锁定Pkts,然后向Pkts推入这个新的帧,然后解锁线程锁。
推流端不断检测Pkts的长度是否大于0,当大于0的时候,将第一帧,推流。如果等于0,则一直推送最后一帧。
3. 效果
这样修改了之后,尽管视频源总是中断,但是播放端一直可以播放,避免了视频源中断,导致推流中断,进而导致播放端中断。
4. 注意事项
由于vector线程不安全,因此任何操作vector的语句,都要加上线程锁,操作完成释放锁,否则程序容易崩溃。(因为拉流线程不断向vector推入新的数据,推流线程也在不断从vector取新的数据)