如何使用 ffmpeg 在视频的开始或结束处添加简单的一秒或半秒淡入淡出效果,并保持其他所有内容不变(编解码器,质量)
答案1
对于 10 秒的视频,开头淡入 1 秒,结尾淡出 1 秒,使用褪色筛选:
ffmpeg -i input.mp4 -vf "fade=type=in:duration=1,fade=type=out:duration=1:start_time=9" -c:a copy output.mp4
如果你也想淡化音频,那么添加阿法德筛选:
ffmpeg -i input.mp4 -filter_complex "[0:v]fade=type=in:duration=1,fade=type=out:duration=1:start_time=9[v];[0:a]afade=type=in:duration=1,afade=type=out:duration=1:start_time=9[a]" -map "[v]" -map "[a]" output.mp4
为了实现自动化,使用ffprobe
来获取持续时间并bc
计算最后淡出的开始时间:
#!/bin/bash
mkdir fade
for f in *.mp4; do
dur=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 "$f")
offset=$(bc -l <<< "$dur"-1)
ffmpeg -i "$f" -filter_complex "[0:v]fade=type=in:duration=1,fade=type=out:duration=1:start_time='$offset'[v];[0:a]afade=type=in:duration=1,afade=type=out:duration=1:start_time='$offset'[a]" -map "[v]" -map "[a]" fade/"$f"
done
假设所有输入都有视频和音频。如果没有,您可以结合使用 if/then 语句来ffprobe
确定是否有音频。
...其他一切保持不变(编解码器、质量)
过滤需要编码。输出有损格式时无法保持质量。要么输出无损格式(不推荐,文件很大,兼容性问题),要么接受一定程度的损失。幸运的是,您可能不会注意到。只需-crf
在输出 H.264 视频时使用该选项即可。使用看起来仍然足够好的最高值。请参阅FFmpeg 维基:H.264更多细节。