QMediaPlayer仅显示某些视频的音频

时间:2019-09-10 23:29:43

标签: python windows pyside2 qtmultimedia video-codecs

根据docs中的示例,我正在使用QMediaPlayer。

这是我的代码:

from PySide2 import QtWidgets
from PySide2 import QtCore
from PySide2.QtMultimedia import QMediaPlayer
from PySide2.QtMultimediaWidgets import QVideoWidget


class App(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.player = QMediaPlayer()
        self.video = QVideoWidget(self)
        self.player.setMedia(QtCore.QUrl.fromLocalFile("D:/path/to/file.webm"))
        self.player.setVideoOutput(self.video)
        self.video.show()
        self.player.play()

    def closeEvent(self, event):
        self.player.stop()
        event.accept()


if __name__ == "__main__":
    app = QtWidgets.QApplication([])
    window = App()
    window.show()
    app.exec_()

必须覆盖closeEvent才能使程序停止在关闭状态。

我的测试视频:

  • 工作正常:
    • 1080p 60fps vp9 / opus webm
    • 1080p 30fps vp9 / opus webm
    • 480p 30fps vp9 / opus webm
  • 仅播放音频(出现空白窗口):
    • 1080p 30fps H.264 / aac mp4
    • 480p 30fps H.264 / aac mp4
    • 1080p 23.98fps H.264 / ac3 mp4
    • 1080p 23.98fps H.264 / ac3 mkv
    • 1080p 23.98fps vp9 / opus webm
    • 720x404 23.98fps vp9 / opus webm

我在Windows上使用qt5,并且已经安装了适当的编解码器(K-Lite编解码器包)来播放这些文件(可以在Windows Media Player中正常播放)。

编辑:
我已经连接到@ekhumoro建议的mediaStatusChangedvideoAvailableChangederror信号。运行程序后,无论程序是否实际显示视频,我都会以True和BufferedMedia的形式获取视频。 error信号处理程序永远不会被触发。

在进行这些进一步的测试期间,“正常工作”部分中的视频有时无法显示视频,或者更奇怪的是,显示效果很好,但窗口尺寸最小:

small window

调整窗口大小不会增加视频的大小。到目前为止,我的原始测试的“仅播放音频”部分中没有视频显示过视频。

编辑2:

重新启动(和更新的图形驱动程序)后,第一次运行的视频最初在奇怪的小窗口中根本没有显示视频。随后的运行(我已经完成了10次左右)已恢复为无视频。同样,本来效果不错的视频在第一次运行时就没有视频,但现在一直很小。原来可以正常播放的其他视频仍在正常播放。

1 个答案:

答案 0 :(得分:1)

问题在于按@ekhumoro的建议调整大小。

当我继承的QWidget试图确定其大小时,它询问QVideoWidget是其唯一的孩子。有时QVideoWidget加载了视频,因此提供了正确的大小,但有时没有,因此给出了sizeHint的{​​{1}}。由于(-1, -1)不在布局中,因此无法调整大小并卡得太小。

此外,窗口本身不会在创建后自动通过布局自动调整大小(仅由用户或使用QVideoWidget来自动调整大小),因此即使adjustSize在窗口中,窗口仍保持其原始大小。布局。解决方案是为QVideoWidget注册一个信号处理程序,然后调用mediaStatusChangedupdateGeometry

最后,退出程序时挂起的另一个问题是因为我没有在窗口上放置adjustSize

我修改过的班级

QMediaPlayer