我有同样的确切长度的两个视频,我想用的ffmpeg将它们堆放到一个视频文件。
我怎样才能做到这一点?
我有同样的确切长度的两个视频,我想用的ffmpeg将它们堆放到一个视频文件。
我怎样才能做到这一点?
见这个答案对这个问题换做这个新的方式。
旧版:
你应该能够做到这一点使用的垫片 , 电影和覆盖在FFmpeg的过滤器。 该命令将是这个样子:
ffmpeg -i top.mov -vf 'pad=iw:2*ih [top]; movie=bottom.mov [bottom]; \
[top][bottom] overlay=0:main_h/2' stacked.mov
首先,电影应该是在顶部被填充到其高度的两倍。 然后底部影片加载。 然后底部电影在半填充的影片的高度偏移覆盖在填充顶部的电影。
使用vstack (垂直), hstack (水平),或的xStack (定制布局)过滤器。 它比其他方法更容易和更快。
使用vstack过滤器。
ffmpeg -i input0 -i input1 -filter_complex vstack=inputs=2 output
影片必须具有相同的宽度。
使用hstack过滤器。
ffmpeg -i input0 -i input1 -filter_complex hstack=inputs=2 output
影片必须具有相同的高度。
使用垫过滤。 这个例子创建了双方之间的5px的黑色边框。
ffmpeg -i input0 -i input1 -filter_complex "[0]pad=iw+5:color=black[left];[left][1]hstack=inputs=2" output
添加amerge过滤器的音频通道从两个输入相结合:
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];[0:a][1:a]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output
-ac 2
被包括以缩混到立体声的情况下,两个输入端含有多声道音频。 例如,如果两个输入都是立体声,你如果省略得到4通道输出音频数据流,而不是立体声-ac 2
。 这个例子将使用音频input1
:
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v]" -map "[v]" -map 1:a output
如果混合有音频和投入不具备音频然后amerge将会失败,因为每个输入需要音频输入。 您可以添加无声的音频, anullsrc过滤器 ,以防止这种情况:
ffmpeg -i input0 -i input1 -filter_complex "[0:v][1:v]vstack=inputs=2[v];anullsrc[silent];[0:a][silent]amerge=inputs=2[a]" -map "[v]" -map "[a]" -ac 2 output.mp4
ffmpeg -i input0 -i input1 -i input2 -filter_complex "[0:v][1:v][2:v]vstack=inputs=3[v]" -map "[v]" output
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex "[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]" -map "[v]" output
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex "[0:v][1:v]hstack=inputs=2[top];[2:v][3:v]hstack=inputs=2[bottom];[top][bottom]vstack=inputs=2[v]" -map "[v]" output
该语法是更易于理解,但比如上所示使用的xStack效率较低。
使用DrawText的过滤器:
ffmpeg -i input0 -i input1 -i input2 -i input3 -filter_complex
"[0]drawtext=text='vid0':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v0];
[1]drawtext=text='vid1':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v1];
[2]drawtext=text='vid2':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v2];
[3]drawtext=text='vid3':fontsize=20:x=(w-text_w)/2:y=(h-text_h)/2[v3];
[v0][v1][v2][v3]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]"
-map "[v]" output
由于这两部影片需要有与vstack相同,为hstack相同的高度,您可能需要扩展的其他影片相匹配的另一种:
简单尺度滤波器为例来INPUT 0的宽度设置为640和自动设定高度,同时保持高宽比:
ffmpeg -i input0 -i input2 -filter_complex "[0:v]scale=640:-1[v0];[v0][1:v]vstack=inputs=2" output
对于更高级的方法,以适应任何大小的视频成特定大小,同时保留长宽比看到重新调整视频的有关ffmpeg以适应静态大小的播放器 。
您还可以使用scale2ref过滤器自动调整一个视频来匹配其他的尺寸。