我有一個對視訊進行編碼的腳本(使用 mencoder),但是有沒有辦法從命令列添加一個簡單的“淡出/淡入黑色”,最好是免費的(如開源)。
它可以在 Windows 或 Ubuntu Linux 上。
答案1
答案2
最近帶有“淡入淡出”視訊過濾器的 ffmpeg 可以做到這一點。不幸的是,Ubuntu 儲存庫中的 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>