PyQt6 6.7.0在Windows系统下QtMultimedia后端缺失问题求助
PyQt6 6.7.0在Windows Anaconda环境下QtMultimedia后端缺失问题
问题描述
在Windows 10/11的Anaconda环境中使用PyQt6 6.7.0时,出现QtMultimedia相关功能失效,错误信息如下:
No QtMultimedia backends found. Only QMediaDevices, QAudioDevice, QSoundEffect, QAudioSink, and QAudioSource are available. Failed to initialize QMediaPlayer "Not available" Failed to create QVideoSink "Not available"
通过requirements文件安装依赖,文件内容:
PyQt6 PyQt6-WebEngine requests pyserial pynput
已尝试的操作:
- 回滚PyQt6到6.6.1版本,触发新错误:
ImportError: DLL load failed while importing QtGui: The specified procedure could not be found. - 安装ffmpeg,问题未解决
- 在WSL2 Ubuntu环境测试,错误消失但曾出现黑屏(已解决,原因是路径差异)
复现代码
from PyQt6.QtGui import QIcon, QFont from PyQt6.QtCore import QDir, Qt, QUrl, QSize from PyQt6.QtMultimedia import QMediaPlayer from PyQt6.QtMultimediaWidgets import QVideoWidget from PyQt6.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel, QStyleFactory, QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget, QStatusBar) class VideoPlayer(QWidget): def __init__(self, parent=None): super(VideoPlayer, self).__init__(parent) self.mediaPlayer = QMediaPlayer() btnSize = QSize(16, 16) videoWidget = QVideoWidget() openButton = QPushButton("Open Video") openButton.setToolTip("Open Video File") openButton.setStatusTip("Open Video File") openButton.setFixedHeight(24) openButton.setIconSize(btnSize) openButton.setFont(QFont("Noto Sans", 8)) openButton.setIcon(QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png"))) openButton.clicked.connect(self.abrir) self.playButton = QPushButton() self.playButton.setEnabled(False) self.playButton.setFixedHeight(24) self.playButton.setIconSize(btnSize) self.playButton.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay)) self.playButton.clicked.connect(self.play) self.positionSlider = QSlider(Qt.Orientation.Horizontal) self.positionSlider.setRange(0, 0) self.positionSlider.sliderMoved.connect(self.setPosition) self.statusBar = QStatusBar() self.statusBar.setFont(QFont("Noto Sans", 7)) self.statusBar.setFixedHeight(14) controlLayout = QHBoxLayout() controlLayout.setContentsMargins(0, 0, 0, 0) controlLayout.addWidget(openButton) controlLayout.addWidget(self.playButton) controlLayout.addWidget(self.positionSlider) layout = QVBoxLayout() layout.addWidget(videoWidget) layout.addLayout(controlLayout) layout.addWidget(self.statusBar) self.setLayout(layout) self.mediaPlayer.setVideoOutput(videoWidget) self.mediaPlayer.playbackStateChanged.connect(self.mediaStateChanged) self.mediaPlayer.positionChanged.connect(self.positionChanged) self.mediaPlayer.durationChanged.connect(self.durationChanged) self.mediaPlayer.errorChanged.connect(self.handleError) self.statusBar.showMessage("Ready") def abrir(self): fileName, _ = QFileDialog.getOpenFileName(self, "Select Media", ".", "Video Files (*.mp4 *.flv *.ts *.mts *.avi)") if fileName != '': self.mediaPlayer.setSource(QUrl.fromLocalFile(fileName)) self.playButton.setEnabled(True) self.statusBar.showMessage(fileName) self.play() def play(self): if self.mediaPlayer.playbackState() == QMediaPlayer.PlaybackState.PlayingState: self.mediaPlayer.pause() else: self.mediaPlayer.play() def mediaStateChanged(self, state): if self.mediaPlayer.playbackState() == QMediaPlayer.PlaybackState.PlayingState: self.playButton.setIcon( self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPause)) else: self.playButton.setIcon( self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay)) def positionChanged(self, position): self.positionSlider.setValue(position) def durationChanged(self, duration): self.positionSlider.setRange(0, duration) def setPosition(self, position): self.mediaPlayer.setPosition(position) def handleError(self): self.playButton.setEnabled(False) self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString()) if __name__ == '__main__': import sys app = QApplication(sys.argv) player = VideoPlayer() player.setWindowTitle("Player") player.resize(900, 600) player.show() sys.exit(app.exec())
当前环境包列表(Python 3.9.2)
certifi 2024.6.2 charset-normalizer 3.3.2 idna 3.7 pip 24.0 pynput 1.7.6 PyQt6 6.7.0 PyQt6-Qt6 6.7.1 PyQt6-sip 13.6.0 PyQt6-WebEngine 6.7.0 PyQt6-WebEngine-Qt6 6.7.1 PyQt6-WebEngineSubwheel-Qt6 6.7.1 pyserial 3.5 requests 2.31.0 setuptools 69.5.1 six 1.16.0 urllib3 2.2.1 wheel 0.43.0
补充信息
该问题在MacOS系统中也存在类似情况。
解决建议
降级到PyQt6 6.6.0及配套Qt版本
6.7.x版本的PyQt6在Anaconda环境中存在多媒体后端缺失的已知问题,指定版本安装:pip uninstall -y PyQt6 PyQt6-Qt6 PyQt6-WebEngine PyQt6-WebEngine-Qt6 pip install PyQt6==6.6.0 PyQt6-Qt6==6.6.0 PyQt6-WebEngine==6.6.0 PyQt6-WebEngine-Qt6==6.6.0检查QtMultimedia后端文件
确认Anaconda环境下Lib\site-packages\PyQt6\Qt6\plugins\mediaservice目录中存在dsengine.dll(Windows平台)等后端文件,若缺失可从Qt官方安装包中复制对应文件到该目录。使用官方Qt安装包替代PyPI版本
下载Qt 6.6.x官方安装程序,安装后配置环境变量QT_PLUGIN_PATH指向Qt安装目录下的plugins文件夹,再重新安装对应版本的PyQt6。排查环境冲突
确保系统环境变量包含Qt相关路径,避免Anaconda环境与系统全局Qt版本冲突,不要同时安装多个版本的Qt或PyQt。
内容的提问来源于stack exchange,提问作者Belleroph0N
相关产品推荐
相关产品推荐

