しきい値と検出区間を指定して無音区間を調べる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 -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