Baud
プロトコル一覧

RTP

ライブの音声・映像に、順序と時刻を与える 12 バイトのヘッダ。

非圧縮の映像

同じヘッダが、放送局が送るのと同じ形で、生の画素を運びます。

非圧縮映像を運ぶ RTP(RFC 4175 / SMPTE ST 2110-20)04812162024801000000060011000001B00011011590101100100000000001200010010D71101011170011100004C010011001F000111113A001110109210010010000000000000000000000000000000080000100000000000006401100100000000000000000000008010000000EB111010118010000000EB111010118010000000EB111010118010000000EB11101011バ…CSRC 数ペイロード種別シーケンス番号タイムスタンプSSRC拡張シーケンス番号SRD 長ライン番号画素オフセット画素(YCbCr 4:2:2、8 ビット)フィールドをクリックして中身を見る

フレーム全体

同じ 12 バイトの RTP ヘッダの後に、画素がどのラインのどこに入るかを示す小さな映像ヘッダが続きます。放送局は、この形式で放送用映像を普通の Ethernet に流しています。

フィールド位置例の値意味
バージョン0 バイト目の bits 7–62現在の RTP では常に 2。
パディング0 バイト目の bit 50末尾にパディングがあれば 1(一部の暗号方式で必要)。ここでは 0。
拡張ヘッダ0 バイト目の bit 40固定ヘッダの後に拡張ヘッダが続くなら 1。
CSRC 数0 バイト目の bits 3–00ヘッダの後に続く寄与ソース ID の数。ミキサが複数のソースを混ぜるときだけ 0 でなくなります。
マーカー1 バイト目の bit 70意味はペイロードの種類によります。映像では 1 フレームの最後のパケットで立ち、次のタイムスタンプを待たずにデコードを始められることを示します。
ペイロード種別1 バイト目の bits 6–096 (dynamic, H.264 per SDP)中身がどの符号化・形式か。0〜95 は固定割り当て(0 = PCMU 音声)、96〜127 は動的で、セッション記述(SDP)が 96 の意味(ここでは H.264)を決めます。
シーケンス番号2–3 バイト目7001パケットを送るたびに +1。受信側は欠番で損失を検出し、順序を並べ直します。初期値はランダムです。
タイムスタンプ4–7 バイト目1234800 (13.720 s on the 90 kHz clock)メディアの採取時刻をクロック刻みで表します(映像は毎秒 90,000)。1 フレームの全パケットは同じ値で、25 fps ならフレームごとに 3,600 増えます。壁時計ではなくメディア上の時刻で、再生タイミングや口パク同期に使います。
SSRC8–11 バイト目0x4C1F3A92同期ソース識別子。このストリーム固有のランダムな ID です。同じ送信元の音声と映像でも SSRC は別で、受信側はこれでストリームを分けます。
拡張シーケンス番号12–13 バイト目0 (low 16 bits are in the RTP header)シーケンス番号の上位 16 ビットです。非圧縮映像は毎秒のパケット数が多く、通常の 16 ビットでは 1 秒足らずで一周してしまうため、32 ビットに拡張します。
SRD 長14–15 バイト目8 bytes1 つのパケットは Sample Row Data(SRD)を 1 つ以上運び、それぞれに 6 バイトのヘッダが付きます。この SRD の画素データは 8 バイトです。
F(フィールド)16 バイト目の bit 70インターレース映像では 0 = 第 1 フィールド、1 = 第 2 フィールド。プログレッシブでは常に 0。
ライン番号16–17 バイト目にまたがる100この画素データが画面の何行目か(上端が 0)。
C(継続)18 バイト目の bit 70同じパケットに次の SRD ヘッダが続くなら 1。0 = これが最後。
画素オフセット18–19 バイト目にまたがる0 (start of the line)ラインの中で、このデータが始まる水平位置(画素数)。
画素(YCbCr 4:2:2、8 ビット)20–27 バイト目4 white pixels生の画素です。2 画素で 4 バイト、順序は Cb・Y0・Cr・Y1。0x80 は無彩色、0xEB(235)が映像の白なので、この 4 画素は白です。幅 1920 画素の 1 ラインは 3,840 バイトで、映像はまったく圧縮されません。

パケット、欠けた 1 つ、そして報告

シーケンス番号とタイムスタンプが、損失とフレームの境目をどう見せるか。

エンコーダRTP senderデコーダRTP receiverRTPseq=100 ts=3600RTPseq=101 ts=3600 M=1RTPseq=102 ts=7200RTPseq=103 ts=7200 M=1RTPseq=104 ts=10800RTCP RRlost=1 of 5bufferingframe 1 OKframe 2 damaged

やり取りの全体

RTP はメディアのパケットに番号とタイムスタンプを付けますが、配送は保証しません。損失は検出するだけで、修復はアプリケーションか SRT のようなプロトコルの役目です。

  1. 1フレーム 1 の最初のパケット

    大きなフレームは、ネットワークの MTU に収まるパケットに切られます。すべて同じタイムスタンプ(3,600)で、シーケンス番号は連番です。

  2. 2最後のパケット: マーカーを立てる

    M=1 は、これでフレーム 1 がそろったことを示します。デコーダは、新しいタイムスタンプのパケットを待たずにデコードして表示できます。

  3. 3フレーム 2 が始まる

    タイムスタンプが 3,600 刻み(90 kHz で 40 ms)進みます。毎秒 25 フレームです。

  4. 4パケットが失われる

    UDP は再送しません。seq=103 のパケットは届きません。

  5. 5欠番で気づく

    102 の次に 104 が来たので、受信側は「ちょうど 1 つ欠けた」と分かります。フレーム 2 は壊れているため、誤りの隠蔽、直前のフレームの再表示、新しいキーフレームの要求などで対処します。

  6. 6RTCP 受信レポート

    メディアと並行して、RTCP が統計(ここでは 5 つに 1 つの損失とジッタ)を運びます。送信側はビットレートを下げる、誤り訂正を足す、キーフレームを送るなどで適応できます。

使われる場面

  • WebRTC のビデオ通話・会議
  • IP カメラ・監視(多くは RTSP で設定)
  • 放送・業務用 AV の IP 化: SMPTE ST 2110、AES67 など

つまずきやすい点

  • タイムスタンプの単位はペイロードにより異なります(映像は毎秒 90,000、音声はサンプルレート)。そのまま比べてはいけません。
  • 経路 MTU を超えるパケットは IP で分割され、まとめて失われやすくなります。1,200〜1,400 バイト程度に収めます。
  • RTP のポートはセッションごとに交渉するため、ファイアウォールや NAT に阻まれがちです。STUN/TURN/ICE がその解決策です。

出典・規格

  • RFC 3550: RTP
  • RFC 6184: RTP Payload Format for H.264
  • RFC 4175: RTP Payload Format for Uncompressed Video

関連するプロトコル