MP3 ストリーミング
MEMO
by
nabeshima
2003/11/07 15:04:59
MP3とは
Mpeg1 Layer III
MP3ストリーミング
HTTPを使ったストリーミング
RTSP, RTP, RDT, MMS等をHTTP上でクローキング(エンカプセル)
RealNetworks社の場合
二つのHTTPコネクションを使う(POSTを使い、サーバにRTSPリクエストを送信、GETを使いRTSPリプライ、RDTコンテンツを得る。URL名で同期)
POST
クライアント→サーバの通信をHTTP化
例
POST /SmpDsBhgRl HTTP/1.0
141609c1-a365-11d4-e
6c3-0f600d57940a
RTSPリクエスト1
RTSPリクエスト2
…
GET
サーバ→クライアントの通信をHTTP化
例
GET /SmpDsBhgRl141609c1-a365-11d4-e6c3-0f600d57940a HTTP/1.
0
RTSPリプライ1
RDTコンテンツ
RTSPリプライ2
…
メディアオブジェクトをダウンロードしながら、ダウンロードした分をそのまま再生する(On the Fly再生)
補足:On the Fly再生のためのメディアファイル
音声と映像のインターリーブ保存が必要
前半に映像、後半に音声というような形で保存されているメディアオブジェクトは、音声部分に達するまで再生ができない
MP3のファイル構造
フレームの連続により構成
ただし、単独のフレームでは再生できない
1フレーム:1152サンプル(576サンプルx2グラニュール)
サンプリング周波数:44.1KHzとして約0.026秒
ヘッダ、フレーム群、フッタ
ヘッダ(任意)
ID3TagV2等
フレーム
フレームヘッダ:32ビット
同期ワード:12ビット (12ビット連続の1)
ID:1ビット (Mpeg1は0)
レイヤー:2ビット(Layer IIIは1)
保護ビット:1ビット
ビットレート:4ビット
サンプリング周波数:2ビット
パディング:1ビット
プライベート:1ビット
チャネルモード:2ビット
拡張モード:2ビット
コピーライト:1ビット
オリジナル:1ビット
強調:2ビット
CRC
オーディオデータ
フッタ(任意)
ID3TagV1
これは必ずファイルの末尾。つまり、ID3TagV1しか付いていない曲のVODでは、タイトルの表示は不可能
参考リンク
最初から説明するInside MP3
代表的なシステム
サーバ
shoutcast
HTTPを拡張(ICYプロトコル)
icecast
純粋なHTTP+専用ヘッダ
エンコーダ
ices (shoutcast.org)
プレイヤー
winamp
通常のHTTPシステムへの拡張
サーバの拡張
転送速度の制御
56Kbpsでエンコードされたオブジェクトは56Kbpsで転送する
ライブへの対応
他のプロセスからの出力をURLにマッピング(マウント)
メタ情報の配信
プレイヤーの拡張
On The Fly再生をサポート
ネットワークストリームからの再生
オブジェクトをストレージに保管しない
ライブ配信
メタ情報のハンドリング
エンコーダの拡張
擬似ライブ
プレイリストによる複数のMP3ファイルから一本の連続MP3ストリームを作成
メタ情報の埋め込み
メタ情報の扱い
VOD
MP3ファイル中のIDタグを配信(つまり、元ファイルをそのままプレイヤーに送る)
ライブ・擬似ライブ時
配信方法
特定長(icy-metaint値)ごとに、MP3ストリーム中に強制的にインターリーブ
MP3フレームの間に挟みこむのではない。
配信タイミング
接続直後、曲が変わった直後
データ構造
データ長(1バイト):16バイト単位
データ長が0もありえる。この場合メタデータはなし
メタデータ:データ長x16バイト
StreamTitle='title of the song'
サンプル(icy-metaint:16000、128Kbpsで1秒)
mp3データ:16000バイト
メタデータ長:1バイト, 5
メタデータ:80(5*16)バイト
mp3データ:16000バイト
メタデータ長:1バイト, 0
mp3データ:16000バイト
…
システムの起動
icecast -c /etc/icecast.xml
icecast.xml
<paths>
<basedir>/home/icecast</basedir>
<logdir>/log</logdir>
<webroot>/web</webroot>
<adminroot>/admin</adminroot>
</paths>
<chroot>1</chroot>
<group>nobody</group>
ices -c bluenote.conf
bluenote.conf
<Playlist>
...
<File>/home/icecast/ices/bluenote.txt</File>
...
</Playlist>
<Stream>
...
<Mountpoint>/bluenote</Mountpoint>
...
<Stream>
/home/icecast/ices/bluenote.txt
/home/icecast/content/hoge1.mp3
/home/icecast/content/hoge2.mp3
/home/icecast/content/hoge3.mp3
...
HTTPストリーミングの保存
VOD
完全なコピーが可能
ライブ・擬似ライブ
フレーム部分はコピー可能
曲の切れ目は不完全(曲の切れ目は、メタ情報で識別可能。しかし、そのメタ情報は固定バイト単位での挿入であれり、フレーム間への挿入ではない)
TAG情報は喪失
ソフト
Mp3 StreamRecorder
StreamRipper
shoutcast プロトコルサンプル
Player -> Server
GET /content/scpromo.mp3 HTTP/1.0
Host: gw
User-Agent: WinampMPEG/2.9
Accept: */*
Icy-MetaData:1
Connection: close
Server -> Player
ICY 200 OK
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.2<BR>
icy-name:N/A - scpromo.mp3
icy-genre:N/A
icy-url:http://www.shoutcast.com
icy-pub:0
icecastプロトコルサンプル
Player -> Server
GET /bluenote HTTP/1.0
Host:192.168.0.1
Accept:*/*
User-Agent:Nullsoft Winamp3 version 3.0d build 488
Icy-Metadata:1
Server->Player
HTTP/1.0 200 OK
Content-Type: audio/mpeg
icy-br:128
icy-description:Default description
icy-genre:Default genre
icy-name:Default stream
icy-public:0
icy-url:http://localhost/
icy-metaint:16000
Server: Icecast 2.0-alpha2/cvs
MP3データ
http://jicyshout.sourceforge.net/oreilly-article/java-streaming-mp3-pt2/java-streaming-mp3-pt2.html