
【備忘録】マルチストリーム動画を複数の動画ファイルに分割する
こんにちは.あめんぼです.
情報工学で画像処理の研究を行っている修士一年生です.
先日,大学時代の友人からとある依頼が来ました
友人「手元にマルチストリームで記録された車載動画のファイル(AVI)があるんだけど,これ各ストリームごとにスプリットできない??」
専門用語が多すぎるので,少し解説しますね.
マルチストリーム動画とは?

通常動画は1ファイルに対して一つファイルが存在しています.
しかしながら,例えば車載カメラなどの一つの機器に対して複数のカメラを搭載している端末だと,映像データは複数だけど,これを1つのファイルに集約したいよね.という需要が発生します.
こういった場合,複数の動画を一つの動画ファイルにまとめたファイルのことをマルチストリームといいます.車載以外にも,業務用の多眼カメラなどはマルチストリームで記録されたりするものもあります.フォルダを分けて記録してくれればいいのに!!と思いますが,それは野暮です.
私は,情報工学出身なので,こういった特殊なファイルに出会うことが多々あるわけです.まぁ通常生活してればなかなか見れない代物ですね.
今回はFFMPEGと呼ばれるツールを使ってこのマルチストリーム動画を複数の動画ファイルに分割する方法を備忘録として残しておきます.
ちなみにFFMPEGはMac/Windows/Linuxで使える便利な動画編集ツールなので,環境構築が済んでない人は入れてみてください.CLIで少し取っ付きづらいツールですが,慣れると色々コマンドから命令できて便利です.
入力するコマンド
さて本題です(笑)
マルチストリーム動画から,実際にそれぞれストリームでスプリットをかけます.
まず,それぞれのストリームがどこにマッピングされているのか調べます.
ffmpeg -i .\INPUT.AVI # INPUT.AVI(入力動画のパスに任意に置き換え)
ffmpeg -i でファイルの情報を実際に見ることが出来ます.

実際に出力されたデータを見てみました.このStream #0:0,#0:2が今回の抽出したい動画データです.
ここまでわかれば,あとは-mapで抽出することが可能です.
ffmpeg -i .\INPUT.AVI -map 0:0 -c copy stream0_1.avi
このMapの部分が先程抽出したStreamに紐づけられているので,実際に動かすときは動画のストリーム情報に応じて,変更してください.
また,近年の動画編集ソフトはaviファイルの直接編集には対応していないので,-c:vを使ってH264形式に再エンコードすると更に扱いやすくなるかと思います.
変数にストリーム情報を取り出せばForループでスクリプトも出来そうですね.それでは.