我们用电脑连接了一台BlueRov水下机器人,想使用Python逐帧读取机器人上搭载的摄像头信息,但是遇到了加载不了gstreamer插件的问题。代码如下:
#!/usr/bin/env python
"""
BlueRov video capture class
"""
import cv2
import gi
import numpy as np
gi.require_version('Gst', '1.0')
from gi.repository import Gst
class Video():
"""BlueRov video capture class constructor
Attributes:
port (int): Video UDP port
video_codec (string): Source h264 parser
video_decode (string): Transform YUV (12bits) to BGR (24bits)
video_pipe (object): GStreamer top-level pipeline
video_sink (object): Gstreamer sink element
video_sink_conf (string): Sink configuration
video_source (string): Udp source ip and port
"""
def __init__(self, port=5600):
"""Summary
Args:
port (int, optional): UDP port
"""
Gst.init(None)
self.port = port
self._frame = None
# [Software component diagram](https://www.ardusub.com/software/components.html)
# UDP video stream (:5600)
self.video_source = 'udpsrc port={}'.format(self.port)
# [Rasp raw image](http://picamera.readthedocs.io/en/release-0.7/recipes2.html#raw-image-capture-yuv-format)
# Cam -> CSI-2 -> H264 Raw (YUV 4-4-4 (12bits) I420)
self.video_codec = '! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! avdec_h264'
# Python don't have nibble, convert YUV nibbles (4-4-4) to OpenCV standard BGR bytes (8-8-8)
self.video_decode = \
'! decodebin ! videoconvert ! video/x-raw,format=(string)BGR ! videoconvert'
# Create a sink to get data
self.video_sink_conf = \
'! appsink emit-signals=true sync=false max-buffers=2 drop=true'
self.video_pipe = None
self.video_sink = None
self.run()
def start_gst(self, config=None):
""" Start gstreamer pipeline and sink
Pipeline description list e.g:
[
'videotestsrc ! decodebin', \
'! videoconvert ! video/x-raw,format=(string)BGR ! videoconvert',
'! appsink'
]
Args:
config (list, optional): Gstreamer pileline description list
"""
if not config:
config = \
[
'videotestsrc ! decodebin',
'! videoconvert ! video/x-raw,format=(string)BGR ! videoconvert',
'! appsink'
]
command = ' '.join(config)
self.video_pipe = Gst.parse_launch(command)
self.video_pipe.set_state(Gst.State.PLAYING)
self.video_sink = self.video_pipe.get_by_name('appsink0')
@staticmethod
def gst_to_opencv(sample):
"""Transform byte array into np array
Args:
sample (TYPE): Description
Returns:
TYPE: Description
"""
buf = sample.get_buffer()
caps = sample.get_caps()
array = np.ndarray(
(
caps.get_structure(0).get_value('height'),
caps.get_structure(0).get_value('width'),
3
),
buffer=buf.extract_dup(0, buf.get_size()), dtype=np.uint8)
return array
def frame(self):
""" Get Frame
Returns:
iterable: bool and image frame, cap.read() output
"""
return self._frame
def frame_available(self):
"""Check if frame is available
Returns:
bool: true if frame is available
"""
return type(self._frame) != type(None)
def run(self):
""" Get frame to update _frame
"""
self.start_gst(
[
self.video_source,
self.video_codec,
self.video_decode,
self.video_sink_conf
])
self.video_sink.connect('new-sample', self.callback)
def callback(self, sink):
sample = sink.emit('pull-sample')
new_frame = self.gst_to_opencv(sample)
self._frame = new_frame
return Gst.FlowReturn.OK
if __name__ == '__main__':
# Create the video object
# Add port= if is necessary to use a different one
video = Video(port=4777)
while True:
# Wait for the next frame
if not video.frame_available():
continue
frame = video.frame()
cv2.imshow('frame', frame)
if cv2.waitKey(30) & 0xff == 27:
break
报错信息如下:
(python.exe:14320): GStreamer-WARNING **: 10:19:27.822: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstadder.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.835: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstalaw.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.851: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstapetag.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.864: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudioconvert.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.876: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudiofx.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.888: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudiomixer.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.904: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudioparsers.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.928: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudiorate.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.943: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudioresample.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.954: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstaudiotestsrc.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.965: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstauparse.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.980: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstavi.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:27.993: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstcutter.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.006: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstdirectsound.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.018: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstencoding.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.030: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstequalizer.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.057: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstflv.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.080: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstgoom.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.103: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstgoom2k1.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.117: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gsticydemux.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.137: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstid3demux.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.150: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstinterleave.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.165: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstisomp4.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.178: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstlevel.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.197: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstmatroska.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.212: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstmulaw.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.232: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstogg.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.249: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstplayback.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.268: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstrawparse.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.289: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstreplaygain.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.310: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstrtp.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.328: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstrtpmanager.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.340: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstrtsp.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.352: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstsoup.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.365: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstspectrum.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.382: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gsttypefindfunctions.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.397: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstvolume.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.409: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstwaveform.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.423: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstwavenc.dll': %1 ������Ч�� Win32 Ӧ�ó���
(python.exe:14320): GStreamer-WARNING **: 10:19:28.440: Failed to load plugin 'C:\Users\14361\anaconda3\envs\rov\Library\lib\gstreamer-1.0\gstwavparse.dll': %1 ������Ч�� Win32 Ӧ�ó���
Traceback (most recent call last):
File "D:\各种表格和文件\水下机器人开发组比赛\CSDNcode.py", line 138, in <module>
video = Video(port=4777)
File "D:\各种表格和文件\水下机器人开发组比赛\CSDNcode.py", line 53, in __init__
self.run()
File "D:\各种表格和文件\水下机器人开发组比赛\CSDNcode.py", line 117, in run
self.start_gst(
File "D:\各种表格和文件\水下机器人开发组比赛\CSDNcode.py", line 76, in start_gst
self.video_pipe = Gst.parse_launch(command)
gi.repository.GLib.GError: gst_parse_error: no element "rtph264depay" (1)
在命令行上运行gstreamer代码时,可以将视频推出来,但是不能做到逐帧读取。命令行运行的代码如下:
gst-launch-1.0 udpsrc port=5600 ! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
请问有朋友能帮忙看看这是什么问题吗?十分感谢!