我有一个用于编码视频的脚本(使用 mencoder),但是有没有办法从命令行添加一个简单的“淡出/淡入黑色”,最好是免费的(如开源)。
它可以在 Windows 或 Ubuntu Linux 上。
答案1
答案2
最近的带有“淡入淡出”视频滤镜的 ffmpeg 可以做到这一点。不幸的是,Ubuntu repos 中的 ffmpeg 由于某些无聊的原因没有启用滤镜,因此您必须从其他地方获取它(请参阅这里)。
从黑色淡入,从第 0 帧开始,超过 50 帧(2 秒 @ 25fps):
ffmpeg -i input.mp4 -filter:v 'fade=in:0:50' \
-c:v libx264 -crf 22 -preset veryfast -c:a copy output.mp4
从第 21000 帧(14 分钟 @ 25fps)开始淡出,超过 50 帧:
ffmpeg -i input.mp4 -filter:v 'fade=out:21000:50' \
-c:v libx264 -crf 22 -preset veryfast -c:a copy output.mp4
您可以将两者组合成一个过滤链:
ffmpeg -i input.mp4 -filter:v 'fade=in:0:50,fade=out:21000:50' \
-c:v libx264 -crf 22 -preset veryfast -c:a copy output.mp4
从这些示例中可以看出,使用视频过滤器时必须对视频进行转码。由于 ffmpeg 和 mencoder 共享许多库,因此应该可以相当轻松地重写脚本以使用 ffmpeg 而不是 mencoder 并避免不必要的额外编码。我很确定您可以在 mencoder 中实现相同的操作,但我不知道 mencoder 语法。
答案3
我有这个 bash 脚本可以自动淡出电影(音频+视频)的结尾:
#!/bin/bash
# Audio + vidéo fade out at the end of mp4 files
# 2015-09-09 19:07:17.0 +0200 / Gilles Quenot
# length of the fade out
fade_duration=2 # seconds
if [[ ! $2 ]]; then
cat<<EOF
Usage:
${0##*/} <input mp4> <output mp4>
EOF
exit 1
fi
for x in bc awk ffprobe ffmpeg; do
if ! type &>/dev/null $x; then
echo >&2 "$x should be installed"
((err++))
fi
done
((err > 0)) && exit 1
duration=$(ffprobe -select_streams v -show_streams "$1" 2>/dev/null |
awk -F= '$1 == "duration"{print $2}')
final_cut=$(bc -l <<< "$duration - $fade_duration")
ffmpeg -i "$1" \
-filter:v "fade=out:st=$final_cut:d=$fade_duration" \
-af "afade=t=out:st=$final_cut:d=$fade_duration" \
-c:v libx264 -crf 22 -preset veryfast -strict -2 "$2"
用法 :
FadeOutMp4 <input mp4> <output mp4>