LinuxでH.264動画を扱う

H.264とは?

H.264は映像圧縮規格の1つです。またの名を、MPEG-4/AVCと言います。動画圧 縮規格なので、MPEG-2やVC-1の仲間です。地上デジタル放送、Blu-ray Discや HD DVDの符号化方式に採用されたことから、今後MPEG-2に代わって標準的に使 われていくことが予想されます。

Linuxでも、再生と圧縮ぐらいはできるということで、取り上げてみます。

H.264動画を再生する

MPlayerや、ffmpegに含まれるffplay を使えば、 H.264動画を再生することができます。とっても簡単なので、これ以上の説明 は無し。

H.264動画を作る(簡易版)

ffmpegを使うと、以下のように簡単にH.264映像とAAC音声へと変換できます。 ただし、細かな設定はできません(たとえば、interlaceを指定できない)。ま た、この方法で作ったoutput.mp4は、fileの一部が欠けた状態では再生できま せん。特に問題となるのは、Internetからdownloadしながら再生しようとした 場合でしょう。downloadが完了するまで全く再生できないのはちょっと不便で す。
このような制限が障害となる場合は、次の詳細版を試してください。

$ ffmpeg -i input.avi -f mp4 -vcodec h264 -qscale 20 -acodec aac -ab 128 output.mp4

H.264動画を作る(詳細版)

H.264符号化方法を細かく指定したい場合は次のようにします。まずffmpegで 元の映像を復号して非圧縮のYUV形式にし、それをx264を使ってH.264符号化し ます。こうすることで、x264とfaacで設定できる項目を全て指定することがで きます。

映像部分をH.264に変換する

x264は、入力file名から入力形式を判断します。file名を"*.y4m" にしないとyuv4mpegpipe形式での入力ができないため、pipe入力をうまく扱え ません。そのため、ちょっと強引ですが/dev/stdinのsymbolic linkを作って 対処しています。代わりにmkfifoでnamed-pipeを作って使っても良いでしょう。

$ ln -sf /dev/stdin stdin.y4m
$ ffmpeg -i input.avi -v 0 -f yuv4mpegpipe -vcodec rawvideo -an /dev/stdout | \
  x264 -B 300 --progress -p 1 -o output.264 stdin.y4m
$ ffmpeg -i input.avi -v 0 -f yuv4mpegpipe -vcodec rawvideo -an /dev/stdout | \
  x264 -B 300 --progress -p 2 -o output.264 stdin.y4m

音声部分をAACに変換する

--no-midsideを付けないと、mplayerやffplayで再生するときに"faac: frame decoding failed: Gain control not yet implemented"という表 示が出て音飛びしてしまいます(再生側の問題ですが)。

$ ffmpeg -i input.avi -v 0 -f wav -vn -acodec pcm_s16le /dev/stdout | \
  faac -b 128 --no-midside --mpeg-vers 4 --obj-type LC -o output.aac - 

映像部分と音声部分をまとめて、ひとつのISO-MPEG4形式にする

ISO-MPEG4を作るtoolは、 MPEG4IP に含まれる mp4creatorとGPACに含まれる MP4Boxがあります。それぞれ使い方を示します。

$ mp4creator -create=output.264 -timescale=29970 -rate=29.97 output.mp4
$ mp4creator -create=output.aac output.mp4
$ mp4creator -optimize output.mp4
$ MP4Box -inter 5000 -isma \
         -add "output.264#video:fps=29.97:par=1" \
         -add "output.aac#audio" \
         -new output.mp4

QuickTime 7で再生できるH.264

H.264を再生可能なplayerで最も普及していそうなものはAppleのQuickTime 7 でしょう。ということで、QuickTime 7で再生できるように変換を行ってみま す。

QuickTime 7では、H.264 Main profileまで実装しています。High profileに は対応していません。また、Main profileでも一部非対応の機能があります。
具体的に、以下のものを指定するとQuickTime 7で再生できません。

私がQuickTime 7で再生できる映像を作る場合、以下のようにしています。

x264 -B 1000 -A p8x8,b8x8,i4x4,p4x4 -b 3 --weightb --b-adapt 2 --b-pyramid \
     --mixed-refs --ref 4 -m 9 --me umh -t 1 --level 3

H.264動画の編集

そもそも、Linux上で動く動画編集softwareが少ないのですが、以下にあげる ものはH.264を扱うことができます。


ご意見、ご感想は、花房 真広 <webmaster@hanabusa.net>まで。メールする前にtop pageの注意書を読んでください。