小归海爱吃小海龟 2024-06-08 10:33 采纳率: 100%
浏览 21
已结题

Python读取BlueRov视频时无法加载gstreamer插件

我们用电脑连接了一台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

请问有朋友能帮忙看看这是什么问题吗?十分感谢!

  • 写回答

2条回答 默认 最新

  • 小归海爱吃小海龟 2024-06-09 09:20
    关注

    解决方法:最后发现是python里面安装的某一个库和gstreamer有冲突,导致环境变量一直配不好。需要自己在Linux系统的电脑下安装需要的库并配好环境变量才可以。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?