読者です 読者をやめる 読者になる 読者になる

音声がQCELPのAMCをデコードする

ffmpeg Mobile

auの技術資料にある通り、auの一部の機種ではAMC形式の動画が使われており、音声部のコーデックには通常のFFmpegでは扱えないQCELPもあるので、FFmpegを使って3キャリア対応の携帯動画サイトを作ろうとすると困ったりすることがあります。

音声部がQCELPのAMCをffmpegで変換しようとすると、"Unsupported codec"というエラーで変換処理が止まってしまいます。mencoderで無理やり変換することもできますが、音声が正常に出力されないので微妙に悲しい思いをします。以下は、某写真共有サイトにおいて、mencoderで無理やり変換をかけて、さらにFLVに変換している例です。

http://photozou.jp/photo/show/96287/7611736

MixiGREEではこうした動画もちゃんと変換できていたので、どうやっているのかなぁと調べていて、結局のところMixiGREEのやり方は分かりませんが、一番手っ取り早いのは、昨年のGoogle Summer of Codeの成果物であるQCELPデコーダーを使うのが早いという結論に達しました。

ビルドする

レポジトリからコードをチェックアウトして、ソースコード中のsrcprepare.shを実行して、FFmpegにパッチを当てた上でFFmpegをビルドします。

$ svn co svn.mplayerhq.hu/soc/qcelp
$ cd qcelp
$ ./srcprepare.sh /home/perezvon/src/ffmpeg
$ cd trunk
$ ./configure && make

上の例のうち、"/home/perezvon/src/ffmpeg/trunk"というパスはFFmpegのtrunkをチェックアウトしたパスです。詳しくはqcelpのREADMEやsrcprepare.shを参照してください。

また、./configureオプションは省略していますが、faac, faad, libamr_nb等も必要にあわせて設定します。環境や目的に応じて必要なオプションは異なってくるでしょうが、携帯動画対応という観点でいうならば以前のエントリで紹介したオプションは最低限必要です。

変換してみる

無事ビルドが完了したら、問題のAMCをFFmpegで3gpに変換してみます。

$ ffmpeg -y -i ~/test.amc -vcodec mpeg4 -acodec libamr_nb -ar 8000 -ab 12.2k -ac 1 -f 3gp ~/out.3gp

変換結果の3GPを某写真共有サイトにアップロードした結果がこれです。

http://photozou.jp/photo/show/96287/7617709

カチッ、カチッというノイズが入っていますが、これはffmpegで出力した3GPの音声自体がそうなっているためです。いくつかAMCファイルの変換をかけてみましたが、このようにノイズが入ってしまったり、ある程度普通に変換できても、QuickTime Proで変換をかけたより明らかに質が低かったり、あるいは、まったく音声が消えてしまったりということもありました。総じて、エラーになるよりはまし、といった感じです。

まとめ

よっぽど会員数が多いサイトじゃないかぎり、AMCにまともに対応する必要はないと思います><