1、什么是混流?
混流就是把多路音视频流合成单流。准确的说,混流应该叫做混音(音频流)混画面(视频流)
混流的过程包括解码、混流、编码和推流四个部分。混流这个环节包括做抖动缓冲,目的是把多路流进行画面对齐和音画同步,同时通过缓冲对抗网络抖动,以便混合成一路流以后能够达到良好的效果。
在混流的过程中,难点是如何对抗网络抖动等不确定因素。
2、不混流的优势和劣势
不混流的优势
延迟低:不用混流,节省了混流消耗的时间,显著地降低了延迟
成本低: 如果是在服务端进行混流,将会耗费计算资源。考虑到服务端计算资源比较昂贵,如果不用混流,将会节省宝贵的计算资源,显著地降低成本。虽然拉多流比起拉单流会消耗更多的带宽成本,但是拉多流节省计算资源成本,整体而言,成本是降低了。
灵活性:在观众端,业务侧可以比较灵活的操控多路流,来满足多样化的业务需求。比如画中画大小画面相互切换,和对半分屏画面左右调换等效果,来提高观众端的用户体验。
不混流的劣势
拉多流会消耗更多的带宽。多路流被从服务端推到CDN, 然后观众端从CDN拉多流,都会耗费比较多的带宽成本。对于带宽成本占了运营成本显著,的确是需要慎重考量的。
混流的优势
成本:可以分为计算资源成本和带宽成本。由于预先做混流,因此计算资源成本会上去,但是由于只拉单流,因此带宽成本会下来。
可录制:如果业务上有录制音视频流的需求,以备监管抽查或者观众回放的话,那么需要进行混流。如果不进行混流的话,录制的时候只能录制到其中一个路音视频流,也就是只能看到其中一个主播的画面。要录制全画面的话,必须要进行混流。
易传播:如果业务上有通过音视频流地址链接(HLS)进行转发传播的需求,那么也需要进行混流,因为地址链接只会指向一路音视频流。如果不混流,使用转发的地址链接就只会播放出一个主播的音视频流。
混流的劣势
高延迟:由于在做混流的过程中,需要做抖动缓冲和实时转码等计算处理,将会耗费时间,从而造成额外的延迟。
不灵活:由于观众端拉单流观看,多路音视频流已经被混合成单流,所以观众端无法再灵活地对多流进行操控,比如切换画中画的主次画面。
服务器计算成本高:由于混流需要额外的计算资源,这里会导致额外的运营成本。
3、连麦互动的直播方案
4、推流端混流的方案
推流混流劣势
服务端计算成本低
服务端压力小
劣势
增加额外的延迟
手机硬件配置的瓶颈
上行网络带宽瓶颈
推流端环境不可控
难以扩展
5、服务端混流的方案
服务端混流的优势
低延迟
计算资源可控
网络带宽资源可控
可控可扩展
服务端混流的劣势
- 服务器计算成本高
- 服务端压力大
6、混流工具介绍
FFmpeg
Ffmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库
AVFormat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议
ACCodec:用于各种类型声音/图像编解码;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器ffdshow,Mplayer 等所包含或应用。
AVFilter:音视频滤波器的开发,如宽高比裁剪格式化非格式化伸缩
混流的逻辑
混流命令
./ffmpeg -i “背景图” -i “rtmp://输入流1” -i “rtmp://输入流2” -filter_complex “nullsrc=size=1600x720 [base];[0:v] scale=1600x720 [main]; [1:v] crop=320:180:0:0 [photo1];[2:v] crop=320:180:0:0 [photo2];[base][main] overlay=x=0:y=0 [temp];[temp][photo1] overlay=x=1280:y=0 [temp1];[temp1][photo2] overlay=x=1280:y=180 [temp2]” -c:v libx264 -r 50 -bufsize 10M -f flv “rtmp://推流地址”
- -i:输入文件
- -filter_complex :滤镜
- nullsrc=size=1600x720 [base]:设置基础背景大小,并取别名base
- [0:v] scale=1600x720 [main]:设置第一个输入文件的大小,及背景图大小为1600*720,并取别名main
- [1:v] crop=320:180:0:0 [photo1]:裁剪第二个文件大小,设置为320*180,并取别名photo1
- [2:v] crop=320:180:0:0 [photo2]:如上
- [base][main] overlay=x=0:y=0 [temp]:指定main在base的坐标,overlay距离左上角的坐标,并取别名temp
- [temp][photo1] overlay=x=1280:y=0 [temp1];[temp1][photo2] overlay=x=1280:y=180 :如上
- -r 帧率
- -bufsize 码率控制缓冲区大小
- -f flv 强迫采用格式flv
./ffmpeg -i rtmp://混流地址 test.mp4