2016-07-23 2 views
1

Ich verwende OpenCV und GStreamer 0.10.Ergreifen Sie den Rahmen von GST-Pipeline zu opencv mit Python

Ich benutze diese Pipeline, um die MPEG ts Pakete über UDP mit einem benutzerdefinierten Socket sockfd von Python zur Verfügung gestellt und es mit xvimagesink anzuzeigen, und es funktioniert einwandfrei. commend Linie folgende ist für diese Pipeline:

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" 

Nun möchte ich aus dieser Pipeline einen Rahmen erhalten und es mit OpenCV anzuzeigen. Wie kann ich es tun? Ich weiß viel über Pufferdaten von Appsink. Aber ich weiß immer noch nicht, wie man diese Puffer in jeden Rahmen für OpenCV konvertiert. Danke für die Antwort und jede Hilfe:]

+0

Danke für die Bearbeitung von Tyler, Try:] –

+0

Willkommen bei SO :) Bitte zeigen Sie uns etwas Arbeit mit Appsink - wenn Sie es bereits verwendet haben, ist dies die tatsächliche Lösung - oder funktioniert es nicht richtig für Sie? Ich denke, Sie müssen nur den Datenteil des Puffers extrahieren, der einen Videoframe darstellt, der für OpenCV verarbeitbar sein sollte. Eine andere Sache ist, dass Sie eine wirklich veraltete Version von GStreamer verwenden, die schon seit Jahren von niemandem mehr unterstützt wird - für Diese Aufgabe - da Sie keine spezifischen Treiber verwenden, die 0.10 benötigen - können Sie zu 1.x wechseln - es gibt auch Python-Bindings für diese Version. Viel Glück – nayana

+0

Danke, ich habe versucht, zu gst 1.0 zu wechseln, aber es gibt eine der wichtigsten Eigenschaft namens "sockfd", die ich verwenden muss, um einen benutzerdefinierten Socket für diese Pipeline zu machen. Es funktionierte gut mit gst 0.10. Allerdings, als ich zu gst 1.0 wechselte, und versuchte, "GSocket" anstelle von "sockfd" zu verwenden. Es gezeigt, dass "keine Verbindung mit src" gefällt http://stackoverflow.com/questions/37795191/error-in-pipeline-porting-pygst-program-from-gstreamer-0-10-to-1-0, also ich ging zurück zu gst 0.10. –

Antwort

0

Danke, ich habe versucht, rtph264pay zu verwenden, um den Live-Video-Dampf zu udpsink zu übertragen. commend Linie folgende ist für die gst Pipeline:

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

Und ich baute eine SDP-Datei zu machen, kann durch opencv empfangen werden mag Videocapture („123.sdp“) 123.sdp, Inhalte finden für diese SDP-Datei :

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

Es funktionierte nun gut, löschen müssen nur "Blockgröße = 1316 closefd = false buffer-size = 5600", um die Einschränkung zu lösen.

+0

aber wo ist der openCV Teil? Ist das wirklich die Antwort? – nayana

+0

Danke, ich habe die opencv verwendet: video_capture = cv2.VideoCapture ("123.sdp") "123.sdp" ist der Name der SDP-Datei. –

+0

ok - vielleicht kenne ich OpenCV einfach nicht ... aber vielleicht möchtest du das zu deiner Antwort hinzufügen .. weil du auf OpenCV fragst, aber in deiner Antwort nennst du es nicht .. dann kannst du die Antwort akzeptieren wenn du Wunsch – nayana