前因:前端使用播放器播放流视频,最大的播放个数是6,这是浏览器(Chrome)最大的并发请求个数,超过6个的不会播放.
使用突破技术:FFmpeg.
1.优势:FFmpeg视频多宫格处理,可以将多次视频流请求合并为一个,省去了多次请求造成的浏览器并发瓶颈。
具体实现过程:
执行命令:
-re -i 1.mp4
-re -i 2.mp4
-re -i 3.mp4
-re -i 4.mp4
-filter_complex
"nullsrc=size=640x480 [base];
[0:v] setpts=PTS-STARTPTS,scale=320x240 [upperleft];
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
[base][upperleft] overlay=shortest=1[tmp1];
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
[tmp3][lowerright] overlay=shortest=1:x=320:y=240"
-c:v libx264 out.mp4
简单明了,1.2.3.4.mp4为文件路径,out.MP4为输出文件路径,通过nullsrc创建overlay画布,画布大小640:480, 使用[0:v][1:v][2:v][3:v]将输入的4个视频流去除,分别进行缩放处理,然后基于nullsrc生成的画布进行视频平铺, 命令中自定义upperleft,upperright,lowerleft,lowerright进行不同位置平铺。
平铺步骤如图所示:
最终实现效果:
同理,实现多种风格拼接:
2.Java端的压力:
增加服务端请求的压力:服务端要先去请求多个视频流,然后合并处理成一个流,这回大大增加开销;FFmpeg只是工具,并不是代码级的jar包之类的可以集成的第三方插件,使用起来会有风险