我用它ffmpeg
来连接在多个时间范围内从同一对象拍摄的多个视频剪辑。为了确保视频正确对齐(从而大致显示相同的位置上的对象),我手动识别每个剪辑第一帧中的两个点,并使用它来计算正确对齐所需的缩放和定位。我为此使用 Python,它还会为我生成 ffmpeg 命令。当它计算出视频的适当比例小于 100% 时,这意味着帧的某些部分将变为黑色。为了解决这个问题,我将缩放和定位的视频叠加在原始视频的模糊版本上(例如这影响)
现在,另外,一些视频剪辑有点抖动,所以我的流程现在首先应用vidstabdetect
和vidstabtransform
过滤器,并使用转换后的稳定版本作为最终命令的输入。但是,如果抖动严重,将vidstabtransform
放大,因此我要么会丢失边缘周围的一些细节,要么会在边缘周围产生黑色边框。由于我稍后会在连接中包含视频的稳定版本,并且可能会缩小,所以我宁愿vidstabtransform
在命令中执行该步骤,并将输出直接用于模糊版本的叠加。这样,我希望实现剪辑在稳定时在帧上旋转,并显示在模糊的背景上。是否可以使用 ffmpeg 实现这一点,还是我试图将其拉得太远?
作为一个最小的例子,这些是我的命令:
ffmpeg -i video1.mp4 -vf vidstabdetect=output=transform.trf -f null -
ffmpeg -i video1.mp4 -vf vidstabtransform=input=transform.trf video1_stabilized.mp4
# same for video2.mp4
ffmpeg -i video1_stabilized.mp4 -i video2_stabilized.mp4 -filter_complex "
[0:v]split=2[v0blur][v0scale];
[v0blur]gblur=sigma=50[v0blur]; // blur the video
[v0scale]scale=round(iw*0.8/2)*2:round(ih*0.8/2)*2[v0scale]; // scale the video
[v0blur][v0scale]overlay=x=100:y=200[v0]; // overlay the scaled video over the blur at a specific location
[1:v]split=2[v1blur][v1scale];
[v1blur]gblur=sigma=50[v1blur];
[v1scale]scale=round(iw*0.9/2)*2:round(ih*0.9/2)*2[v1scale];
[v1blur][v1scale]overlay=x=150:y=150[v1];
[v0][v1]concat=n=2 // concatenate the two clips"
-c:v libx264 -r 30 out.mp4
因此,我知道我可以将vidstabtransform
步骤放入filter_complex
-graph(我仍然会在单独的步骤中进行检测),但我也可以使用它以便在模糊背景下实现稳定并让剪辑在稳定时围绕框架移动吗?
编辑:因此,要将其包含vidstabtransform
到过滤器图中,它将看起来像这样:
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "
[0:v]vidstabtransform=input=transform1.trf[v0stab]
[v0stab]split=2[v0blur][v0scale];
...
[1:v]vidstabtransform=input=transform2.trf[v1stab]
[v1stab]split=2[v1blur][v1scale];
...
[v0][v1]concat=n=2"
-c:v libx264 -r 30 out.mp4