福州大学「組込みシステム総合設計」実験13:RTSPプルとRTMPプッシュ

 1. 実験目的

開発ホスト環境の構築、ハードウェア組み込み開発ボードの接続、クラウドプラットフォームの構成、エンコードプログラムのコンパイルと操作など、JPEG圧縮エンコード方式とコンピューティングプラットフォームをベースとした開発環境を習得します。 。

2. 実験内容

実験用開発環境を構築し、入力側でオリジナル画像データを読み込み、コーデックモードを選択し、圧縮符号化結果を出力する静止画jpeg形式コーデックプログラムを作成します。ターゲット開発マシンでテストを実行して、開発環境を検証します。クラウド プラットフォームの仮想環境に基づいている場合、コンパイルされたプログラム コードをテストと実行のためにクラウド プラットフォームにアップロードする必要があります。

3. 開発環境

開発ホスト: Ubuntu 20.04.6 LTS

ハードウェア: Suaneng SE5

4. 実験装置

開発ホスト + クラウド プラットフォーム (または SE5 ハードウェア)

5. 実験の過程と結果

参照ルーチン

この実験は、git の ocv_video_xcode.cpp ルーチンを参照することで完了できます。

実験内容と手順

図1 接続展開図

上の図に示すように、この実験では OpenCV インターフェイスを使用して SE5 上の RTSP 経由でストリームをプルし、RTMP 経由でコード ストリームを PC/サーバーにプッシュします。実装プロセス中に、RTSP ストリーミングと RTMP ストリーミングは異なるスレッドで実装されます。また、デコード処理はRTSPストリームのプル処理中に実行され、エンコード処理はRTMPストリームのプッシュ処理中に実行されます。

なお、今回の実験におけるカメラはPC上で直接実行することも可能であり、RTSPサーバーをPC上にインストールして起動することも可能です。

EasyDarwin を使用して RTSP サーバーをインストールすることをお勧めします: https://www.easydarwin.org/

SE5 に直接インストールすることもできますが、SE5 にインストールする前にソース コードをダウンロードしてコンパイルする必要があります。Nginx は RTMP サーバーとして PC にインストールできます。

Windows での Nginx サーバーのインストール方法と RTMP サーバーの開設方法については、添付の説明を参照してください。

この実験における 2 つのスレッドの動作プロセスは次のとおりです。

上記の処理フローでは、メインスレッドではオープンファイル名をRTSPアドレスに設定してビデオストリームをプルし、読み込んだビデオフレーム(デコードされたビデオフレーム)をビデオキャッシュに格納するだけです。書き込みスレッドでファイル名を RTMP に書き込み、指定されたアドレスにビデオ ストリームをプッシュします。

OpenCV は、ビデオ ファイルの読み取りと書き込みのために、それぞれ VideoCapture クラスと VideoWriter クラスを提供します。具体的なプログラミングの実装手順を以下に紹介します。

メインスレッド関数

OpenCV がビデオ ストリームを取得する

前述したように、OpenCV は VideoCapture クラスを通じて URL アドレスを読み取り、デコードします。関連するコードのこの部分は、例 11 を参照して実装することもできます。キー コードは次のとおりです。

//初始化VideoCapture类
VideoCapture cap;
//打开文件或者摄像头或者某个RTSP连接
cap.open(threadPara->inputUrl, CAP_FFMPEG, threadPara->deviceId);
...
//读取视频帧存入image中
Mat image;
cap.read(image); 

コード内の threadPara->inputUrl は、入力 RTSP ビデオ ストリーム アドレスです。threadPara->deviceId はボード ID で、SOC モードの場合は 0、PCIE モードの場合は特定のボード ID を指定する必要があります。

 ビデオフレームはビデオバッファキューに保存されます

メインスレッドが cap.read(image) を通じてイメージを取得した後、そのイメージはビデオ キャッシュ キューに保存されます。この実験には、キャッシュ キューで読み取りおよび書き込み操作を実行する 2 つの異なるスレッドが含まれます。スレッドの同期を確保するには、ロックとロック解除を通じてキャッシュ キューを保護する必要があります。

g_video_lock.lock();
//存入缓存队列
threadPara->imageQueue->push(image);
g_video_lock.unlock();

上記のコードで得られる MAT 形式の画像が、デコードされたビデオ フレーム データです。

書き込みスレッド関数

OpenCVプッシュビデオストリーム

OpenCV はビデオを書き込むためのインターフェイス クラス VideoWriter を提供しており、VideoWriter は画像の各フレームを指定されたエンコード形式でビデオに書き込みます。URL アドレスは、VideoWriter クラスを通じて直接プッシュできます。

