歴史上最も単純なRTSPサーバーを開発するための600行のコード(GO言語の純粋なネイティブ構文)

1はじめに

市場に出回っているオープンソースのRTSPサーバーは複雑すぎます。現在、GO言語を使用して、ネイティブGO言語を使用し、サードパーティのGO言語フレームワークに依存することなく、史上最も単純なRTSPライブブロードキャストサーバーを開発しています。

ライブビデオプロトコルについて言えば、最初に作者はffmpeg + nginx(RTMP)ソリューションを使用しましたが、nginxRTMPモジュールに問題があります。画像を表示するのに少なくとも6〜7秒かかります。私はしません。 RTMPプロトコルの問題なのかnginxrtmpの問題なのかわかりません。モジュールの問題です。しばらくして、go言語を使用してRTMPサーバーを再生します。

上記のffmpeg + nginxの欠点のため、私はEasyDarwinのRTSPサーバーソリューションであるffmpeg + EasyDarwin(RTSP)ソリューションに目を向けました。対照的に、RTSPは2秒以内に画像を表示できます。これは私の予想を超えています。

しばらくすると、EasyDarwinにもいくつかの欠点があることがわかりました。認証、プッシュコールバック、再生コールバックが必要であり、EasyDarwinはgithubで市販されているかどうかを示していないようです。したがって、EasyDarwinを使用することには一定のリスクがあります。

要約すると、私は独自のRTSPサーバーを開発することにしました。優先言語はもちろんGO言語であり、サードパーティのフレームワークを参照せず、ネイティブGOを使用することにしました。

実際、フラッシュは廃止されており、対応するRTMPプロトコルも廃止する必要があると思います。RTMPの再生遅延が大きく、開く速度が遅いのに対し、RTSPプロトコルの遅延は1秒未満であり、開封速度は超高速です。

2. RTSP

RTSPと言えば、RTP(Real-time Transport Protocol)について話さなければなりません。RTPはビデオフレームデータの送信に使用されます。ただし、多くのシナリオでは、RTP送信の制御など、サーバーとのその他の対話を実行する必要があります。その後、RTSPプロトコルが作成されます。RTSPはHTTPプロトコルに似ています。RTPビデオフレームが送信される前に、 2つのパーティが最初にRTSPプロトコルと対話します。RTSPプロトコル対話が完了した後、ストリーミングエンドはRTPビデオフレームをRTSPサーバーに継続的に送信し、ストリーミングエンドはRTSPサーバーがRTPビデオフレームを送信するのを待ちます。

最終的な分析では、RTSPプロトコル= RTSP(HTTPに類似した文字列プロトコル)データ+ RTP(バイナリプロトコル)データ。RTPデータはそのまま転送され、ストリーミング側からプッシュされたRTPデータは再生セクションに転送されます。サーバーによるものです。違いは、ストリーミング側と再生側が最初にRTSPプロトコルを使用してサーバーと数ラウンド対話する必要があることです。対話が完了した後、RTPバイナリデータの順番になります。

ここでは、RTSPがUDPプロトコルを使用することを考慮していません。他の記事でテストしました。UDPはフレームを失うのが非常に簡単で、スクリーニングが簡単で、制限が厳しすぎるため、TCPベースのみを考慮します。ここにRTSPプロトコル。

RTSPの担当者はあまりにも多くのコマンドを出しました。ここではオンデマンドではなく、ライブブロードキャストのみを考慮しています。

完全なRTSPライブブロードキャストシステムには、プッシャー、サーバー、プレーヤーがあります。

3.プッシュエンド

プッシュエンドのワークフローは次のとおりです。

3.1オプション

          プッシュエンドは以下を送信します。

       

OPTIONS rtsp://192.168.1.201:5545/2_1 RTSP/1.0\nCSeq: 1\nUser-Agent: Lavf58.37.100\n\n

\ nは、特別にマークしたキャリッジリターン文字であることに注意してください。以下ではキャリッジリターン文字を表示しません。改行にはキャリッジリターン文字が必要です。

        RTSP応答:

RTSP/1.0 200 OK
CSeq: 1
Session: ZTnZLWlGg
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD


