Raspbian Buster下PySide2+GStreamer视频播放报错求助
在树莓派Zero W上用PySide2播放视频时GStreamer异常的解决办法
我用PySide2开发的视频播放UI在Windows上运行正常,但放到树莓派Zero W上时,GStreamer库出现异常,程序无法初始化。
我的代码
class mainWindow(QStackedWidget): def __init__(self): super().__init__() # 无关代码省略 # 视频播放器配置 - 窗口1 self.videoPlayer=QMediaPlayer() self.videoPlayer.setMedia(QUrl.fromLocalFile("file:///home/.../pyside2/VideoExample.avi")) # 无关代码省略 class QVideoWidget2(QVideoWidget): """自动切换窗口的视频控件""" def __init__(self, mainWindow): super().__init__() # 5秒后切换到索引为1的窗口 QTimer.singleShot(5000, lambda: mainWindow.setCurrentIndex(1)) def main(): ex = mainWindow() ex.videoPlayer.play() # 开始播放视频 sys.exit(app.exec_()) app = QApplication(sys.argv)
运行时错误信息
QObject::connect: No such signal QVideoWidget2::supportedFormatsChanged() ERROR: Caught a segmentation fault while loading plugin file: /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgsttypefinsfunctions.so Please either: - remove it and restart - run with --gst-disable-segtrap --gst-disable-registry-fork and debug
我已经尝试卸载并重装GStreamer,但问题依旧,求可行的解决方法。
补充环境信息
- 树莓派系统版本:执行
cat /etc/os-release输出
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" NAME="Raspbian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
- GStreamer版本:执行
gst-launch-1.0 --gst-version输出
GStreamer Core Library version 1.14.4
解决步骤
1. 修复GStreamer插件崩溃问题
- 先试临时规避方案,启动程序时添加参数:
python3 your_script.py --gst-disable-segtrap --gst-disable-registry-fork - 如果临时方案有效,彻底修复插件:
- 备份出问题的插件文件:
sudo mv /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgsttypefinsfunctions.so /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgsttypefinsfunctions.so.bak - 重装GStreamer核心插件包:
sudo apt-get install --reinstall gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad
- 备份出问题的插件文件:
2. 修复Qt信号缺失问题
错误提示的supportedFormatsChanged()信号找不到,是因为自定义子类没有继承该信号,两种解决方式:
- 方式一:给子类补全信号声明
修改QVideoWidget2的代码:from PySide2.QtCore import Signal class QVideoWidget2(QVideoWidget): """自动切换窗口的视频控件""" supportedFormatsChanged = Signal() # 声明缺失的信号 def __init__(self, mainWindow): super().__init__() QTimer.singleShot(5000, lambda: mainWindow.setCurrentIndex(1)) - 方式二:改用原生控件
直接使用QVideoWidget,把定时器逻辑移到主窗口里,避免子类继承问题。
3. 适配树莓派的视频播放环境
- 安装AVI格式的解码插件:
sudo apt-get install gstreamer1.0-libav - 指定GStreamer作为媒体后端,初始化
QMediaPlayer时添加参数:self.videoPlayer = QMediaPlayer(None, QMediaPlayer.GstreamerMediaPlayer) - 修正视频路径,去掉
file://前缀,直接用本地绝对路径:self.videoPlayer.setMedia(QUrl.fromLocalFile("/home/.../pyside2/VideoExample.avi"))
4. 补全PySide2依赖
确保树莓派上安装了完整的PySide2多媒体组件:
sudo apt-get install python3-pyside2.qtmultimedia python3-pyside2.qtwidgets
内容的提问来源于stack exchange,提问作者Edumt10
相关产品推荐
相关产品推荐

