文章目錄
- 前言
- 一、Ubuntu安裝opencv庫
- 二、啟動 Windows 本機的 RTSP 視頻流
- 下載解壓 EasyDarwin
- 查看本機攝像頭設備
- 開始推流
- 三、在ubuntu 終端編寫代碼
- 創建目錄及文件
- 創建CMakeLists.txt文件
- 啟動 cmake 配置并構建
- 四、結果展示
- 啟動圖形界面
- 在圖形界面打開終端找到 rtsp_demo運行
前言
由于WSL2環境與主機系統隔離,訪問本機攝像頭是有限的,但是,可以通過第三方庫或網絡攝像頭來解決這個問題,本文將本地攝像頭通過rtsp流來給WSL2訪問。
一、Ubuntu安裝opencv庫
詳見鏈接:https://blog.csdn.net/weixin_46119406/article/details/132271955?spm=1001.2014.3001.5501
二、啟動 Windows 本機的 RTSP 視頻流
Easydarwin是國內團隊開發的開源流媒體框架。它是基于Go語言研發,從2012年12月創建并發展至今,從原有的單服務的流媒體服務器形式,擴展成現在的云平臺架構開源項目,屬于高性能開源RTSP流媒體服務器,在Github上受到廣大歡迎。
特點:RTSP推模式轉發、RTSP拉模式轉發、錄像、檢索、回放、關鍵幀緩存、秒開畫面、RESTful接口、WEB后臺管理、分布式負載均衡。
下載解壓 EasyDarwin
下載解壓 release 包
直接運行 EasyDarwin.exe
以 Ctrl + C 停止服務。打開瀏覽器輸入 http://localhost:10008, 進入控制頁面,默認用戶名密碼是admin/admin
查看本機攝像頭設備
打開PowerShell輸入以下命令
ffmpeg -list_devices true -f dshow -i dummy
開始推流
ffmpeg -f dshow -i video="HP HD Camera" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -rtsp_transport tcp -f rtsp rtsp://10.25.184.33/test
參數解釋
-f dshow -i video=“攝像頭名稱” 指定從本地攝像頭中讀取視頻流。將“攝像頭名稱”替換為您的攝像頭名稱,例如“HP HD Camera”。
-vcodec libx264 指定使用 x264 編碼器進行視頻編碼。
-preset ultrafast 設置編碼速度。這里使用的是最快的編碼速度,但可能會導致視頻質量下降。
-tune zerolatency 設置編碼器以實現零延遲。
-f rtsp 指定輸出流的格式為 RTSP。
rtsp://<IP地址>/<路徑> 指定 RTSP 流的目標地址。請將 <IP地址> 替換為 Windows 本機 IP 地址,將 <路徑> 替換為您想要為流指定的路徑。
成功推流如下,注意保持控制臺的運行
三、在ubuntu 終端編寫代碼
創建目錄及文件
mkdir -p rtsp_demo/src
cd rtsp_demo/src
touch main.cpp
編輯main.cpp
vi main.cpp
代碼如下
#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文件
cd ../
touch CMakeLists.txt
vi 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
此時會生成可執行文件 rtsp_demo
四、結果展示
啟動圖形界面
參見鏈接 https://blog.csdn.net/weixin_46119406/article/details/132269782?spm=1001.2014.3001.5501
在圖形界面打開終端找到 rtsp_demo運行
./rtsp_demo