在我制作视频的这个持续过程中,我还想尝试添加一个步骤。
我的要求如下:
在疫情期间,我们的合唱团指挥正在录制一段视频作为伴奏,然后每个合唱团成员(在家)戴着耳机听伴奏,一起唱歌,并把他们的声音和可爱的脸录成视频。我现在想把所有这些不同的视频合并成一个视频,所有成员都放在小窗格中,就像 Brady Bunch 风格一样。当然,每个合唱团成员的硬件都不同,所以音频级别都不同,需要标准化。当然,有一个人把视频拍成了横向的(纵向而不是横向),所以他们的视频在添加进去之前必须先裁剪一下。
此外,我需要将导演的视频定义为“主”流。假设导演的视频开头有 3 秒的无意义内容,这些内容是不必要的。我想在这段无意义内容之后立即开始播放最终视频。然后,如果合唱团成员 #1 在导演之后 0.4 秒开始播放她的视频,我想丢弃她视频的前 2.6 秒。如果合唱团成员 #2 完全无视指示,在导演之后 4.3 秒开始播放他的视频,那么我需要他的窗格在最终视频中空白 1.3 秒。
最后,如果某些视频需要裁剪,导致形状不正确,我会用这种可爱的绿色填充空白处。如何才能让背景图像显示在视频“后面”?
基于先前的答案和其他研究,我有这个命令行:
ffmpeg
-y
-ss 0.2 -i "One.MOV"
-ss 3.2 -i "Two.MOV"
-i "Three.mp4"
-loop 1 -i "Image.jpg"
-filter_complex "
nullsrc=size=1920x1080 [base];
[3:v]scale=0.5:0.5[bg];
[base][bg] overlay=shortest=1:x=0:y=0 [tmpx];
[0:v] scale=960x540 [clip0];
[0:a]volume=1.7[aud0];
[1:v] crop=1080:1000:0:920,scale=583x540 [clip1];
[1:a]volume=4.8,aresample=async=1:first_pts=0[aud1];
[2:v] scale=960x540 [clip2];
[2:a]volume=1.1,aresample=async=1:first_pts=0[aud2];
[tmpx][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
[aud0][aud1][aud2]amix=inputs=3[a]
"
-map "[tmp2]"
-map "[a]"
-c:v libx264 d:\scans\output.mkv
好消息:这个方法有效!坏消息:运行这个方法所花的时间比没有背景静态图像时长 10 倍以上。
如果我去掉“-loop 1”,它会运行得更快,但我的整个输出就是一张静止图像(背景图像加上每个输入视频的第一帧)。
我怎样才能在背景中添加静止图像而不对性能造成影响?
编辑
以下是使用各种选项渲染视频所需的时间:
- 无背景或纯色:39 秒
- 输入 3024x4032 的图像:235 秒
- 将输入图像的大小调整为 1920x1080,然后交给 ffmpeg:68 秒(包括 0.25 秒用于调整图像大小)
- 调整图像大小,然后将其转换为 1 秒长的视频:44 秒(包括将图像转换为视频的 0.8 秒)
答案1
删除图像的最短=1,也许是这个:
ffmpeg \
-ss 0.2 -i "One.MOV" \
-ss 3.2 -i "Two.MOV" \
-i "Three.mp4" \
-i "Image.jpg" \
-filter_complex "
nullsrc=size=1920x1080 [base];
[base][3:v]overlay[bg];
[0:v] scale=960x540 [clip0];
[1:v] crop=1080:1000:0:920,scale=583x540 [clip1];
[2:v] scale=960x540 [clip2];
[bg][clip0] overlay=shortest=1:x=0:y=0 [tmp0];
[tmp0][clip1] overlay=shortest=1:x=1148:y=0 [tmp1];
[tmp1][clip2] overlay=shortest=1:x=0:y=540 [tmp2];
[0:a]volume=1.7[aud0];
[1:a]volume=4.8,aresample=async=1:first_pts=0[aud1];
[2:a]volume=1.1,aresample=async=1:first_pts=0[aud2];
[aud0][aud1][aud2]amix=inputs=3[a]
" \
-ss 10 -map [tmp2] -map [a] -c:v h264_nvenc -cq 20 -c:a aac -y output.mkv