2016-07-23 76 views
1

我正在使用OpenCV和GStreamer 0.10從gst管道抓取框架到python的opencv

我使用這個管道通過UDP接收MPEG ts數據包,使用python提供的自定義套接字sockfd,並使用xvimagesink顯示它,並且它的工作原理完美。下面是對這條管線的推薦線:

PIPELINE_DEF = "udpsrc do-timestamp=true name=src blocksize=1316 closefd=false buffer-size=5600 !" \ 
      "mpegtsdemux !" \ 
      "queue !" \ 
      "ffdec_h264 max-threads=0 !" \ 
      "ffmpegcolorspace !" \ 
      "xvimagesink name=video" 

現在,我想從這個管道中獲得一個幀並用OpenCV顯示它。我該怎麼做?我知道很多關於從appsink獲取緩衝區數據的知識。但我仍然不知道如何將這些緩衝區轉換爲OpenCV的每個幀。感謝您的回覆,以及任何幫助:]

+0

感謝您編輯Tyler,請嘗試:] –

+0

歡迎來到SO :)請向我們展示一些與appsink有關的工作 - 如果您已經使用過它,這是實際的解決方案 - 或者它不適合您?我認爲你只需要提取代表一個視頻幀的緩衝區的數據部分,這個視頻幀應該可以用於OpenCV;另一件事是你正在使用已經多年不被任何人支持的已經過時的GStreamer版本 - for這個任務 - 因爲你不使用需要0.10的特定驅動程序 - 你可以切換到1.x - 這個版本也有python綁定。祝你好運 – nayana

+0

謝謝,我試圖使用切換到gst 1.0,但有一個最重要的屬性叫做「sockfd」,我需要使用它來爲此管道創建自定義套接字。它與gst 0.10很好地工作。但是,當我切換到gst 1.0,並嘗試使用「GSocket」而不是「sockfd」。它顯示「沒有鏈接到src」喜歡這個http://stackoverflow.com/questions/37795191/error-in-pipeline-porting-pygst-program-from-gstreamer-0-10-to-1-0,所以我回到0.10。 –

回答

0

謝謝,我試圖用rtph264pay向udpsink播放實時視頻流。繼稱道行是GST管道:

PIPELINE_DEF = 
"udpsrc name=src !" \    
"mpegtsdemux !" \  
"queue !" \    
"h264parse !" \ 
"rtph264pay !" \ 
"udpsink host=127.0.0.1 port=5000" 

而且我建了一個SDP文件,使其可以通過OpenCV的接收喜歡videocapture(「123.sdp」)123.sdp,以下內容是這個SDP文件:

c=IN IP4 127.0.0.1 
m=video 5000 RTP/AVP 96 
a=rtpmap:96 H264/90000 

它現在運行良好,只需要刪除「blocksize = 1316 closefd = false buffer-size = 5600」即可解除限制。

+0

但openCV部分在哪裏?這真的是答案嗎? – nayana

+0

謝謝,我使用了opencv:video_capture = cv2.VideoCapture(「123.sdp」)「123.sdp」是sdp文件的名稱。 –

+0

好 - 也許我只是不熟悉OpenCV ..但你可能想添加這個給你答案..因爲你問OpenCV,但在你的答案你沒有提及它..那麼你可以接受答案,如果你祝 – nayana