🤔

RTSPのSDPを読んでみる

2024/11/28に公開

はじめに

前回、OSSに初めてコミットしてみた話を書きました。

https://zenn.dev/takudooon/articles/8912934d3a6772

そこで前回記述したRTSPセッション中に交換されるSDP (Session Description Protocol) の情報を解読してみます。

読んでみる

このようなSDPでした。

v = 0
o = - 294741794 1 IN IP4 192.168.0.0
s = IGCSMS 
i = 
t = 0 0 
a = tool:IGCSMS 
m = video 0 RTP/AVP 96 
c = IN IP4 192.168.0.0 
b = AS:2
a = rtpmap:96 H264/90000 
a = fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqwsaoKAv+WbgICAgQ==,aO4xshs= 
a = control:track=1 
m = audio 0 RTP/AVP (null) 
c = IN IP4 0.0.0.0 
b = AS:64 
a = rtpmap 
a = control:track=2

そして、それぞれかいつまんで調べたことをまとめてみました。

v = 0

プロトコルバージョンを表す。

o = - 294741794 1 IN IP4 192.168.0.0

o = <username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
  • <username>
    • 発信元ホストにおけるユーザーのログイン名、発信元ホストがユーザーIDをサポートしていない場合は、-と記述される
  • <sess-id>
    • <username><sess-id><nettype><addrtype><unicast-addres>をフォーマットした数値文字列
  • <sess-version>
    • セッションが記述されたバージョン番号
  • <nettype>
    • ネットワークの種類を表す文字列。INはインターネットを意味する。
  • <addrtype>
    • アドレスの種類を表す文字列。IP4IP6が定義されている。
  • <unicast-address>
    • セッションが作成されたマシンのIPアドレス
    • 今回の場合はネットワークカメラのIPアドレス
s = IGCSMS 
s = <session name>
  • <session name>
    • テキストによるセッション名を表す。
i = <session information>
  • <session information>
    • セッションに関するテキスト情報。
    • 上述した例では空白。
t = <start-time> <stop-time>

時刻情報(time-field)を表す。

  • <start-time>
    • セッション開始時刻
  • <stop-time>
    • セッション終了時刻
a = tool:IGCSMS
a = rtpmap:96 H264/90000
a = fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqwsaoKAv+WbgICAgQ==,aO4xshs= 
a = control:track=1 
a = rtpmap 
a = control:track=2

a=<attribute-name>
a=<attribute-name>:<attribute-value>

属性を表し、SDPを拡張するために使用される。

  • a = rtpmap:96 H264/90000
    • a = rtpmap:<ペイロードタイプ> <符号化方式>/<クロック速度>
    • RTPペイロードタイプ番号が96のデータはH264コーデックでエンコードされており、RTPのタイムスタンプクロックレートは90kHz
  • a = fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqwsaoKAv+WbgICAgQ==,aO4xshs=
    • RTPのfmtp(Format Parameters、フォーマットパラメーター)のRTPペイロードタイプ番号が96、packetization-mode=1(非インタリーブモード)、profile-level-id=64001E(64=Highプロファイル、00=?、1E=?)、sprop-parameter-setsはSPS(シーケンスパラメータセット:ストリームに対する情報)とPPS(ピクチャパラメータセット:フレームに対する情報)をbase64に変換した値、をそれぞれが意味している。これらはH264でストリームした情報を正しくエンコード・デコードするのに必要。
m = video 0 RTP/AVP 96 
m = audio 0 RTP/AVP (null) 

m = <media> <port> <proto> <fmt> ...
もしくは
m = <media> <port>/<number of ports> <proto> <fmt> ...

メディアに関する説明を表す。
こちらはセッション中、複数含まれる可能性がある。
今回の例では、videoaudioの2つが含まれる。

  • <media>
    • メディアタイプ
    • ex. audio, video, text, application, message
      -<port>
    • メディアストリームの送信先のトランスポート
    • cの項目で定義されるネットワークと<proto>のフィールドで定義されるプロトコルに依存する
  • <proto>
    • プロトコル名
  • <fmt>
    • メディアフォーマットの説明を表す
    • <proto>RTP/AVPもしくはRTP/SAVPのとき、<fmt>はRTPペイロイドタイプ番号が入る。
    • 96の場合、動的なペイロードタイプであることを表す。
c = IN IP4 192.168.0.0

c = <nettype> <addrtype> <connection-address>

接続情報を表す。

  • <nettype>
    • ネットワークタイプ
    • IN = インターネット
  • <addrtype>
    • アドレスの種類
  • <connection-address>
    • 接続アドレス
b = AS:2
b = AS:64

b=<bwtype>:<bandwidth>

帯域幅情報を表す。
b=AS:は、 RTPベースのアプリケーションの場合、RTPのセッション帯域幅を示す。

  • <bwtype>
    • <bandwidth>番号の意味を提供する英数字の修飾子
  • <bandwidth>
    • 帯域幅

おわりに

調べて気になった点をまとめてみました。
奥深すぎて、正直わからないことだらけです。
あまり深入りしないほうが良さそう。
これを考えて仕様が共通化されてまとめられているので、なんだか凄い世界🤔

参考

H.264ビデオのためのRTPペイロードフォーマットに関する技術レポート
https://vcbook.vtv.co.jp/7_3_3.html
https://qiita.com/gktak_qiita/items/532c23319ee51c3e82ec
https://webrtcforthecurious.com/ja/docs/02-signaling/
https://knowledge.sakura.ad.jp/31586/
https://www.elwsc.co.jp/knowledge/6525/

Discussion