携帯なんて大嫌いっ!!!

とあるサイトでFLV動画やMP3などを携帯用に変換するモノを作ってるんだけど、何とかならんか?携帯業界!規格を統一しろっ!って感じw。

まず、各キャリアの資料などから再生に必要な最低ラインを探した。
自分が見るだけなら高レートで変換すれば良いんだけど、出来るだけたくさんの機種で再生できるように最低ラインで組む事に。

キャリア:au:DoCoMo:SoftBank
動画形式:3GPP2:Mobile MP4形式(3gp):3GP
ビデオエンコ:MPEG4 Simple Profile Level1:MPEG4 Simple Profile Level0:MPEG4 Simple Profile Level0
画像サイズ:QCIF:QCIF:QCIF
ビットレート:64kbps:64kbps:64kbps
フレームレート:15fps:15fps:15fps
オーディオエンコーディング:AAC:AAC:AMR-NB
ビットレート:16kbps:16kbps:12.2kbps
サンプリング周波数:22.05kHz:16kHz:8kHz
ファイルサイズ上限:240KB(Wは1.5M):300KB(2MB):200KB

なんじゃ!バラバラやん!!!
とりあえず、映像を3gpと3g2に音声をAACとAMRに出来ればなんとかなりそう。

FFMPEGの最新版をsvnから落とす。「mp3lame・amr-nb・amrwb・FAAC・FAAD2・x264・xvid」のライブラリ群をインストール。インスコしたライブラリを有効にしてコンパイル&インストール。
さぁ!ffmpegで変換っ!

DoCoMo用
ffmpeg -i 入力 -y -async 1 -vcodec mpeg4 -s 176×144 -r 14.985 -b 64 -acodec libfaac -ac 1 -ar 16000 -ab 16k -f 3gp 出力.3gp
au用
ffmpeg -i 入力 -y -async 1 -vcodec mpeg4 -s 176×144 -r 14.985 -b 64 -acodec libfaac -ac 1 -ar 22050 -ab 16k -f 3g2 出力.3g2
SoftBank用
ffmpeg -i 入力 -y -async 1 -vcodec mpeg4 -s 176×144 -r 14.985 -b 64 -acodec libamr_nb -ac 1 -ar 8000 -ab 12.2k -f 3gp 出力.3gp

で、サーバ側に3gpや3g2ファイルが何なのか?とMimeTypeを教えてあげなきゃダメ。
htaccessで

AddType video/3gpp .3gp
AddType audio/3gpp .3gp
AddType video/3gpp2 .3g2
AddType audio/3gpp2 .3g2

を追加する。

まずDoComo用からチェック!
普通にaタグで3gpにリンクを貼る。ファイルサイズが大きすぎてダウンロードできません…
あ、そか。DoCoMoは300kbまでだったので、分割しなきゃダメ。
MP4BoxというGPAC付属のコマンドラインツールで分割できるらしい。

mp4box -splits 300 入力.3gp

すると、「入力_001.3gp」「入力_002.3gp」という風に分割できた。
それをaタグでリンクを貼る。ダウンロード&再生OKっ!
でも、DoCoMoはストリーミング再生てのもあって2MBまでのファイルを再生できる(保存は出来ない)。早速ググってみる。
普通にaタグではストリーミング再生が出来ないらしく、objectタグで行うらしい。

<object declare id=”再生用のID” data=”ストリーミング用.3gp” type=”video/3gpp”>
<param name=”stream-type” value=”10″ valuetype=”data”>
</object><a href=”#再生用のID”>ストリーミング再生</a>

これでOKなはず!
うーん…..再生できない。さらに調べてみる。
ffmpegで変換した3gpはDoCoMo用のatom構造と違うので修正しなきゃダメみたい。
ここで出てくるのは先ほどのMP4Box。

mp4box -add 入力.3gp -brand mmp4:1 -new 出力.3gp

変換された3gpをobjectタグで貼ってみる。
ストリーミング再生成功!(ただし2MBまでw)

次はauだ!
Wシリーズなら1.5MBまで、Aシリーズで240kbまでダウンロード&再生できるのでMP4Boxで3g2ファイルを分割。
それぞれaタグでリンクを貼ってみる。。。。。ダメ。。。。。
auの資料とにらめっこして探してみると、auはすべてobjectタグらしい。

<object data=”ファイル.3g2″ type=”video/3gpp2″ copyright=”no” standby=”再生する”>
<param name=”disposition” value=”devmpzz” valuetype=”data”>
<param name=”size” value=”ファイルサイズ” valuetype=”data”>
<param name=”title” value=”ダウンロード時の名前” valuetype=”data”>
</object>

これで良いと技術資料に書いてある。
うーーーん、ダメ。ダウンロードできるが再生が出来ない。。。
またググってみると、auはatomにau専用のコードに編集しないとダメっぽい。
これもMP4Boxで出来るのか?うーーーん見つからない。
で、見つけたのがこのrubyスクリプト。早速rubyをインスコしてテストっ!
ををーっ!Wシリーズでだけど、1.5MBまでのファイルをダウンロード&再生OK!!!
Aシリーズ用の240kbまでのファイルももちろんダウンロード&再生できた!

あとは、SoftBankだな。でも、SoftBankは資料が少ないなぁ。。。
とりえず、ffmpegで出来た3gpを200kb以下に分割してみる。
aタグでリンクを貼ってみるが、不正なリクエストとな!
またググってみたw。SoftBankの場合、3gpファイル送出の時にヘッダーを追加しないとダメみたい。
幸いApacheにmod_headerが入ってるので、htaccessで3gpファイルにヘッダ情報を追加。

<Files ~ “\.3gp$”>
Header set cache-control “no-cache”
Header set x-jphone-copyright “no-transfer”
</Files>

これで、すんなりダウンロード&再生OKっ!

ふぅ、なんとか形になったようで。。。
Winなら携帯動画変換君やQTConverterとかで出来るんだろうけど、
サーバサイドで変換するんでLinux用にこだわってみた(笑)。
wineとか入れてwinアプリ走らせても良かったんだけど、どうもwineがキライで。。。

この方法だとauとDoCoMoは着信音に設定できませんよ(笑)。
Winマシンでゴニョゴニョすれば出来るらしいけどw。
でも、SoftBankは着信音に設定できるらしい…..

これだけ解決するのに約1週間は費やしたよ…..orz
ホント、規格を統一させてくれよ!と思う今日この頃でした(笑)

(追記 その1)
どうもSoftBankで動画の再生ができないっぽい。。。
何か変換でミスってるっぽい。
とりあえずSoftBank用にも、MP4BoxでAtomタグを追加してみた。

さらに、ストリーミングも対応してるっぽい。
送り出すヘッダの「x-jphone-copyright “no-transfer”」を
「x-jphone-copyright “no-store”」に変えるらしい。

どちらも、ただいま検証中。。。

(追記 その2)
SoftBank用動画にもMP4BoxでATOMタグを追加で再生OK。

mp4box -add 入力.3gp -brand mmp4:1 -new 出力.3gp

SoftBankはストリーミング自体に対応していないみたい。
Yahoo!動画とかではストリーミング再生できるらしいんだけど、一般サイトでは今のところ情報なしで出来ないっぽい。
なので、あっさり諦めてみたw。
そのかわり、最近の3Gでは300kbまでダウンロードできるみたいだから、分割方法を300kbと200kbの2種類を用意してみた。

奥が深すぎるよ、携帯動画…..orz

Leave a comment

Please be polite and on topic. Your e-mail will never be published.