文章目录
前言
由于wsl2环境与主机系统隔离,访问本机摄像头是有限的,但是,可以通过第三方库或网络摄像头来解决这个问题,本文将本地摄像头通过rtsp流来给wsl2访问。
一、ubuntu安装opencv库
详见链接:
二、启动 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
四、结果展示
启动图形界面
参见链接
在图形界面打开终端找到 rtsp_demo运行
./rtsp_demo
发表评论