[英]Write in Gstreamer pipeline from opencv in python
我正在尝试使用gstreamer从opencv流式传输一些图像,我得到了管道的ome问题。 我是gstreamer和opencv的新手。 我用覆盆子pi 3上的gstreamer for python3编译了opencv 3.2。我有一个与raspivid一起使用的bash脚本
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
我想翻译这个管道,以便从opencv中使用它并将其输入到我的算法操作的图像中。 我做了一些研究,并认为我可以使用appsrc而不是fdsrc,但我得到以下错误
GStreamer Plugin: Embedded video playback halted; module appsrc0 reported: Internal data flow error.
我想出的python脚本是导入cv2的方式
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客户端,从延迟角度和消耗资源的结果非常好。
我遇到了解决方案,我希望这可以帮助遇到同样问题的其他人。 错误地安排了管道,需要视频转换。 另一方面,延迟是非常相关的,但设置speed.preset到超快速解决了问题,即使那里没有太多的压缩,这是一个很好的妥协。 这是我的解决方案。
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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.