Answers:
#1要同时淡入/淡出音频,请执行以下操作:
ffmpeg -i clip.mp4 -vf 'fade=in:0:30,fade=out:960:30'
-af 'afade=in:st=0:d=1,afade=out:st=32:d=1'
-c:v libx264 -crf 22 -preset veryfast fadeInOut.mp4
出现时间以秒为单位。
#2自动吗?否。但是请参阅下面的解决方法
您可以先运行ffprobe以获得持续时间。
ffprobe -i clip.mp4 -show_entries stream=codec_type,duration -of compact=p=0:nk=1
您将获得如下内容:
video|13.556000
audio|13.816000
然后,您可以使用上面的颜色放置渐变。这些时间以秒为单位。
解决方法
ffmpeg -i clip.mp4 -sseof -1 -copyts -i clip.mp4 -filter_complex
"[1]fade=out:0:30[t];[0][t]overlay,fade=in:0:30[v];
anullsrc,atrim=0:2[at];[0][at]acrossfade=d=1,afade=d=1[a]"
-map "[v]" -map "[a]" -c:v libx264 -crf 22 -preset veryfast -shortest fadeInOut.mp4
FFmpeg有一个sseof
选项,允许用户从末尾寻求输入。我们可以用它来实现我们的目标。因此,我们两次输入输入,第二次只摄取最后一秒。我们告诉FFmpeg保留时间戳,以便ffmpeg保留此尾部的时间位置。
我们对此尾巴进行淡出,然后将结果覆盖到完整的输入上。由于它们是相同的媒体文件,因此前景完全覆盖了背景,并且由于copyts
应用了前景,因此叠加会发生在背景输入中相应的相同帧上。
对于音频,我们创建一个持续时间为2秒的空白虚拟音频,然后将主音频的音频淡入淡出应用到该虚拟音频。由于第二音频为空白,因此实际上是主输入的淡出。将-shortest
被添加到离开了哑音频部分发生了交叉淡入淡出后。
-report
添加的命令并共享报告。
这是一个可怕的技巧,但是如果您只想让音频淡入/淡出但不知道剪辑有多长时间,这可能会起作用:
ffmpeg -i input.mp4 -filter_complex "afade=d=0.5, areverse, afade=d=0.5, areverse" output.mp4
[编辑2019-07-24:请注意,此解决方案不适用于流解决方案,因为它要求在处理第一个字节之前必须先处理完整轨道]
我的另一个选择是acrossfade
与无声轨道配合使用:
ffmpeg -i input.mp4 -filter_complex "aevalsrc=0:d=0.6 [a_silence]; [0:a:0] [a_silence] acrossfade=d=0.6" output.mp4
问题2的答案是肯定的!我一直在寻找相同的功能,最后写了一个bash脚本,要求以秒为单位的淡入淡出时间,并计算淡出的初始帧:
#!/bin/bash
f="$*" # all args
p="${f##*/}" # file
fn="${p%.*}" # name only
e="${p##*.}" # extension
echo
echo $f
echo $p
echo $fn
echo $e
echo
read -e -p "Number of seconds of fade-out: " -i 1 sec # prompt for fade duration in seconds
r=$(ffprobe -show_streams "$f" 2> /dev/null | grep r_frame_rate | head -1 | cut -d \= -f 2) # frame rate
let "frames = $r * $sec" # duration of fade as number of frames
echo $r
echo $sec
echo $frames
lf=$(ffprobe -show_streams "$f" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2) # total number of frames
let "lf = $lf - $frames" # initial frame to start fade at
ffmpeg -loglevel quiet -i "$f" -vf fade=out:$lf:$frames -r $r -vcodec libx264 -preset slow -crf 12 -bf 2 -flags +cgop -pix_fmt yuv420p -acodec copy "$fn $sec sec fade-out.$e"
open "$fn $sec sec fade-out.$e"
淡入淡出需要重新编码,因此使用较低的crf
值可以libx264
得到高质量的重新编码。评论应解释其他所有内容。
automatically figure out the duration
使用ffprobe
,并随一起安装了ffmpeg
。谁说过关于命令数量的任何限制*nix
?看来OP使用的是UNIX版本。.exe
在ffmpeg
命令中否。我本人正在使用OS X
构建于UNIX
但不是构建于其中的内容UNIX
。
ffprobe
是ffmpeg
分发的组成部分。您正在挑剔,以挽救IMO。