VideoWriter  writer;       //创建VideoWriter类  
//outfile输出视频文件的路径名称
//fourcc: 字符类型的编码,表示用于编码视频文件的编码器,比如采用HEVC编码
writer.open(outfile, VideoWriter::fourcc('h', 'v', 'c', '1'),
        threadPara->fps,             //帧率
        Size(threadPara->imageCols, threadPara->imageRows),
        encodeparms,
        true,
        threadPara->deviceId);
writer.write(*toEncImage); //通过write接口推送

fourcc インターフェイスでは、次のようなさまざまなエンコード方法を設定することもできます。

VideoWriter::fourcc('P','I','M','1') //表示MPEG-1 编码文件扩展名为avi; VideoWriter::fourcc('X','V','I','D') //表示MPEG-4编码文件扩展名为avi; VideoWriter::fourcc('X','2','6','4') //表示MPEG-4编码文件扩展名为mp4;
VideoWriter::fourcc('I','4','2','0') //表示YUV编码,文件扩展名为avi;
VideoWriter::fourcc('M','P','4','V') //表示旧的MPEG-4编码,文件扩展名为avi;
VideoWriter::fourcc('T','H','E','O') //表示使用ogg vorbis,文件扩展名为ogv;
VideoWriter::fourcc('F','L','V','1') //表示flash video,文件扩展名为flv;

この実験の RTSP サーバーは、カメラを通じてストリームを直接プルすることも、PC に RTSP サーバーをインストールすることによって完了することもできます。今回の実験におけるRTMPサーバーは、Nginxサーバーをインストールすることで完成します。Nginxのインストール手順は以下の通りです。

Windows での Nginx サーバーのインストールと RTMP の使用

Nginx 公式 Web サイト: nginx ニュース にアクセス  し、「ダウンロード」をクリックします。

  

最新バージョンまたは安定バージョンを選択してください

  

 Nginx を解凍し、CMD を入力してディレクトリに入り、start nginxまたは ngnix.exe を実行します。

conf フォルダーに入り、nginx.conf ファイルを開いて、次の構成を追加します。

worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        application live {
             live on;
             allow publish 127.0.0.1;
             allow play all;
        }
    }
}

HTTPの設定

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
    server {
        listen       80;
        server_name  localhost;
        
        #location / {
        #   root   html;
        #    index  index.html index.htm;
        #}
        
        # Serve HLS fragments
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
        root /tmp;
            add_header Cache-Control no-cache;
        }

        # Serve DASH fragments
        location /dash {
            root /tmp;
            add_header Cache-Control no-cache;
        }
 
        location /live_hls {
            types{
                #m3u8 type设置
                application/vnd.apple.mpegurl m3u8;
                #ts分片文件设置
                video/mp2t ts;
            }
            #指向访问m3u8文件目录
            alias ./m3u8File;
                add_header Cache-Control no-cache; #禁止缓存
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl{
            root ./nginx-rtmp-module;
        }
 
        location /control {
            rtmp_control all;
        }
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

 nginx設定ファイルを確認する

cd nginx所在目录
nginx -t

nginxを起動する

cd nginx所在目录
start nginx
wAAACH5BAEKAAAAAAAAAABAAEAAAAICRAEAOw==

nginxを検証する

ブラウザにhttp://localhost/と入力し、nginx が起動しているかどうかを確認します。 

ブラウザにhttp://localhost/stat と入力して、メディア ストリーミング サービスのステータスを確認します。

VLCプルストリーム

VLC プレーヤーをインストールし、ソフトウェアを開きます。

左上隅のメディア → ネットワークストリーミングを開く → ネットワーク、URL を設定します (形式: rtmp://ip:port/live)

rtmp://127.0.0.1:1935/live

「再生」をクリックして、ストリームが正常にプルされたかどうかを確認します。

Wireshark のインストールと使用

Wireshark のダウンロードとインストール

ダウンロードアドレス: Wireshark · Go Deep

オペレーティング システムに応じて、対応するバージョンを選択します。

Wiresharkを開き、リスニング ネットワーク カードを選択します

以下を選択することもできます。

次に、対応するネットワーク カードを選択します。

パケットキャプチャを入力してください

フィルタリングを設定する

ip.addr == 192.0.2.1 //IP アドレス 192.0.2.1 のパケットのみをキャプチャするように設定します 

おすすめ

転載: blog.csdn.net/m0_52537869/article/details/134707242