将 ffmpeg 与 vidstab 和编码 2 pass 结合使用的更好方法
Better way to use ffmpeg with vidstab and encoding 2 pass
我扫描旧的 8mm 胶片
所以我有一组 jpeg
的文件夹
我使用 ffmpeg 将它们转换为电影(我选择 x264 2 pass 编码)
//On all folder that start by 1 I launch the pass1 for x264
for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 1 -an -f mp4 /dev/null; cd ..; done
//On all folder that start by 1 I launch the pass2 x264
for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 2 ../"`echo ${PWD##*/}`.mp4"; cd ..; done
--> 在我用 jpeg 设置文件夹之前
1965-FamilyStuff01\img1111.jpg,..,img9999.jpg
1965-FamilyStuff02\img1111.jpg,..,img9999.jpg
然后我得到
1965-FamilyStuff01.mp4
1965-FamilyStuff02.mp4
然后我发现 vidstab 也需要 2 pass
//稳定一个文件夹的每个视频
mkdir stab;for f in ./*.mp4 ; do echo "Stabilize $f" ;
ffmpeg -i "$f" -vf vidstabdetect=shakiness=5:accuracy=15:stepsize=6:mincontrast=0.3:show=2 -y -f mp4 /dev/null;
ffmpeg -i "$f" -vf vidstabtransform=smoothing=30:input="transforms.trf":interpol=linear:crop=black:zoom=0:optzoom=1,unsharp=5:5:0.8:3:3:0.4 -y "stab/$f"
; done; rm transforms.trf;
但我问自己,也许顺序不正确,或者也许有一种方法可以在不到 4 遍的时间内使用 vidstab 进行编码(2 遍用于 x264 编码,2 遍用于 vidstab)
或者也许应该更改顺序以优化电影输出的质量)
您需要 运行 两个命令才能使用 vidstab。但 x264 不需要两次通过即可获得最佳质量。两次通过编码用于针对特定的输出文件大小。只需使用带有 -crf
选项的单次传递。
所以你只需要使用两个命令:
ffmpeg -i input.mp4 -vf "scale=1200:-2,vidstabdetect=shakiness=5:accuracy=15:stepsize=6:mincontrast=0.3:show=2" -f null -
ffmpeg -i input.mp4 -vf "scale=1200:-2,vidstabtransform=smoothing=30:interpol=linear:crop=black:zoom=0:optzoom=1,unsharp=5:5:0.8:3:3:0.4,format=yuv420p" -crf 23 -preset medium output.mp4
有关 -crf
和 -preset
的更多信息,请参阅 FFmpeg Wiki: H.264。
我扫描旧的 8mm 胶片 所以我有一组 jpeg
的文件夹我使用 ffmpeg 将它们转换为电影(我选择 x264 2 pass 编码)
//On all folder that start by 1 I launch the pass1 for x264
for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 1 -an -f mp4 /dev/null; cd ..; done
//On all folder that start by 1 I launch the pass2 x264
for f in 1*/ ; do cd "$f"; ffmpeg -y -r 18 -i img%05d.jpg -c:v libx264 -s 1200x898 -b:v 3000k -pass 2 ../"`echo ${PWD##*/}`.mp4"; cd ..; done
--> 在我用 jpeg 设置文件夹之前
1965-FamilyStuff01\img1111.jpg,..,img9999.jpg
1965-FamilyStuff02\img1111.jpg,..,img9999.jpg
然后我得到
1965-FamilyStuff01.mp4
1965-FamilyStuff02.mp4
然后我发现 vidstab 也需要 2 pass
//稳定一个文件夹的每个视频
mkdir stab;for f in ./*.mp4 ; do echo "Stabilize $f" ;
ffmpeg -i "$f" -vf vidstabdetect=shakiness=5:accuracy=15:stepsize=6:mincontrast=0.3:show=2 -y -f mp4 /dev/null;
ffmpeg -i "$f" -vf vidstabtransform=smoothing=30:input="transforms.trf":interpol=linear:crop=black:zoom=0:optzoom=1,unsharp=5:5:0.8:3:3:0.4 -y "stab/$f"
; done; rm transforms.trf;
但我问自己,也许顺序不正确,或者也许有一种方法可以在不到 4 遍的时间内使用 vidstab 进行编码(2 遍用于 x264 编码,2 遍用于 vidstab) 或者也许应该更改顺序以优化电影输出的质量)
您需要 运行 两个命令才能使用 vidstab。但 x264 不需要两次通过即可获得最佳质量。两次通过编码用于针对特定的输出文件大小。只需使用带有 -crf
选项的单次传递。
所以你只需要使用两个命令:
ffmpeg -i input.mp4 -vf "scale=1200:-2,vidstabdetect=shakiness=5:accuracy=15:stepsize=6:mincontrast=0.3:show=2" -f null -
ffmpeg -i input.mp4 -vf "scale=1200:-2,vidstabtransform=smoothing=30:interpol=linear:crop=black:zoom=0:optzoom=1,unsharp=5:5:0.8:3:3:0.4,format=yuv420p" -crf 23 -preset medium output.mp4
有关 -crf
和 -preset
的更多信息,请参阅 FFmpeg Wiki: H.264。