在opencv中使用gstreamer从raspberrry pi捕获流

时间:2016-12-30 15:46:02

标签: opencv stream udp gstreamer

我正在尝试通过本地网络将视频从树莓摄像机传输到我的电脑。

在RaspberryPi方面,我使用gstreamer使用以下命令:

raspivid -n -t 0 -rot 270 -w 960 -h 720 -fps 30 -b 6000000 -o - | gst-launch-1.0 -e -vvvv fdsrc ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=192.168.1.85 port=5000

我在PC端使用以下命令:

gst-launch-1.0 -e -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false

在这种情况下,视频会显示,一切正常。但是,我想在C ++程序中使用OpenCV捕获流。我正在尝试使用使用gstreamer-1.0 32位编译的OpenCV 3.2来完成此操作。

当我运行以下代码以尝试捕获流时:

#include <opencv2/opencv.hpp>

int main(int argc, char *argv[])
{
    cv::VideoCapture cap("udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! appsink");

    return 0;
}

我收到以下错误:

GStreamer Plugin: Embedded video playback halted; module udpsrc0 reported: Internal data stream error.

OpenCV Error: Unspecified error (GStreamer: unable to start pipeline) in cvCaptureFromCAM_GStreamer, file:\opencv\modules\videoio\src\cap_gstreamer.cpp, line 832

我能够使用OpenCV接收其他流,但我无法使用gstreamer。 我搜索了这个问题,但我找不到任何有用的东西,所以我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

我已经再次尝试了这个问题,现在就可以了。我将发布我是如何做到的,希望别人会有更轻松的时间。

我按照wumpus的说明进行操作。 在PC端我运行:

#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
    cv::VideoCapture cap("udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! appsink sync=false");

    return 0;
}

然后我在树莓派上跑:

gst-launch-1.0 rpicamsrc bitrate=3000000 ! video/x-h264, width=960, height=720 ! h264parse ! queue ! rtph264pay config-interval=1 pt=96 ! gdppay ! udpsink host=192.168.1.85 port=5000

要完成这项工作,您需要在raspberry pi上安装gstreamer和rpicamsrc。

此外,您需要在PC上使用gstreamer 32位编译opencv。首先安装gstreamer,开发人员版本,然后编译opencv。有关在visual studio中编译opencv的帮助,请参阅this