如何使用ffmpeg将10个视频拼成3840x2160分辨率的5列2行分屏视频
ffmpeg 5列2行10视频分屏拼接操作方案
完整实现命令
ffmpeg \ -i input0.mp4 -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 \ -i input5.mp4 -i input6.mp4 -i input7.mp4 -i input8.mp4 -i input9.mp4 \ -filter_complex \ "[0:v]scale=w=768:h=1080,setsar=1[v0];\ [1:v]scale=w=768:h=1080,setsar=1[v1];\ [2:v]scale=w=768:h=1080,setsar=1[v2];\ [3:v]scale=w=768:h=1080,setsar=1[v3];\ [4:v]scale=w=768:h=1080,setsar=1[v4];\ [5:v]scale=w=768:h=1080,setsar=1[v5];\ [6:v]scale=w=768:h=1080,setsar=1[v6];\ [7:v]scale=w=768:h=1080,setsar=1[v7];\ [8:v]scale=w=768:h=1080,setsar=1[v8];\ [9:v]scale=w=768:h=1080,setsar=1[v9];\ [v0][v1][v2][v3][v4][v5][v6][v7][v8][v9]xstack=inputs=10:layout=0_0|w0_0|w0+w1_0|w0+w1+w2_0|w0+w1+w2+w3_0|0_h0|w0_h0|w0+w1_h0|w0+w1+w2_h0|w0+w1+w2+w3_h0:fill=black[outv]" \ -map "[outv]" -c:v libx264 -crf 23 -preset medium output_3840x2160.mp4
命令拆分说明
- 输入部分:按你想要的排列顺序导入10个视频,第一行从左到右对应前5个输入
input0到input4,第二行从左到右对应后5个输入input5到input9 - 缩放部分:每个输入视频流经过
scale滤镜强制缩放到768x1080,setsar=1将像素采样比设为1,避免因源视频像素比例异常导致画面变形 - 布局拼接部分:使用
xstack滤镜完成网格拼接,inputs参数指定参与拼接的视频流数量,layout参数按输入流顺序依次定义每个视频的左上角坐标,fill=black设定无视频画面的区域填充黑色 - 输出部分:编码使用H.264格式,
crf 23是默认画质参数,数值越小画质越高文件越大,preset参数控制编码速度,档位越慢压缩率越高
常见调整说明
- 避免画面拉伸:如果源视频比例和768x1080不一致,不想强制拉伸的话,将scale部分替换为
scale=w=768:h=1080:force_original_aspect_ratio=decrease,pad=w=768:h=1080:x=(ow-iw)/2:y=(oh-ih)/2:color=black,setsar=1,会等比缩放后上下/左右补黑边 - 音频处理:如果需要合并所有视频的音频,在filter_complex末尾加音频混合逻辑:
[0:a][1:a][2:a][3:a][4:a][5:a][6:a][7:a][8:a][9:a]amix=inputs=10[outa],然后输出参数加-map "[outa]" -c:a aac -b:a 192k;如果只需要保留某一个视频的音频,直接加-map x:a(x为对应输入的序号,从0开始) - 时长对齐:如果需要所有视频统一为相同时长,可以在每个scale滤镜前加trim滤镜,比如统一裁剪为10秒:
[0:v]trim=duration=10,scale=...
内容的提问来源于stack exchange,提问作者SmileyAG
相关产品推荐
相关产品推荐

