2016-12-30 101 views
0

我試圖通過本地網絡將來自覆盆子pi相機的視頻流式傳輸到我的PC。從raspberrry pi使用gstreamer在opencv中捕獲流

在樹莓派的一面,我使用的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 32bit編譯的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一起工作。 我搜索了這個問題,但我找不到任何有用的東西,所以我會很感激一些幫助。

+0

我認爲udpsrc可能需要cap來定義編碼類型。像'application/x-rtp,encoding-name = H264,payload = 96',而不是'application/x-rtp,payload = 96'。 –

+0

感謝您的評論,但添加上限似乎並不重要。 – Wopke

回答

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; 
} 

然後我就樹莓PI運行:

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 

爲了使這項工作,你需要在樹莓派安裝的GStreamer和rpicamsrc。

此外,你需要有與您的電腦上的gstreamer 32位編譯的opencv。首先安裝gstreamer,開發者版本,然後編譯opencv。有關在visual studio中編譯opencv的幫助,請參閱this