我有一个基本上采用原始视频文件的工作流程,裁掉掉不相关的部分帧,然后使用vidstab过滤器执行双通道去抖滤波器。目前我正在运行它作为三个不同的命令:一个执行裁剪,第二个执行vidstab“检测”传递,第三个执行vidstab“转换”传递。
我的工作脚本:
# do the crop first and strip the audio
nice -20 ffmpeg -hide_banner -ss $SEEK -i $INFILE -t $DURATION -preset veryfast -crf 12 -vf crop=0.60*in_w:in_h/9*8:0.22*in_w:0 -an -y $TEMP
# now run the vidstab detection pass
nice -20 ffmpeg -hide_banner -i $TEMP -vf vidstabdetect=stepsize=6:shakiness=10:accuracy=15:result=${INFILE}.trf -f null -
# now the vidstab transform, with unsharp and writing the overlay text
nice -20 ffmpeg -hide_banner -i $TEMP -preset veryfast -crf 22 -vf \
" \
vidstabtransform=input=${INFILE}.trf:zoom=2:smoothing=60,
unsharp=5:5:0.8:3:3:0.4,
drawtext=fontfile=/Windows/Fonts/arialbd.ttf:text=$DIVE:enable='between(t,0,65)':fontcolor=black:fontsize=72:x=w*0.01:y=h*0.01,
null"\
-y $OUTFILE
我似乎无法弄清楚我是如何将前两个滤波器传递组合成一个链,这(至少在理论上)将是一个更快的编码时间,并且至少会更简单到保持并消除编码器的通过。我试图做的是第二个代码块,它只是构建了一个将初始裁剪与vidstab检测过滤器结合起来的过滤链。
# this is a combined filter for the crop and the vidstab detect
nice -20 ffmpeg -hide_banner -ss $SEEK -i $INFILE -t $DURATION -preset veryfast -crf 12 -vf \
" \
crop=0.60*in_w:in_h/9*8:0.22*in_w:0,
vidstabdetect=stepsize=6:shakiness=10:accuracy=15:result=${INFILE}.trf,
null " \
-an -r 30 -y $TEMP
# now run the transcoding and the vidstab transform
nice -20 ffmpeg -hide_banner -i $TEMP -preset veryfast -crf 22 -vf \
" \
vidstabtransform=input=${INFILE}.trf:zoom=2:smoothing=60,
unsharp=5:5:0.8:3:3:0.4,
drawtext=fontfile=/Windows/Fonts/arialbd.ttf:text=$DIVE:enable='between(t,0,65)':fontcolor=black:fontsize=72:x=w*0.01:y=h*0.01,
null"\
-y $OUTFILE
然而,当我运行它(它运行)时,最终输出视频绝对没有得到有效稳定。日志显示已经处理了检测和转换过程,只是输出不正确。
答案 0 :(得分:0)
所以,我设法让这个工作,虽然我不得不承认我不是100%确定哪个改变解决了它。下面的代码pastelet包含原始的“三次通过”方法以及较新的“两次通过”方法。
# begin the "three pass" method -- crop, then detect, then transform
# do the crop first and strip the audio
nice -20 ffmpeg -hide_banner -ss $SEEK -i $INFILE -t $DURATION -an -y -vf \
crop=0.60*in_w:in_h/9*8:0.22*in_w:0 $TEMP
# now run the vidstab detection pass
nice -20 ffmpeg -hide_banner -i $TEMP -vf \
vidstabdetect=stepsize=6:shakiness=10:accuracy=15:result=${TEMP}.trf -f null -
# now run the transcoding and the vidstab transform
nice -20 ffmpeg -hide_banner -i $TEMP -y -vf \
" \
vidstabtransform=input=${TEMP}.trf:zoom=2:smoothing=60,
unsharp=5:5:0.8:3:3:0.4,
null " \
$OUTFILE
# begin the "two pass" method -- crop and detect together, then transform
# do the crop first and strip the audio
nice -20 ffmpeg -hide_banner -ss $SEEK -i $INFILE -t $DURATION -an -y -vf \
crop=0.60*in_w:in_h/9*8:0.22*in_w:0,vidstabdetect=stepsize=6:shakiness=10:accuracy=15:result=${TEMP2}.trf $TEMP2
# now the vidstab transform
nice -20 ffmpeg -hide_banner -i $TEMP2 -y -vf \
" \
vidstabtransform=input=${TEMP2}.trf:zoom=2:smoothing=60,
unsharp=5:5:0.8:3:3:0.4,
null " \
$TWOPASS
顺便说一句,我花了很多时间试图弄清楚为什么来自裁剪和vidstab检测传递的临时文件在这两种情况下并不相同 - 理论上相同的输入文件通过相同的两个过滤器应该是相同的 - 但vidstabdetect过滤器输出不同的像素格式:
从三遍(作物和视频播放的单独通行证)
Output #0, mp4, to 'temp-GOPR3285.MP4':
Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuvj420p(pc), 1152x960 [SAR 1:1 DAR 6:5], q=-1--1, 47.95 fps, 48k tbn, 47.95 tbc (default)
从组合的裁剪/检测输出中:
Output #0, mp4, to 'temp2-GOPR3285.MP4':
Stream #0:0(eng): Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1152x960 [SAR 1:1 DAR 6:5], q=-1--1, 47.95 fps, 48k tbn, 47.95 tbc (default)
我还没有深入研究“yuvj420p”和“yuv420p”之间的细节差异 - 但这就是输出文件不相同的原因......