You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6通过字节数据播放视频报错:setSource不支持QBuffer类型

解决PyQt6 QMediaPlayer无法直接传入QBuffer播放字节数据的问题

你尝试通过将视频文件转为字节数据,用QBuffer传入QMediaPlayer播放,但遇到setSource(self, QUrl): argument 1 has unexpected type 'QBuffer'错误——原因是PyQt6的QMediaPlayer.setSource()仅接受QUrl类型参数,不支持直接传入QBuffer。

解决方案

要实现从内存字节数据播放视频,需使用QMediaPlayer.setMedia()方法,该方法支持传入QIODevice类型的流(如QBuffer)。核心步骤如下:

  • 写入字节数据到QBuffer后,将缓冲区的读写指针重置到开头(否则播放器无法读取数据)。
  • 调用setMedia(),传入空的QMediaContent,并将QBuffer作为流参数传入。
  • 确保QBuffer在播放期间保持有效(避免被提前销毁)。

修改后的完整代码

from PyQt6.QtCore import *
from PyQt6.QtWidgets import *
from PyQt6.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt6.QtMultimediaWidgets import QVideoWidget
import sys

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = QMainWindow()
    window.resize(500, 500)
    window.show()

    player = QMediaPlayer()
    # 读取视频文件字节数据,用with语句确保文件正确关闭
    with open('Nino Rota- The Godfather.mp4', 'rb') as f:
        video_data = f.read()
    
    buffer = QBuffer()
    buffer.open(QIODevice.OpenModeFlag.ReadWrite)
    buffer.write(video_data)
    # 重置缓冲区指针到开头,否则播放器无法读取数据
    buffer.seek(0)

    # 使用setMedia方法传入QBuffer作为流
    player.setMedia(QMediaContent(), buffer)

    videoWidget = QVideoWidget(window)
    videoWidget.setFixedSize(500, 500)
    player.setVideoOutput(videoWidget)
    videoWidget.show()

    player.play()
    sys.exit(app.exec_())

关键修改说明

  1. 文件读取优化:改用with语句读取视频文件,避免手动管理文件关闭操作。
  2. 缓冲区指针重置:添加buffer.seek(0)——写入字节数据后,QBuffer的指针会停在末尾,必须重置到开头才能让播放器读取完整数据。
  3. 播放方法替换:将player.setSource(buffer)替换为player.setMedia(QMediaContent(), buffer),利用setMedia()的重载方法支持QIODevice流输入。
  4. 生命周期保障:示例中QBuffer为全局变量,确保了播放期间缓冲区不会被垃圾回收,若在类中使用,需将QBuffer设为类成员变量。

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:57:16