応答メッセージでは、この時点でセッションがRTSPサーバーによって生成され、このセッションはプッシュエンドの接続サイクル全体で使用されます。

3.2発表

       プッシュエンドは以下を送信します。

ANNOUNCE rtsp://192.168.1.201:5545/2_1 RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: Lavf58.37.100
Session: ZTnZLWlGg
Content-Length: 296

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.1.201
t=0 0
a=tool:libavformat 58.37.100
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z00AKp2oHgCJ+WbgICAoAAADAAgAAAMBlCA=,aO48gA==; profile-level-id=4D002A
a=control:streamid=0

RTSPサーバーはこのメッセージを受信した後、「v = 0」から最後までテキストを保存する必要があります。これはこのRTSPチャネルのsdpメッセージであるためです。これは、プレーヤーがデータを要求するときに必要です。

RTSPサーバーは以下を送信します。

RTSP/1.0 200 OK
CSeq: 2
Session: ZTnZlWLGg

3.3セットアップ 

   プッシュエンドは以下を送信します。

SETUP rtsp://192.168.1.201:5545/2_1/streamid=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record
CSeq: 3
User-Agent: Lavf58.37.100
Session: ZTnZLWlGg


RTSPサーバーは次のように応答しました。

RTSP/1.0 200 OK
CSeq: 3
Session: ZTnZLWlGg
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record


3.4記録

プッシュエンドは以下を送信します。

RECORD rtsp://192.168.1.201:5545/2_1 RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent: Lavf58.37.100
Session: ZTnZLWlGg


RTSPサーバーは次のように応答しました。

RTSP/1.0 200 OK
CSeq: 4
Session: ZTnZLWlGg

3.5RTPメッセージ

この時点で、プッシュエンドはRTPメッセージの送信を継続的に開始し、RTSPサーバーはプッシュエンドメッセージに応答せずにRTPメッセージを再生エンドに転送するだけで済みます。

4.プレーヤー

プレイヤーのプロセス:

4.1オプション 

プレーヤーは以下を送信します。

OPTIONS rtsp://192.168.1.201:5545/2_1 RTSP/1.0
CSeq: 1
User-Agent: Lavf58.37.100

RTSPサーバーの応答:プレーヤーのセッションは、この時点でRTSPサーバーによって生成され、プレーヤーの接続期間中は変更されません。

RTSP/1.0 200 OK
CSeq: 1
Session: YXN_wZ_GR
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD


4.2説明

プレーヤーは以下を送信します。

DESCRIBE rtsp://192.168.1.201:5545/2_1 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.12.100
Session: YXN_wZ_GR

3.2では、保存されたsdpメッセージがこの時点でプレーヤーに送信されるようにしてください。

RTSPサーバーは次のように応答しました。

RTSP/1.0 200 OK
Session: YXN_wZ_GR
Content-Length: 296
CSeq: 2

v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 192.168.1.201
t=0 0
a=tool:libavformat 58.37.100
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z00AKp2oHgCJ+WbgICAoAAADAAgAAAMBlCA=,aO48gA==; profile-level-id=4D002A
a=control:streamid=0

4.3セットアップ

   プレーヤーは以下を送信します。

SETUP rtsp://192.168.1.201:5545/2_1/streamid=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record
CSeq: 3
User-Agent: Lavf58.37.100
Session: YXN_wZ_GR


RTSPサーバーは次のように応答しました。

RTSP/1.0 200 OK
CSeq: 3
Session: YXN_wZ_GR
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record


4.4プレイ

プレーヤーは以下を送信します。

PLAY rtsp://192.168.1.201:5545/2_1 RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent: Lavf58.12.100
Session: YXN_wZ_GR

RTSPサーバーは次のように応答しました。

RTSP/1.0 200 OK
Session: YXN_wZ_GR
Range: npt=0.000-
CSeq: 4

4.5RTPメッセージ

次に、RTSPサーバーは、3.5で受信したRTPメッセージをそのままプレーヤーに送信するだけで済みます。

5.エフェクト画像

      5.1サーバー

      

5.2ffmpegプッシュエンド

    5.3プレーヤー

6.コード

ここでスラムしてコードクラウドに入ります

 

おすすめ

転載: blog.csdn.net/a53818742/article/details/115333792