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でも再生できるはずです。

かなり省略して説明しましたがいかがだったでしょうか。もしかして自分でも作れるかも?と思ってもらえたら幸いです。

あわせて読みたい

2件のフィードバック

  1. 名無し より:

    androidでピアキャス配信が出来たら最高だと思います!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です