試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

zoomeとSMILEVIDEOへアップロードする動画の再エンコード回避に関する覚え書き(2009/8/21現在)

以前、mencoderエンコードした動画(映像:H.264/音声:AAC/コンテナ形式:MP4)を動画共有サイトzoomeへアップロードするテストを行ったことがあるのだが、サーバ上で再エンコードされない条件を満たしているはずなのに何故かサーバ上でエンコードされてしまっていた。
ところが、色々調べていると、「H.264の映像とAACの音声を別々にエンコードしてGPAC(gpac.sourceforge.net/)のMP4Boxコマンドを利用することでうまくいった」という情報があり、色々試した結果、再エンコードされない動画が作成できるようになり、同じ要領でSMILEVIDEOへアップロードする動画についてもうまくいっている。
SMILEVIDEOではビットレートによっては混雑時の低品質(エコノミー)モードを回避することもできるので、動画の内容(例えば音声がメインで映像がほとんど動かないもの)によっては調整しておくと便利なことがある。

  1. 準備
    1. ffmpegのAACエンコード(libfaac)サポートの確認
    2. GPAC
  2. サーバ上で再エンコードされない条件について
  3. 作成手順
  4. 作成実行例
    1. SMILEVIDEO
    2. zoome
    3. 以前失敗した方法

準備

ffmpegAACエンコード(libfaac)サポートの確認
-formatsオプションを付けたときに「libfaac」の記述があればOK。

$ ffmpeg -formats | grep faac             
FFmpeg version SVN-r14161, Copyright (c) 2000-2008 Fabrice Bellard, et al.
  configuration: --prefix=/usr --enable-shared --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include --enable-liba52 --enable-postproc --enable-gpl --enable-pthreads --enable-libnut --enable-libtheora --enable-libvorbis --enable-x11grab --enable-swscale --enable-libmp3lame --enable-libfaad --enable-libfaac --enable-libx264 --enable-libxvid
  libavutil version: 49.7.0
  libavcodec version: 51.60.0
  libavformat version: 52.17.0
  libavdevice version: 52.0.0
  built on Jan 16 2009 00:42:25, gcc: 4.3.2
  EA    libfaac         libfaac AAC (Advanced Audio Codec)

もしなければ

  • libfaacが(開発パッケージを含め)システムにインストール済みの場合: ffmpegのみ--enable-libfaacオプション付きでビルド
  • libfaacがない場合: 上記の前にlibfaacをビルド・インストールしておく

となる。
Gentoo Linuxでは「USE=faac」指定が必要で、Mandriva LinuxではPLF版を用いるとlibfaacサポート付きとなる。

GPAC
MP4コンテナ(入れ物)形式の操作/情報表示などを行うツール群GPACは、Mandriva LinuxではPLFのメディアで、Gentoo Linuxでは標準で利用可能となっているが、その他多くのディストリでは手動でビルド・インストールすることになるかもしれない。

サーバ上で再エンコードされない条件について

SMILEVIDEOについてはニコニコ動画まとめWikiのエンコード設定ページが詳しく、zoomeではFAQに条件を載せていた。ただしいずれもサービスにおけるサポート対象ではない(無保証)。
特に、SMILEVIDEOではファイルサイズ制約が厳しめなので、動画の時間が長くなる場合は細切れにするか品質を犠牲にするかの選択をしなくてはならないこともある。

作成手順

  1. x264サポート付きmencoderで元の動画(映像 + 音声)から映像部分のみをx264で2passエンコード
  2. libfaacサポート付きffmpegで同ファイルから音声部分のみをAACエンコード
  3. MP4Boxで映像と音声をMP4コンテナへ入れる

mencoderでもAACへオーディオをエンコードできるが、出力ファイルに映像がないといけない(オーディオのみをエンコードして書き出すことができない)ため、オーディオのエンコードにはffmpegを使用する。

作成実行例

