しきい値と検出区間を指定して無音区間を調べるsilencedetectフィルタの使い方。

基本コマンド

ffmpeg -i input -af silencedetect=n=0.001:d=2:m=0 -vn -f null -

ログの出力例。

silence_start: 0
silence_end: 1.80225 | silence_duration: 1.80225

ametadataフィルタでログをテキストに出力する。
ffmpeg -i input -af silencedetect=n=0.001:d=2:m=0,ametadata=mode=print:key=lavfi.silence_duration:file=silence_duration.txt -vn -f null -

メタデータをコンソールに表示する metadata, ametadata

flat形式だけは検出されない区間がないので目視しやすい。
ffprobe -v error -f lavfi -i amovie=input,silencedetect -select_streams a:0 -show_entries packet_tags=lavfi.silence_duration -of flat > silence_duration.txt

ffprobe の使い方

検出されない区間は空データになりログのファイルサイズが大きくなる。
ffprobe -v error -f lavfi -i amovie=input,silencedetect -select_streams a:0 -show_entries packet_tags=lavfi.silence_start,lavfi.silence_end,lavfi.silence_duration -of json > silencedetect.json

チャンネル毎に調べるにはm=1にして、1開始の添え字を追加する。
ffprobe -v error -f lavfi -i amovie=input,silencedetect=m=1 -select_streams a:0 -show_entries packet_tags=lavfi.silence_duration.1 -of flat > silence_duration.txt

添え字とチャンネルの関係はStandard channel layout compositionsの順番になる。

開始時間と区間をログで出力。
ffmpeg -hide_banner -vn -i 1.mp4 -af "silencedetect=d=0.45" -f null - 2>&1 | grep "silence_end" | awk '{print $5 " " $8}' > silence.txt

Remove the Silent Parts of a Video Using FFmpeg and Python

公式ドキュメント:FFmpeg Filters Documentation : silencedetect

オプション

アニメのOPEDは開始終了に0.5秒の無音が入るので余裕を持ってd=0.45を指定するとその区間以上で検出する。

  • n, noise[double]
    ノイズ許容値の指定
    既定値:0.001
    範囲:0から1まで
  • d, duration[duration]
    検出区間の最小値の指定。この値以上で検出する
    既定値:2
  • m, mono[boolean]
    チャンネル毎に解析する
    既定値:0

扱えるメタデータ。

lavfi.silence_start
lavfi.silence_end
lavfi.silence_duration

チャンネル毎に調べるにはm=1を指定して1開始の添え字を追加する。

lavfi.silence_start.X
lavfi.silence_end.X
lavfi.silence_duration.X

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)