WSL2 は、OpenCV を介してネイティブ カメラの RTSP ビデオ ストリームを呼び出して表示します。

序文

このブログの起源は上記の通りです (笑)、WSL2 関連のインストールチュートリアルは私の以前のブログを参照してください: Win11 で WSL2 と Nvidia ドライバーをインストールする

私のブログへようこそ。その他の記事もご覧いただけます。技術的な詳細についても詳しく説明します~

CMakeをインストールする

ubuntu上で実行してください

sudo apt install cmake -y

またはコンパイルしてインストールする

# 以v3.25.1版本为例
git clone -b v3.25.1 https://github.com/Kitware/CMake.git 
cd CMake
# 你使用`--prefix`来指定安装路径,或者去掉`--prefix`,安装在默认路径。
./bootstrap --prefix=<安装路径> && make && sudo make install

# 验证
cmake --version

エラーが報告された場合はCould NOT find OpenSSL、次の依存関係をインストールして解決します。

sudo apt update
sudo apt upgrade
sudo apt install libssl-dev

OpenCVとFFmpegをインストールする

sudo apt install libopencv-dev
sudo apt install ffmpeg

Windows ネイティブ RTSP ビデオ ストリーミングを開始する

EasyDarwin をダウンロードして解凍します。

Easydarwinは国内チームが開発したオープンソースのストリーミングメディアフレームワークです。Go 言語に基づいて開発されており、2012 年 12 月から作成および開発されており、当初の単一サービスのストリーミング メディア サーバー形式から現在のクラウド プラットフォーム アーキテクチャのオープン ソース プロジェクトに拡張されました。ソース RTSP ストリーミング メディア サーバー Github 上で広く歓迎されています。

機能: RTSP プッシュ モード転送、RTSP プル モード転送、ビデオ録画、取得、再生、キーフレーム バッファリング、2 番目のオープニング画面、RESTful インターフェイス、WEB バックグラウンド管理、分散負荷分散。

リリースパッケージをダウンロードして解凍します。

EasyDarwin.exeを直接実行する

Ctrl + C でサービスを停止します。ブラウザを開き、 http://localhost:10008 と入力してコントロール ページに入ります。デフォルトのユーザー名とパスワードは admin/admin です。

ネイティブカメラデバイスを表示する

ffmpeg を Windows にローカルにインストールする

次のようにネイティブ カメラ デバイス コマンドを表示します。

ffmpeg -list_devices true -f dshow -i dummy

ストリーミングを開始する

ffmpeg -f dshow -i video="USB2.0 Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://192.168.1.101/test

パラメータの説明

  • -f dshow -i video="摄像头名称"ローカル カメラからビデオ ストリームを読み取るように指定します。「カメラ名」をカメラ名に置き換えます (例: 「USB2.0 カメラ」)。
  • -vcodec libx264ビデオのエンコードに x264 エンコーダーを使用するように指定します。
  • -preset ultrafastエンコード速度を設定します。ここでは最速のエンコード速度が使用されますが、ビデオ品質が低下する可能性があります。
  • -tune zerolatencyエンコーダーをゼロ遅延に設定します。
  • -f rtsp出力ストリームの形式が RTSP であることを指定します。
  • rtsp://<IP地址>/<路径>RTSPストリームの宛先アドレスを指定します。Windows のネイティブ IP アドレスとストリームに指定するパスに<IP地址>置き換えてください。<路径>

成功したストリーミングは次のとおりです。コンソールが実行され続けるように注意してください。

ここに画像の説明を挿入

ローカル ファイアウォールを開きます (オプション)

WSL2 でこのマシンの RTSP ビデオ ストリームにアクセスしたいため、次の図に示すように、このマシンのファイアウォールを開く必要があります。

プライベートネットワークとパブリックネットワークをオフにする

OpenCVでビデオストリームを受信する

コードは以下のように表示されます

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>

int main(int argc, char **argv)
{
    
    
    // Ubuntu安装ffmpeg:sudo apt-get install ffmpeg
    // rtsp地址,模拟四路视频流进行展示
    std::string rtsp1 = "rtsp://172.27.148.34/test";
    std::string rtsp2 = rtsp1;
    std::string rtsp3 = rtsp1;
    std::string rtsp4 = rtsp1;

    // CAP_FFMPEG:使用ffmpeg解码
    cv::VideoCapture stream1 = cv::VideoCapture(rtsp1, cv::CAP_FFMPEG);
    cv::VideoCapture stream2 = cv::VideoCapture(rtsp2, cv::CAP_FFMPEG);
    cv::VideoCapture stream3 = cv::VideoCapture(rtsp3, cv::CAP_FFMPEG);
    cv::VideoCapture stream4 = cv::VideoCapture(rtsp4, cv::CAP_FFMPEG);

    if (!stream1.isOpened() || !stream2.isOpened() || !stream3.isOpened() || !stream4.isOpened())
    {
    
    
        std::cout << "有视频流未打开" << std::endl;
        return -1;
    }

    cv::Mat frame1;
    cv::Mat frame2;
    cv::Mat frame3;
    cv::Mat frame4;

    cv::Mat H1, H2, V, blur;

    // 使用namedWindow创建窗口,WINDOW_AUTOSIZE:自动调整窗口大小
    cv::namedWindow("rtsp_demo", cv::WINDOW_AUTOSIZE);

    while (true)
    {
    
    
        if (!stream1.read(frame1) || !stream2.read(frame2) || !stream3.read(frame3) || !stream4.read(frame4))
        {
    
    
            std::cout << "有视频流未读取" << std::endl;
            continue;
        }
        // 缩放等处理
        cv::resize(frame1, frame1, cv::Size(500, 300));

        cv::resize(frame2, frame2, cv::Size(500, 300));
        cv::flip(frame2, frame2, 1);

        cv::resize(frame3, frame3, cv::Size(500, 300));
        cv::cvtColor(frame1, frame1, cv::COLOR_BGR2GRAY);
        cv::cvtColor(frame1, frame1, cv::COLOR_GRAY2BGR);

        cv::resize(frame4, frame4, cv::Size(500, 300));
        cv::putText(frame4, "RTSP demo", cv::Point(100, 100), cv::FONT_ITALIC, 1, cv::Scalar(0, 0, 255), 2);
        // 拼接
        cv::hconcat(frame1, frame2, H1);
        cv::hconcat(frame3, frame4, H2);
        cv::vconcat(H1, H2, V);

        // 高斯模糊一下
        cv::GaussianBlur(V, blur, cv::Size(25, 25), 0);

        cv::imshow("rtsp_demo", blur);

        if (cv::waitKey(1) == 27)
        {
    
    
            break;
        }
    }

    return 0;
}

CMakeLists.txtの内容は以下の通りです

# 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 项目信息
project(rtsp_demo)

# 添加opencv库
find_package(OpenCV REQUIRED)

# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加库文件
link_libraries(${OpenCV_LIBS})

# 添加可执行程序
add_executable(rtsp_demo src/main.cpp)

cmakeの設定とビルドを開始する

cmake -S . -B build 
cmake --build build 

実行可能ファイルを実行する

./build/rtsp_demo

結果表示

WSL2を使用して4つのRTSPビデオストリームを表示することに成功しました~

おすすめ

転載: blog.csdn.net/Apple_Coco/article/details/129292953