質問

ストリーミングビデオアプリケーションでビデオソースを動的に切り替えたい。ただし、異なるビデオソースには独自の画像サイズがあります。ビデオソースごとに個別のSDPファイルを生成できますが、それらを単一のSDPファイルに結合して、ビデオソースの変更に応じて表示クライアントが自動的に表示ウィンドウのサイズを変更できるようにします。次に、2つのサンプルSDPファイルを示します。

640x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream640x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
a=control:trackID=1

960x480.sdp:

v=0
o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
s=VideoStream960x480
t=0 0
c=IN IP4 192.168.0.2
m=video 8000/2 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
a=control:trackID=1

これらの個々のファイルを単一のSDPファイルに結合するにはどうすればよいですか

役に立ちましたか?

解決

2つのsdpの例のパラメーターは非常に近く、ストリーム名とsprop-parameter-setsが異なります。ストリーム名は気にしないと思います。個別のsprop-parameter-setsが必要で、クライアントが標準ウェルをサポートしている場合、次のように解像度ごとに個別の動的ペイロードタイプを使用し、単一のSDPを使用できます。

    v=0
    o=VideoServer 305419896 9876543210 IN IP4 192.168.0.2
    s=VideoStream640x480
    t=0 0
    c=IN IP4 192.168.0.2
    m=video 8000/2 RTP/AVP 96 97
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=Z01AM5ZkBQHtCAAAAwAIAAADAYR4wZU=,aO48gJ==
    a=rtpmap:97 H264/90000
    a=fmtp:97 packetization-mode=0; profile-level-id=4D4033; sprop-parameter-sets=J01AM5WwPA9sBAIA,KO4G8gA=
    a=control:trackID=1

実際に異なるストリーム名または異なるsprop-parameter-setが必要ない場合、他の回答と同様に、最初のSDPを使用し、ストリームの中間フォーマットを切り替えることができます。 H.264の実際のペイロードまたは特定のデコーダーがアプリケーションで機能することを保証するほど十分にはわかりませんが、ビデオ会議アプリケーションでは、変更を通知したり別のダイナミックを必要とせずに解像度を動的に切り替えたりすることが非常に一般的ですペイロードタイプ。

別の回答で述べたように、2つのSDPドキュメントを連結することはできますが、この場合には役立つとは思いません。 H.264デコーダーは、一度に1つのsprop-parameter-setsパラメーターでしか動作しません。両方のSDPのペイロードタイプ、ソースポートなどが同じであるため、レシーバはどのsprop-parameter-setsパラメータをいつ使用するかを知りません。更新:一部の実装は、SDPからではなく(または最初にSDPからのみ)spropsインバンドを取得します。ご使用の環境に該当する場合、SDP sprop-parameter-setsはインバンドで更新できます

参照:

  1. RFC 3984 H.264ビデオのRTPペイロード形式
  2. 新しく提案されたH.264 RTPペイロード形式RFC 6184
  3. RFC 4566 SDP:セッション記述プロトコル

[完全な引用を与えていないため申し訳ありません-修正してください]

他のヒント

RFC( RFC2327-SDP:セッション記述プロトコルに目を通しました)そして、2つのSDPドキュメントを連結するだけでよいようです。ドキュメントには明示的に記載されています:

  

SAPがSDPを伝達する場合、パケットごとに1つのセッション記述のみが許可されます。 SDPが他の手段で伝達される場合、多くのSDPセッションの説明が連結される場合があります(セッションの説明の開始を示す「v =」行が前の説明を終了します)

デコーダに依存すると思います。ストリーム内のパラメーター変更をサポートしている場合、解像度を変更するときに対応するヘッダーを配置するようにエンコーダーに指示できる場合、デコーダーは自動的に切り替わります。

質問は正確に何ですか? それ:ストリームを停止/再起動せずに解像度を変更するにはどうすればよいですか?

事前にデコーダーに伝えることができるとは思いません。ここに、いくつかのsdpマジックで見られる潜在的な解像度を示します。デコーダーがH264パラメーターの変更を理解できて問題ないか、全体の再起動を停止して動的sdpで十分であるかのいずれかです。

たとえば、VLCはMP4エンコーディングの変更(たとえば、可変ビットレートから固定ビットレートへの変更)を検出できることを知っていますが、解像度を変更するとクラッシュします sdpでできることは、たとえば、さまざまな動的ペイロードタイプとさまざまなcontrol-id属性など、さまざまなメディアの説明を組み合わせることです。

動的ペイロードの変更、インストリームパラメータセットの変更、またはSIP re-INVITEのいずれかを実行できます。

ペイロードの変更には、エンコーダーとデコーダーを制御しない場合、相手側が両方のペイロードを受け入れることを確認する必要があるという問題があります。それ)。

パラメータセットのパケットが失われた場合、

インストリームの変更には問題があります。誤ったデコードを回避するために、異なるパラメーターセットのセット(変更時にパラメーターセット1から2に切り替える)を使用できます-セットが失われた場合は、フリーズまたは空白の画像を取得するだけです。それらを数回再送信することをお勧めします(あまり速くは続かない)。

SIP re-INVITEは帯域外でハンドシェイクされているため安全ですが、スイッチに遅延が追加され、レシーバーによってはグリッチが発生し、拒否される可能性があります。

(注:私はRFC 3984bisの著者であり、RFC 3984のアップデートです)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top