search
LoginSignup
6

More than 5 years have passed since last update.

posted at

ffmpegでmp4をdemuxしたりmuxしたり

ネクストスケープ配信事業本部のAdvent Calendar 2016の1日目って事で、この先のハードルを上げない為にも
低空飛行で始めます。

ffmpeg

動画配信の仕事をしていれば、必ず一度は使う事になるだろうこのツール。
個人的には、アウトプットされるmp4に癖が有ったりして余り好きでは無いのですが、有用なツールであるのは確かなので
局地的に使用しています。

mp4をdemux

最近は配信方法にMPEG-DASHが使われる事が多いですが、世に出ているMPEG-DASHのプレーヤーのほとんどはmuxされたmp4の
再生に対応していないと思います。(自分は見たことがありません)

一方で配信システム側に納品されるmp4が必ずdemuxされているとは限らないわけで・・・
その様な時は、受け取った側でdemuxして映像トラックのみのmp4と音声トラックのみのmp4に分離してあげる必要があります。
そんな時に使えるツールの一つが、ffmpegです。

・最初のトラックを分離

ffmpeg -i some_muxed.mp4 -map 0:0 -codec copy some_first_track.mp4

・2番目のトラックを分離

ffmpeg -i some_muxd.mp4 -map 0:1 -codec copy some_second_track.mp4

こんな感じでコマンド実行すればdemux出来ます。

-mapに設定する x:x は、

ffmpeg -i some_muxed.mp4

でファイル情報を出力した際の

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'some_muxed.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01T00:00:00.000000Z
    encoder         : Lavf52.62.0
  Duration: 00:00:52.21, start: 0.000000, bitrate: 2240 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2108 kb/s, 24 fps, 24 tbr, 24 tbn, 48
tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler

Stream #x:xの部分を設定します。

mp4をmux

余り使う機会は無いと思いますが、ffmpegを使ったmp4のmuxの方法も書いておきます。

コマンドとしては、

ffmpeg -i some_muxed_0.mp4 -i some_muxed_1.mp4 -map 0:0 -map 1:0 -codec copy new_muxed.mp4

some_muxed_0.mp4のStream #0:0とsome_muxed_1.mp4のStream #1:0をmuxする、という処理になります。

さて、

此処まで書いておきながら、自分はmp4のdemuxにffmpegは使っていなかったりします。
コマンドが長かったりするせいも有るのですが、経験上、出来てくるmp4の互換性に若干の不安があるからだったりします。

自分が普段使っているのはmp4boxで、mp4boxだとコマンドは

mp4box -single 1 some_muxed.mp4 -out some_track_1.mp4
mp4box -single 2 some_muxed.mp4 -out some_track_2.mp4

みたいになります。-singleの後の数値は、mp4から抜き出すトラックのIDになります。
他にも別なアプローチで、

mp4box -rem 2 some_muxed.mp4 -out some_track_1.mp4
mp4box -rem 1 some_muxed.mp4 -out some_track_2.mp4

こんな風にdemuxすることも可能です。
これは指定されたトラックIDをmp4から削除する形でdemuxを実現しています。

mp4boxはmp4boxで、トラックIDを予め知っていないと色々と不便なのですが・・・
トラックIDは必ずしも1から始まるとは限りませんし、MPEG-2 TSから変換されたmp4だとPIDがそのままトラックIDに
なっていたりする場合もありますから。

と言う事で

ゆるーく低空飛行で始まったネクストスケープ配信事業本部のAdvent Calendar 2016、この先しばらくよろしくお願いします。
自分は、ぽつぽつと空いている日にゆるーく小ネタを投下していく予定です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6