从 python 中的 opencv 写入 Gstreamer 管道
Posted
技术标签:
【中文标题】从 python 中的 opencv 写入 Gstreamer 管道【英文标题】:Write in Gstreamer pipeline from opencv in python 【发布时间】:2018-01-14 15:21:21 【问题描述】:我正在尝试使用 gstreamer 从 opencv 流式传输一些图像,但管道出现了一些问题。一般来说,我是 gstreamer 和 opencv 的新手。我在树莓派 3 上用 gstreamer 为 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 使用它,并将我的算法操作的图像输入其中。我做了一些研究,发现我可以将 videoWriter 与 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 客户端,从延迟和消耗资源的角度来看,结果非常好。
【问题讨论】:
【参考方案1】:我遇到了解决方案,我希望这可以帮助遇到相同问题的其他人。 管道布置错误,需要videoconvert。 另一方面,延迟非常相关,但将 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()
【讨论】:
谢谢,但我怎样才能获得并显示输出?以上是关于从 python 中的 opencv 写入 Gstreamer 管道的主要内容,如果未能解决你的问题,请参考以下文章
GStreamer-CRITICAL **:gst_element_get_state:Opencv 中的断言“GST_IS_ELEMENT(元素)”失败错误
OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频