🤔
RTSPのSDPを読んでみる
はじめに
前回、OSSに初めてコミットしてみた話を書きました。
そこで前回記述した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をサポートしていない場合は、
-
と記述される
- 発信元ホストにおけるユーザーのログイン名、発信元ホストがユーザーIDをサポートしていない場合は、
-
<sess-id>
-
<username>
、<sess-id>
、<nettype>
、<addrtype>
、<unicast-addres>
をフォーマットした数値文字列
-
-
<sess-version>
- セッションが記述されたバージョン番号
-
<nettype>
- ネットワークの種類を表す文字列。
IN
はインターネットを意味する。
- ネットワークの種類を表す文字列。
-
<addrtype>
- アドレスの種類を表す文字列。
IP4
とIP6
が定義されている。
- アドレスの種類を表す文字列。
-
<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> ...
メディアに関する説明を表す。
こちらはセッション中、複数含まれる可能性がある。
今回の例では、video
とaudio
の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>
- 帯域幅
おわりに
調べて気になった点をまとめてみました。
奥深すぎて、正直わからないことだらけです。
あまり深入りしないほうが良さそう。
これを考えて仕様が共通化されてまとめられているので、なんだか凄い世界🤔
Discussion