2passのログファイルは別途-passlogfileオプションで指定してもOK。既定のファイル名はdivx2pass.logだが、DivXとの関係はない。
本記事中のx264エンコードオプションは「mencoderのx264エンコードオプションに関する覚え書き(2009/8/20現在)」に書いたものを参考にしているが、これが最適なものという保証はなく、本当に最適な出力を得るためには更に高度なオプション指定が必要な場合もある。
なお、以下の作業において、フレームレートは30としているが、必要に応じて「30」の部分を置き換えることにより別のフレームレートを用いることもできる(zoomeでは再エンコードされないときにフレームレートが任意)。

SMILEVIDEO
再生領域が512x384なのでこれに合わせるように縮小している。元のサイズは4:3の前提。
ビットレートは映像512k/音声96kとしている。実際にはエンコードする動画によって調整する。

$ mencoder -nosound -ovc x264 -vf scale=512:384,harddup -ofps 30 -x264encopts bitrate=512:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate:pass=1:turbo=1 [入力ファイル] -of rawvideo -o /dev/null
$ mencoder -nosound -ovc x264 -vf scale=512:384,harddup -ofps 30 -x264encopts bitrate=512:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate:pass=2:subq=7 [入力ファイル] -of rawvideo -o video.264
$ ffmpeg -i [入力ファイル] -y -vn -f mp4 -acodec libfaac -ab 96k audio.aac
$ MP4Box -fps 30 -add video.264 -add audio.aac -new [出力ファイル].mp4
$ rm divx2pass.log video.264 audio.aac -f

zoome
下の例では-vf scale=[横]x[縦]によるサイズ変更はしていない。出力後のサイズによっては

x264 [warning]: width or height not divisible by 16 (800x600), compression will suffer.

というメッセージが映像のエンコード時に表示されるが、これは(上の場合)「600」が16で割り切れないので圧縮しにくい(?)ということを知らせているもので、出力される動画におかしなところが出たりするものではない。
ビットレートは映像1344k/音声128kとしているが、映像ビットレートはもっと低くてもOK。

$ mencoder -nosound -ovc x264 -vf harddup -ofps 30 -x264encopts bitrate=1344:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate:pass=1:turbo=1 [入力ファイル] -of rawvideo -o /dev/null
$ mencoder -nosound -ovc x264 -vf harddup -ofps 30 -x264encopts bitrate=1344:bframes=4:b_pyramid:me=umh:weight_b:frameref=6:nofast_pskip:nodct_decimate:pass=2:subq=7 [入力ファイル] -of rawvideo -o video.264
$ ffmpeg -i [入力ファイル] -y -vn -acodec libfaac -ab 128k audio.aac
$ MP4Box -fps 30 -add video.264 -add audio.aac -new [出力ファイル].mp4
$ rm divx2pass.log video.264 audio.aac -f

以前失敗した方法

$ mencoder -nosound -ovc x264 -of lavf -lavfopts format=mp4 -vf harddup -ofps 30 -x264encopts bitrate=[中略]:pass=1:turbo=1 [入力ファイル] -o /dev/null
$ mencoder -oac faac -ovc x264 -of lavf -lavfopts format=mp4 -vf harddup -ofps 30 -x264encopts bitrate=[中略]:pass=2:subq=7 -faacopts br=[オーディオビットレート] [入力ファイル] -o [出力ファイル].mp4
$ rm divx2pass.log -f

mencoderの出力するMP4コンテナがおかしいと判断したが、もしかするとどこかの指定がおかしいのかも知れない。


(2009/8/24)mencoderのみで出力した動画をmplayerで再生すると、再生終了時に

FAAD: error: Unable to find ADTS syncword, trying to resync!
FAAD: Failed to decode frame: Unable to find ADTS syncword 

というメッセージが何度も繰り返し出力されていた。

関連URL:

  • youcharmanums.blog2.fc2.com/blog-entry-582.html - 縦横の比率を黒く塗り潰して調整したい場合の参考

使用したバージョン:

  • MPlayer 1.0-1.rc2.18.2plf2009.0
  • FFmpeg 0.4.9-3.pre1.14161.1.1plf2009.0
  • libfaac 1.26-4plf2009.0
  • libx264 0.59.2245-1plf2009.0
  • GPAC 0.4.5-1plf2009.1