繁体   English   中英

PyQt6 QMediaPlayer 和 QAudioOutput 未按预期运行

[英]PyQt6 QMediaPlayer and QAudioOutput not behaving as expected

我一直在使用 QAudioOutput 和 QMediaPlayer 迁移到 PyQt6 时遇到问题,其中 QMediaPlayer object 似乎不适用于我制作的任何 QAudioOutput。 如果我设置 QAudioOutput object 视频将无法呈现并且事件循环变得缓慢,就像发生错误一样。 此外,当使用 QMediaPlayer.setAudioOutput 时,QMediaPlayer 似乎不会增加 QAudioOutput 对象的引用计数器,因为除非我自己保留对 object 的引用,否则它会被清除。

这是一些演示代码:

import sys
from PyQt6.QtWidgets import QMainWindow, QApplication
from PyQt6.QtCore import QUrl
from PyQt6.QtMultimedia import QMediaPlayer, QAudioOutput
from PyQt6.QtMultimediaWidgets import QVideoWidget



class MainWin(QMainWindow):
    def __init__(self, file_path):
        super(MainWin, self).__init__()
        self.cent_wid = QVideoWidget()
        self.setCentralWidget(self.cent_wid)
        self.player = QMediaPlayer()
        self.audio_output = QAudioOutput()
        #self.player.setAudioOutput(self.audio_output)
        self.audio_output.setVolume(1.0)
        self.player.setVideoOutput(self.cent_wid)
        self.file_path = file_path

    def showEvent(self, a0) -> None:
        super(MainWin, self).showEvent(a0)
        self.player.setSource(QUrl.fromLocalFile(self.file_path))
        self.player.play()

if __name__ == '__main__':
    app = QApplication([])
    frm = MainWin(sys.argv[1])
    frm.show()
    app.exec()

对我来说,上面的代码将运行并播放视频文件(路径的第一个参数),但“player.setAudioOutput”被注释掉了。 如果未注释,则播放器将失败。 我试过手动设置 QAudioDevice 和 PyQt (6.2.3, 6.2.2)。 尽管闲逛了很长一段时间,但我什么也做不了。 有任何想法吗?

虽然不是这个问题的解决方案,但我确定问题出在 windows 上的 vorbis 音频编解码器。由于 Qt 放弃了 DirectShow 并且仅支持 WMF,这导致我的计算机出现问题。 不幸的是,我无法获得 Qt 来配合任何安装编解码器的尝试。 不是第 3 方编解码器或来自 ms store 的“Web Media Extensions”。 下面是一些代码,似乎可以证明 vorbis 编解码器是问题所在(以及仅需要该编解码器破坏 Qt 的文件):

from PyQt6.QtMultimedia import QMediaFormat
mf = QMediaFormat()
for codec in mf.supportedAudioCodecs(QMediaFormat.ConversionMode.Decode):
    print(codec.name)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM