RTMP

ここはRTMPのまとめページ(予定)です。

DarkOmemeが主にネットで収集したRTMPに関する情報をまとめたんで
興味がある方は参考にしてみてくだしあ。

RTMPパケット構造

一応説明しますと、RTMPパケットとは、RTMPパケットヘッダとRTMPパケット本文という二つの部分に分けることができます。

1 or 4 or 8 or 12 byte N byte
RTMP Header RTMP Body

ヘッダのサイズは最大で12バイトです。
本文のサイズは任意ですが、チャンクサイズと呼ばれる本文を分割するサイズが決まっている(自分で設定することもできる)ので
そのチャンクサイズ毎、区切って送信する必要があります。

ま、詳しくはチャンクサイズの説明で。

RTMPパケットヘッダ

これがRTMPパケットのヘッダ情報

1 2 3 4
packetType
(2 bit)
amfID
(6 bit)
time
(24 bit / big endian)
body size
(24 bit / big endian)
dataType
(8 bit)
object id
(32 bit / little endian)

packetType (2 bit)

RTMPヘッダのサイズはpacketTypeによって、4種類に分かれます。

packetType ヘッダサイズ ヘッダ情報の内訳
0 12 byte packetType, amfID, time, body size, dataType, object id
1 8 byte packetType, amfID, time, body size, dataType
2 4 byte packetType, amfID, time
3 1 byte packetType

こんな感じ。

通常のサイズが12 byte。ただ、前のヘッダ情報と同じ場合は省略して8 byte や 4 byte になる。

1 byteになるのは、大きなデータを送る時。(詳細はチャンクサイズの説明の時に)

amfID (6 bit)

この部分は、僕はあまり理解してません。
どうもパケット自体のIDらしいのですが、ある条件さえ満たせばIDが重複してもいいようです。
というか、値域が0~31までなので、重複しないとなんもできません。

なんか、知っている人いらっしゃったら、教えてプリーズ。

time (24 bit / big endian)

これは、フレーム間の時間です。たぶん。
今回は動画ストリーミング目的で調べてたんですが、動画を送る時はフレーム間の時間をミリ秒で指定してました。
例えば、30fpsの動画の場合は33なんかを指定すればそれらしく見えるはずです。
big endian は、まあ、適当にwikipedia教授に聞いてください。
その方が確実に最ももっともらしい知識が得られます。

簡単に説明すると、3バイト長の整数データがあったとして、big endianの場合は0×123456はメモリ上では[0x12, 0x34, 0x56]と入っています。
little endian の場合、逆から1バイトずつ入っています([0x56, 0x34, 0x12])。

ネットワークに流すデータのバイトオーダーはだいたいbig endianであることがオーソドックススタイルです。
なんでそうなのかは知りません。

ということで、話がそれましたが、このフィールドには前回パケットを送ってから経過した時間を入れて下さい。

24 bitで表現できる程の時間をゆうに経過してしまっている場合の措置は知りません。

body size (24 bit / big endian)

RTMPパケットの本文のサイズです。これもbig endian。

ちなみに、big endian/little endianという言葉の由来はガリバー旅行記なんだとか。

dataType (8 bit)

本文に何が書いてあるかを示す値が入っています。

僕が試して、確実に分かっているものを記載します。

osflashなんかのサイトには、ここに記載されているもの以外も書いてありますが、僕は見たことありません。

dataType 名前 説明
0×01 チャンクサイズ チャンクサイズ変更通知の時に用いる
0×04 ping pingに用いる
0×08 オーディオデータ 音声データのストリーミング転送の時に用いる
0×09 ビデオデータ 動画データのストリーミング転送の時に用いる
0×10 Flex SharedObject オブジェクトデータを送りつける時に用いる
NetConnectionやNetStreamとかとやりとりする時にも使う
0×14 関数呼び出し サーバー上にあるクラスの関数呼び出しをする時に用いる
だいたいこの形式でNetConnectionがサーバーにパラメータ
を渡してきたりする

実は、今回オーディオデータも自分で使ったことはありません。でも、キャプチャした解析データにはありました。

object id (32 bit / little endian)

通信相手のオブジェクトを示す値です。

0を指定すると、NetConnectionを指定した事になります。それ以外はサーバがIDを発行するので、発行されたIDを入れます。

ここだけ何故かlittle endianです。気を付けてください。

チャンクサイズ

さて、RTMPヘッダについてはひとしきり説明したと思うので、チャンクサイズについて説明します。

Leave a Reply