2017-08-07 45 views
1

gstreamerを使ってopencv形式の画像をいくつかストリームしようとしていますが、パイプラインに問題があります。私は一般的にgstreamerとopencvの新機能です。私はOpenCVのからそれを使用するためには、このパイプラインを翻訳し、その中に画像を送りたいと思った私はraspividpythonでopencvからGstreamerパイプラインに書き込む

raspivid -fps 25 -h 720 -w 1080 -vf -n -t 0 -b 2000000 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.1.27 port=5000 

で使う小さなbashスクリプトを持っているラズベリーパイ3.上のpython3のためのGStreamerとOpenCVの3.2をコンパイル私のアルゴリズムが操作します。私はいくつかの研究を行なったし、私が代わりにfdsrcのappsrcとvideoWriter使用できることを考え出したが、私は次のエラー私は道 輸入CV2によって、次のされて思い付いた

GStreamer Plugin: Embedded video playback halted; module appsrc0 reported: Internal data flow error. 

Pythonスクリプトを取得

cap = cv2.VideoCapture(0) 


# Define the codec and create VideoWriter object 
fourcc = cv2.VideoWriter_fourcc(*'MJPG') 
out = cv2.VideoWriter('appsrc ! h264parse ! ' 
         'rtph264pay config-interval=1 pt=96 ! ' 
         'gdppay ! tcpserversink host=192.168.1.27 port=5000 ', 
         fourcc, 20.0, (640, 480)) 

while cap.isOpened(): 
    ret, frame = cap.read() 
    if ret: 
     frame = cv2.flip(frame, 0) 

     # write the flipped frame 
     out.write(frame) 

     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 
    else: 
     break 

# Release everything if job is finished 
cap.release() 
out.release() 
cv2.destroyAllWindows() 

パイプラインにエラーはありますか?私はエラーを理解していない。私はすでにbashパイプラインから読み込むことができるPythonクライアントを持っており、その結果はレイテンシの観点からかなり良く、リソースを消費します。

答えて

1

私は解決策を見つけました。これは、同じ問題を抱えている他の人に役立つことを願っています。 パイプラインが間違って配置され、ビデオコンバートが必要でした。 一方、レイテンシーはかなり重要でしたが、speed.presetをultrafastに設定すると、圧縮があまり進んでいなくても問題は解決しましたが、それは良い妥協案でした。ここに私の解決策があります。

import cv2 

cap = cv2.VideoCapture(0) 

framerate = 25.0 

out = cv2.VideoWriter('appsrc ! videoconvert ! ' 
         'x264enc noise-reduction=10000 speed-preset=ultrafast tune=zerolatency ! ' 
         'rtph264pay config-interval=1 pt=96 !' 
         'tcpserversink host=192.168.1.27 port=5000 sync=false', 
         0, framerate, (640, 480)) 

while cap.isOpened(): 
    ret, frame = cap.read() 
    if ret: 

     out.write(frame) 

     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 
    else: 
     break 

# Release everything if job is finished 
cap.release() 
out.release() 
関連する問題