車で見るようにスペースシャワーのランキング番組をmp4に変換してるんだけど…
番組自体が2時間とか3時間とかあるので、選曲とかが難しい…
チャプタとかが打ってあれば適当にスキップできるからね。
ということで、スキップ用にチャプタをつける作業をしてみた。
1.無音区間を見つる(FFmpegを使う)
ffmpeg -i input.mp4 -af silencedetect=noise=-30dB:d=4 -f null - 2> silencedetect.log
・noiseは無音判定の閾値(-30dB以下を無音とみなす)
・dは無音状態が続く最低秒数(4秒以上の無音を検出)
・無音区間のデータはsilencedetect.logに書き出す。
こんな感じです。検出時間は2秒だと検出数が多すぎる。4秒だと曲間で引っかからないことあるけど。まぁよし。
2.無音データを編集する
[silencedetect @ 0x592249e9cd80] silence_start: 419.799trate=N/A speed=30.2x
[silencedetect @ 0x592249e9cd80] silence_end: 429.216 | silence_duration: 9.41671
[silencedetect @ 0x592249e9cd80] silence_start: 729.155trate=N/A speed=27.8x
[silencedetect @ 0x592249e9cd80] silence_end: 745.09 | silence_duration: 15.9356
[silencedetect @ 0x592249e9cd80] silence_start: 1040.16trate=N/A speed=27.3x
[silencedetect @ 0x592249e9cd80] silence_end: 1063.42 | silence_duration: 23.2562
[silencedetect @ 0x592249e9cd80] silence_start: 1247.69trate=N/A speed=26.8x
[silencedetect @ 0x592249e9cd80] silence_end: 1265.09 | silence_duration: 17.395
…
こんな感じで、無音のスタートとエンドの秒数が書かれたデータがsilencedetect.logにできる。
今回はこのエンドのポイントにチャプターを打つことにするので、silence_endだけをまとめたテキストを作成。
[silencedetect @ 0x5fd1ebb84f00] silence_end: 429.216 | silence_duration: 9.41671
[silencedetect @ 0x5fd1ebb84f00] silence_end: 745.09 | silence_duration: 15.9356
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1063.42 | silence_duration: 23.2562
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1265.09 | silence_duration: 17.3959
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1955.02 | silence_duration: 9.70956
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1966.82 | silence_duration: 5.96956
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1974.17 | silence_duration: 7.34687
…
3.FFmpeg用のチャプタファイルを作成
FFmpegに読み込ませるチャプタファイルを作成する。書式はこんな感じ。
;FFMETADATA1
[CHAPTER]
TIMEBASE=1/1000
START=0
END=429216
title=Chapter 1[CHAPTER]
TIMEBASE=1/1000
START=429216
END=745090
title=Chapter 2[CHAPTER]
TIMEBASE=1/1000
START=745090
END=1063420
title=Chapter 3
…
実際には2で作成した、silence_endだけをまとめたテキストをAIにチャプタ情報ファイルを生成して
とお願いすれば簡単につくれる。chapters.txtとして用意しておく。
4.FFmpeg用のチャプタファイルを作成
ffmpeg -i input.mp4 -i chapters.txt -map_metadata 1 -codec copy output_with_chapters.mp4
これでinput.mp4にチャプタを打ったoutput_with_chapters.mp4が出来上がります。