「zdr-015」タグアーカイブ

ffmpeg の map オプション

先のエントリで書きましたが、私のドラレコは 1 つの AVI ファイルにフロントとリアの画像をパッケージングして保存しています。分離する方法を書きますね。

複数の音声が入っている動画というのはありますね。副音声と言われるヤツです。動画でも昔マルチキャプチャーの動画がパッケージングされたものがありました。理屈は一緒ですね。ストリーム分離というキーワードで検索すると、音声の方を分離する方法があります。ただ、基本的にファイルの中のストリームを分離するのは、動画であろうが音声であろうが理屈は一緒です。

そこで、 sample.AVI( フロントとリアのストリームが同梱されたファイル ) を分離してみようと思います。以下コマンドラインでの入力です。

まず、 sample.AVI のストリーム状況を確認します。

ffmpeg -i sample.AVI

単純に入力のみを指示すると、そのファイルのストリーム状況が表示されます。こんな具合ですね。

Input #0, avi, from '2019_04_27_11_53_20_Nor.avi':
  Duration: 00:00:30.63, start: 0.000000, bitrate: 9318 kb/s
    Stream #0:0: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1280x720, 3951 kb/s, 19.10 fps, 19.08 tbr, 19.10 tbn, 38.20 tbc
    Stream #0:1: Video: h264 (High) (H264 / 0x34363248), yuv420p(progressive), 1280x720, 3932 kb/s, 19.10 fps, 19.08 tbr, 19.10 tbn, 38.20 tbc
    Stream #0:2: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
    Stream #0:3: Subtitle: none, 21 kb/s

この例だと、

  • ストリーム  #0:0 :動画 ( フロントの動画 )
  • ストリーム  #0:1 :動画 ( リアの動画 )
  • ストリーム  #0:2 :音声 ( フロントで録音された音声 )
  • ストリーム  #0:3 :不明なストリーム ( ※ )

※本来ならば、リアで録音された音声ストリームになるはずですが、多分私の環境下では結線されていないなどの理由で不明になるものと思われます。

ここまでわかってしまえば、分離するのは簡単です。 map オプションは出力するストリームを指定するものなので、リアカメラの映像のみを出力するには、

ffmpeg -i sample.AVI -map 0:1 output.AVI

これで出力されるはずです。やってみたら、できました!

後は、フロントとリアのストリームを別々に保存した動画を作るスクリプトを作ればいいだけです。「ストリーム」という単語がわからなかったので、検索してもなかなか引っかかってくれませんでした。これでリアカメラの映像も簡単に取り出せます。アプリを使った分離でも分離はできるのですが、マウスクリックやらなんやらが必要で、面倒だったんです。コマンドラインで処理なら 1 度ひな形を作ってやれば次から簡単ですし、繰り返しも簡単です。良かった。


コップを唇に持っていく間隔までには多くの失敗がある。

イギリスの諺

ドライブレコーダー

姪が自動車屋さんに就職しまして、それもあって自家用車にドライブレコーダーをつけることにしました。昨年末に事故にあったことも理由の 1 つ。

ただつけただけだと面白くないので、動画を加工してみました。自宅からラーメンを食べに行って、戻る間を 10 倍速でお届けします。

私の取り付けたドライブレコーダーは、 ZDR-015 という機種です。この機種はけっこう人気があるみたいですね。手軽ですからね。ところでこの機種、ファイルフォーマットは AVI を使っています。それはいいのですが、リアカメラの映像をフロントカメラの映像の中にトラック 2 として取り込んでいるという、特殊なフォーマットになっています。昔マルチビジョンとか言う名前で出ていたものと似ていますね。フロントカメラの映像は加工しやすいのですが、リアカメラの映像を取り出そうとして四苦八苦してしまいました。「ドラレコ ZDR-015 の前後カメラ 2 映像を別々のファイルに分離する方法 - デフよん」というそのものズバリのページを見つけて分離に成功しましたが、なんせ 30 秒 1 ファイルです。数が多い。数が多くても、コマンドラインで処理できればなんてことないのですが、 ffmpeg で分離する方法が見つからなかったのです。

分離できてしまえば後の処理は ffmpeg でできます。何とかコマンドラインで分離する方法ないですかね。

追記:見つけました。 map オプションを使えばいいんだ。詳しくは別のエントリで書きます。


常識の有無は教育の有無とは関係ない。

ユゴー