mp4などの動画ファイルから,特定の章(チャプター)を切り出す方法です.
切り出しはffmpegを使うと簡単かつ高速です.音声・画質の劣化もありません.
手順1) チャプター情報の確認
ffmpeg付属のffprobeコマンドを使いチャプターの一覧を確認します
$ ffprobe -i 動画ファイル名
チャプターの一覧は次のような書式になります
Chapters: Chapter #0:0: start 開始時刻, end 終了時刻 Metadata: title : タイトル1 Chapter #0:0: start 開始時刻, end 終了時刻 Metadata: title : タイトル2
これでチャプターを抽出したいチャプターの開始時刻,終了時刻を確認します
手順2) 切り出し
開始時刻,終了時刻を指定して,ffmpegコマンドを使います
$ ffmpeg -ss 開始時刻 -to 終了時刻 -i 元動画のファイル名 -c copy -map 0 -map_chapters -1 新しい動画のファイル名
"-c copy"で,動画の再圧縮なしで新しい動画を作成します.これで画像・音声の劣化は回避できます
補足
シェルスクリプトで上記処理を自動化する際は"-show_chapters"や " -print_format csv " オプションを使うと便利です
$ ffprobe -i 元動画のファイル名 -show_chapters
"-show_chapters"を付与すると,以下の出力が得られます
[CHAPTER] id=0 time_base=1/10000000 start=開始時刻(単位 time_base) start_time=開始時刻(単位 秒) end=終了フレーム番号(単位 time_base) end_time=終了時刻(単位 秒) TAG:title=タイトル [/CHAPTER]
ffprobeは詳細情報を大量に /dev/stderr に出力します."2>/dev/null"をつけます
$ ffprobe -i 元動画のファイル名 -show_chapters 2>/dev/null
さらに"-print_format csv"をつけると,カンマ(,)区切りのテキスト形式に書式が変わります
$ ffprobe -i 元動画のファイル名 -show_chapters -print_format csv 2>/dev/null
シェルスクリプトの場合はcutコマンドでパースすると良いでしょう
$ ffprobe -I 元動画のファイル名 -show_chapters -print_format csv 2>/dev/null | cut -d ',' -f "5,7,8"
$ ffprobe -I 元動画のファイル名 -show_chapters -print_format csv 2>/dev/null \ | cut -d ',' -f "5,7,8" \ | sed -e 's|,| |g' \ | while read start end title; do echo $start $end $title done