Linux+PHPで携帯向けの動画配信のスクリプトを作りました。
docomo,au,softbankの3社の3G携帯に対応しました。
結構苦戦したのでメモっておきます。
構築環境
CentOS 5
PHP 5.1.6
Apache 2.2.3
ちなみに動画はffmpegでエンコードしてます。
3キャリアの動画形式
2008年11月現在で調査した内容です。
フォーマットに関してはどのキャリアもMP4系で似たり寄ったり。
docomo
[参考]コンテンツ仕様 | サービス・機能 | NTTドコモ
コンテナ形式は3gppでMIMEタイプはvideo/3gpp。
容量は多くの機種で500KBまで。最近の機種は10MBまで対応。
au
[参考] KDDI au: 技術情報 > EZムービー
コンテナ形式は3gpp2でMIMEタイプはvideo/3gpp2。
容量は1.5MBまで。
softbank
[参考] ムービー TOP
コンテナ形式は3gppでMIMEタイプはvideo/3gpp。
容量は300KBまで。
最大容量がまちまちなのが厄介。
とりあえず、3つとも別々にエンコードするようにしました。
ダウンロードのさせ方
docomo
[参考] コンテンツ配信 | サービス・機能 | NTTドコモ
通常はAタグでリンクするだけ。コピー制限や再生回数制限を付けたいときは更にobjectタグを追加する。
au
[参考] KDDI au: 独自拡張タグ・特徴のあるタグ > <object>タグ
objectタグを使う。なのでPCのブラウザでは表示できません。
softbank
Aタグでのリンク。
制限を掛けるのは面倒なので今回はオミット。
auだけ特殊。なのでダウンロードページの生成の時点でキャリア別の動作を分けをする必要があります。
正しいHTTPレスポンスヘッダに正しいMIMEタイプを付ける必要があります。
とりあえず実機でダウンロードさせてみる
単純にキャリアを判別して適当なContent-Type、Content-Lengthをレスポンスヘッダに付けてファイルを送出するスクリプトを作りました。
キャリア判別方法についてはググれば沢山でてくると思うので、特に記述はしません。
以下、ファイルの送出部分のみのソースコード。($file_path
, $mime_type
には本来キャリアごとの動画ファイルのパス、適切なMIMEタイプが入る)
// docomoやsoftbankの場合
$file_path = "/path/to/movie.3gp";
$mime_type = "video/3gpp";
$file_size = filesize($file_path);
if (($fp = fopen($file_path, "rb")) === false) {
header(" ", true, 404);
die;
}
header("Content-Length: " . $file_size);
header("Content-Type: " . $mime_type);
// ファイル内容出力
echo fread($fp, $file_size);
flush();
fclose($fp);
docomo
500KBまでは普通に落とせました。
しかし、それ以上の容量となるとなぜか失敗します。試しにスクリプトを通さないで直接ファイル指定してみたらダウンロードは成功しました。ちょっちApacheログを覗いてみます。
... GET "/path/to/movie.3gp HTTP/1.1" 200 658457 ...
... GET "/path/to/movie.3gp HTTP/1.1" 206 656997 ...
どうも2回リクエストしているようです。1回目はHTTPステータスコードが200、2回目は206となっています。
1回目は動画ファイルの全体の容量を送出していますが、2回目は部分リクエストされているようで、若干送出しているデータサイズが少なくなっています。
ダウンロードに失敗するときは最初の2KBくらいまではメータに表示されるので、おそらくヘッダ部分のみを解析してると思えます。
ということは、Apacheでは自動的に対応している部分リクエストに対して、PHPでも同様の処理をするようにしなければならなそうです。
au
直接ファイル指定でダウンロードはうまくいきますが、PHPスクリプト経由では失敗します。再びApacheログを参照してみます。
... HEAD "/path/to/movie.3g2 HTTP/1.1" 200 - ...
... GET "/path/to/movie.3g2 HTTP/1.1" 206 129536 ...
... GET "/path/to/movie.3g2 HTTP/1.1" 206 129536 ...
... GET "/path/to/movie.3g2 HTTP/1.1" 206 129536 ...
... GET "/path/to/movie.3g2 HTTP/1.1" 206 123827 ...
最初にヘッダだけ取得してから分割してリクエストしているようです。こちらもdocomoと同様に部分リクエストに対応する必要がありそうです。
softbank
PHPスクリプトはそのままで容量制限の300KBに近い容量のファイルを一発でダウンロード&再生できました。特に問題はなさそうです。
次回はこれらの情報を元にスクリプトを改良します。
コメント