androidでピアキャス配信するアプリを作る 2
前回の続き
これからなにをするかというとandroid上で動作するffmpegに対応するffserverの部分を作ります。ffmpegはエンコーダなのでサーバの機能はありません。peercastで配信するためにはストリーミングサーバを作る必要があります。
ストリーミングサーバを作るというとものすごいことのように聞こえますが、ストリーミングするデータはffmpegが作っているのでそのデータの先頭に12バイトのストリーミングヘッダをくっつけるだけです。
さてここで少しasfの説明をします。前回wmvのストリーミングとか言いましたが具体的にはasfコンテナにwmvやwma形式でエンコードされたデータが入っているもののことです。
asfストリーミングヘッダについて
asfストリーミングヘッダにはいくつか種類があり、基本的にはASF_STREAMING_HEADER、ASF_STREAMING_DATA、ASF_STREAMING_END_TRANSの3つを使います。ヘッダサイズは12バイトで次のような形式になっています
type (2byte)
size (2byte)
sequence_no (4byte)
unknown (2byte)
size (2byte)
type
[0x24 0x48]=$H ASF_STREAMING_HEADER
[0x24 0x44]=$D ASF_STREAMING_DATA
[0x24 0x45]=$E ASF_STREAMING_END_TRANS
size
sequence_no以降のヘッダサイズ+データ本体のサイズ
つまりデータ本体に+8
sequence_no
データ毎に+1していく
unknown
ASF_STREAMING_HEADERのときだけ0x00 0x0C
それ以外は0x00 0x00
size
上と同じもの
ffmpegで送られてくるチャンクの最初がヘッダ、最後がエンド、それ以外はデータです。ヘッダチャンクはビデオやオーディオのコーデック情報が含まれるので保存しておきます。データチャンクは数が増えてきたら古いものから消していきます。キーフレームなどを考慮する必要はありません。エンドは仕様なのかミスなのかわかりませんがストリーミング用のヘッダが最初からついていました。
ffmpegからデータを受信してストリーミングヘッダをつけたデータを用意できたらいよいよピアキャストに送信する部分です。ピアキャスで配信を始めるときに入力するストリームURL(普段はWMEのアドレス)に今作ったサーバのアドレスを入れ配信を開始すると
GET / HTTP/1.0 Host: 192.168.0.10:8080 Connection: close Accept: */* User-Agent: NSPlayer/4.1.0.3856 Pragma: no-cache,rate=1.000000,request-context=1 Pragma: xPlayStrm=1 Pragma: xClientGUID={c77e7400-738a-11d2-9add-0020af0a3278} Pragma: stream-switch-count=2 Pragma: stream-switch-entry=ffff:1:0 ffff:2:0
のようなHTTPリクエストがくるので、それに対するHTTPレスポンスは
HTTP/1.0 200 OK Server: Rex/11.0.5721.5275 Cache-Control: no-cache Pragma: no-cache Pragma: client-id=1977717453 Pragma: features="broadcast,playlist" Content-Type: application/x-mms-framed
のようになります。あとはストリーミングヘッダとデータを順番に送信します。うまくいけばピアキャスだけでなくwmpでも再生できるはずです。
かなり省略して説明しましたがいかがだったでしょうか。もしかして自分でも作れるかも?と思ってもらえたら幸いです。
androidでピアキャス配信が出来たら最高だと思います!
ですよね!