说在前面
- 树莓派版本 :4B
- 树莓派系统:Manjaro-ARM-xfce-rpi4-20.02
- PC环境:ubuntu16.04
- opencv版本:4.2.0(编译时添加gstreamer选项)
创建RTP流
-
这里实际上是
gstreamer
的功劳,所以编译时opencv
需要带上该选项,若使用的是manjaro
或archlinux
,那么使用pacman
安装的opencv
带有该功能。 -
附加
这俩主要有一些编码用到的插件sudo pacman -S gst-plugins-good gst-plugins-ugly
-
代码
代码比较简单,主要是gst
的参数比较麻烦
(摄像头分辨率是640x480
,可使用cam.set(cv::CAP_PROP_FRAME_WIDTH, 640); cam.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
进行更改)#include <opencv2/opencv.hpp> int main() { cv::VideoCapture cam(0); cv::VideoWriter out("appsrc ! \ videoconvert ! \ x264enc \ tune=zerolatency \ bitrate=500 \ speed-preset=superfast ! \ rtph264pay \ config-interval=10 \ pt=96 ! \ udpsink \ host=127.0.0.1 \ port=5000", cv::CAP_GSTREAMER,0,10, cv::Size(640,480), true); // 这里实际上用的是gst,然后带了一堆的参数 if(!cam.isOpened() || !out.isOpened()) { std::cout<<"VideoCapture or VideoWriter not opened"<<std::endl; exit(-1); } while (true) { cv::Mat src; auto success = cam.read(src); if (!success) { std::cout << "cam read fail!" << std::endl; break; } out.write(src); cv::waitKey(5); } return 0; }
编译用的
cmake
,可参考【树莓派/入门】64位系统Manjaro-ARM-xfce试用(持续更新) opencv 部分
vlc播放
- 安装vlc
sudo pacman -S vlc
- 创建
sdp
文件nano sdp
v=0 m=video 5000 RTP/AVP 96 c=IN IP4 127.0.0.1 a=rtpmap:96 H264/90000
- 运行
vlc sdp
- 截图
有些延迟,并且会输出奇怪的错误,但是显示是正常的