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
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 のパケットのみをキャプチャするように設定します