不明な時間でビデオ/オーディオクリップをフェードイン/フェードアウトする方法は?


19

私はffmpegを使用していくつかのビデオファイルをバッチ変換し、各クリップの頭と尾にフェードイン/アウト効果を追加するプロジェクトに取り組んでいます。

次のコードを使用して、既知の長さのクリップにフェード/アウト効果を追加しました。

ffmpeg -i clip.mp4 -filter:v 'fade=in:0:30,fade=out:9650:30' -c:v libx264 -crf 22 -preset veryfast -c:a copy fadeInOut.mp4

私の2つの質問は次のとおりです。

  1. 音声を同時にフェードイン/フェードアウトするにはどうすればよいですか?
  2. ffmpegは、クリップの継続時間を自動的に把握し、最後の30フレームをフェードアウトさせるだけでよいのでしょうか?

ありがとう!

回答:


15

#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、最後から入力を求めることができるオプションがあります。これを使用して目標を達成できます。したがって、入力を2回フィードし、2回目は最後の1秒のみを取り込みます。ffmpegがこのテール部分の時間的位置を保持するように、FFmpegにタイムスタンプを保持するように指示します。

このテールにフェードアウトを適用し、結果を完全な入力にオーバーレイします。これらは同じメディアファイルであるため、前景は完全に背景を覆い、copyts適用されたため、背景入力の対応する同一フレームにオーバーレイが発生します。

オーディオの場合、2秒間の空のダミーダミーオーディオを作成し、メインオーディオからこのダミーオーディオにオーディオクロスフェードを適用します。2番目のオーディオは空白なので、これは実質的にメイン入力のフェードアウトです。-shortestクロスフェードが発生した後にダミーオーディオの部分を除外するために追加されます。


これにより、「no such filter!」というエラーが発生します。オーディオフィルター用。
felwithe

1
4つのオーディオフィルターが使用されています。どれ?-report追加してコマンドを実行し、レポートを共有します。
ギャン

7

これは恐ろしいハックですが、オーディオフェードイン/オーディオフェードのみを行いたいが、クリップの長さを正確に知らない場合、これは機能する可能性があります。

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

3
これは実際にはかなりエレガントです:-)
bk138

これはうまく機能します。仕組みを説明してもらえますか。ドキュメントの意味を理解しよう..
oberhamsi

1
@oberhamsi:オプション1:最初のフィルターは、トラックの先頭にフェードを追加します。次に、オーディオを反転し、最初にフェードインを追加します(実際にはこれが最後です)。最後に、トラックが再び逆になります。オプション2は0.6秒のサイレントトラックを作成し、元のトラックと同じ時間クロスフェードします。すべてのフィルターとその使用法はここに文書化されています:ffmpeg.org/ffmpeg-filters.html(それは少し不可解であることに同意しなければなりませんが)
marekventur

3

質問2に対する答えは、圧倒的なYESです!私は同じ機能を探していたので、フェード期間を秒単位で要求し、フェードアウトの初期フレームを計算する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て高品質の再エンコードを行います。コメントは他のすべてを説明する必要があります。


質問2の答えは圧倒的なYESです!->それはまだありません。Qはffmpegで継続時間を自動的に計算できます...しかし、複数のff *コマンドを実行するスクリプトを作成しました。ただし、* nixシステムには役立ちます。
ギャン

なるほど、あなたはあなたの答えがまだ正しいと主張していますか?私のスクリプトに従うと、でインストールされているを実際にautomatically figure out the duration使用していることがわかります。誰がコマンドの数の制限について何か言いましたか?OPはUNIXのバージョンを使用しているようです。コマンドにはありません。私自身が使用しているのは、構築されているがそうではない。ffprobeffmpeg*nix.exeffmpegOS XUNIXUNIX
hmj6jmh

1
*私のスクリプトに従うと、実際に自動的に計算されることがわかります*->スクリプトは実行されますが、ffmpegは実行されません。
ギャン

しかしffprobeffmpeg分布の不可欠な部分です。面のIMOを節約するために、あなたはnitを選んでいます。
hmj6jmh

bashスクリプトによって実行されることは、ffmpegによって自動的に実行されることではないことに同意する必要があります。しかし、これが機能する場合、これはその問題を回避する方法です。したがって、「回避策」という用語。私は、ほとんどの人がそうであるように、bashやUnixシステムを持っていないので、それが機能するかどうかは言えません。とにかく努力のために+1。
ashleedawg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.