OpenCV 无法从树莓派创建的 gstreamer 打开网络流
OpenCV can't open network stream from gstreamer created by raspberry
我正在尝试使用 Gstreamer 从我的 Raspberry pi 打开单播 udp 流。此流将在 Windows PC 上使用带有 OpenCV 的 C++ 应用程序接收。这是我在树莓派上用来启动流的 shellscript:
raspivid -t 0 -h 1080 -w 1920 -fps 30 -hf -vf -n -b 6000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay config-interval=5 pt=96 ! udpsink host=192.168.0.101 port=5001
我可以使用像这样的批处理文件在我的 Windows PC 上接收和显示素材:
@echo off
cd C:\gstreamer.0\x86_64\bin
gst-launch-1.0 -e -v udpsrc port=5001 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
为了能够在我的 C++ 应用程序中使用此流,我使用了 Opencv。我不熟悉使用 Opencv 打开流。我正在尝试使用以下代码打开流:
cv::VideoCapture cap("udp://@:5001");
if (!cap.isOpened()) {
printf("=ERR= can't create video capture\n");
return -1;
}
当我 运行 我的应用程序卡在(未崩溃)cv::VideoCapture 上限时("udp://@:5001");每次。我不确定引号之间的输入参数是什么。当我对流进行 wireshark 时,我得到了这个结果:
Source:192.186.0.103 Destination:192.168.0.101 Protocol:UDP Length:1442 Info:35946->5001 Len=1400
显然这只是众多软件包中的一个。
任何人都可以帮助我处理这些输入参数或告诉我另一种在 OpenCV 中打开流的方法吗?
OpenCv 支持 gstreamer,您可以将管道输入到 VideoCapture。你需要做的是用 appsink 完成你的管道。
在你的情况下你可以使用
const char* pipe = "udpsrc port=5001 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! appsink"
cv::VideoCapture cap(pipe);
我正在尝试使用 Gstreamer 从我的 Raspberry pi 打开单播 udp 流。此流将在 Windows PC 上使用带有 OpenCV 的 C++ 应用程序接收。这是我在树莓派上用来启动流的 shellscript:
raspivid -t 0 -h 1080 -w 1920 -fps 30 -hf -vf -n -b 6000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay config-interval=5 pt=96 ! udpsink host=192.168.0.101 port=5001
我可以使用像这样的批处理文件在我的 Windows PC 上接收和显示素材:
@echo off
cd C:\gstreamer.0\x86_64\bin
gst-launch-1.0 -e -v udpsrc port=5001 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
为了能够在我的 C++ 应用程序中使用此流,我使用了 Opencv。我不熟悉使用 Opencv 打开流。我正在尝试使用以下代码打开流:
cv::VideoCapture cap("udp://@:5001");
if (!cap.isOpened()) {
printf("=ERR= can't create video capture\n");
return -1;
}
当我 运行 我的应用程序卡在(未崩溃)cv::VideoCapture 上限时("udp://@:5001");每次。我不确定引号之间的输入参数是什么。当我对流进行 wireshark 时,我得到了这个结果:
Source:192.186.0.103 Destination:192.168.0.101 Protocol:UDP Length:1442 Info:35946->5001 Len=1400
显然这只是众多软件包中的一个。
任何人都可以帮助我处理这些输入参数或告诉我另一种在 OpenCV 中打开流的方法吗?
OpenCv 支持 gstreamer,您可以将管道输入到 VideoCapture。你需要做的是用 appsink 完成你的管道。
在你的情况下你可以使用
const char* pipe = "udpsrc port=5001 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! appsink"
cv::VideoCapture cap(pipe);