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

PyQt5 QWebEngineView加载Twitch流失败问题求助

PyQt5 QWebEngineView加载Twitch直播流失败的解决方法及替代方案

问题描述

我尝试用PyQt5的QWebEngineView加载Twitch直播流,但无法播放,出现以下错误:

js: Player stopping playback - error MasterPlaylist:11 (ErrorNotAvailable code 404 - Failed to load playlist)
js: Player stopping playback - error Player:2 (ErrorNotSupported code 0 - No playable format)

测试代码如下:

from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
from qframelesswindow import FramelessWindow, StandardTitleBar
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
import sys


class CustomTitleBar(StandardTitleBar):
    """ Custom title bar """

    def __init__(me, parent):
        super().__init__(parent)


class Window(FramelessWindow):
    def __init__(me, parent=None):
        super().__init__(parent=parent)
        me.setTitleBar(CustomTitleBar(me))
        me.titleBar.raise_()
        screen = me.screen().geometry()
        x = int((screen.width() - 800) / 2)
        y = int((screen.height() - 450) / 2)
        me.setGeometry(x, y, 800, 450)

    def showLive(me, follow):
        # open stream in qwebengineview
        me.stream = QWebEngineView(me)
        settings = me.stream.settings()
        settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
        settings.setAttribute(
            QWebEngineSettings.FullScreenSupportEnabled, True)
        me.stream.setGeometry(0, 64, me.width(), me.height() - 64)
        me.stream.load(QUrl(f"https://www.twitch.tv/{follow}"))
        me.stream.show()


app = QApplication(sys.argv)
window = Window()
window.show()
window.showLive("3v1lxd")
sys.exit(app.exec_())

针对QWebEngineView的修复方案

1. 模拟主流浏览器的User-Agent

Twitch会检测客户端的浏览器环境,QWebEngineView默认UA可能被识别为非标准客户端,导致流加载失败。需设置符合主流浏览器的UA:
在showLive方法中添加:

# 模拟Chrome浏览器UA(可根据实际Chrome版本调整)
me.stream.page().profile().setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")

2. 启用必要的WebEngine设置

补充启用媒体自动播放、JavaScript等核心功能,确保Twitch播放器正常运行:

settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.AutoLoadImages, True)
settings.setAttribute(QWebEngineSettings.MediaPlaybackRequiresUserGesture, False)  # 允许自动播放媒体

3. 更新PyQt5和QtWebEngine版本

旧版本的QtWebEngine可能不支持Twitch使用的现代媒体编码格式,建议升级到最新稳定版:

pip install --upgrade pyqt5 pyqtwebengine

修改后的完整showLive方法:

def showLive(me, follow):
    # open stream in qwebengineview
    me.stream = QWebEngineView(me)
    settings = me.stream.settings()
    settings.setAttribute(QWebEngineSettings.PluginsEnabled, True)
    settings.setAttribute(QWebEngineSettings.FullScreenSupportEnabled, True)
    settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True)
    settings.setAttribute(QWebEngineSettings.AutoLoadImages, True)
    settings.setAttribute(QWebEngineSettings.MediaPlaybackRequiresUserGesture, False)
    # 设置Chrome浏览器User-Agent
    me.stream.page().profile().setHttpUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    me.stream.setGeometry(0, 64, me.width(), me.height() - 64)
    me.stream.load(QUrl(f"https://www.twitch.tv/{follow}"))
    me.stream.show()

替代方案:直接获取Twitch流URL并播放

绕开网页引擎,通过Twitch API获取直播流的直接播放地址,使用专门的媒体库播放,兼容性更好。

步骤1:准备Twitch API凭证

注册Twitch开发者账号,获取Client ID和OAuth Token(可通过Twitch开发者控制台生成)。

步骤2:使用vlc-python播放流

安装依赖:

pip install python-vlc requests

示例代码:

import vlc
import requests
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout

TWITCH_CLIENT_ID = "你的Client ID"
TWITCH_OAUTH_TOKEN = "你的OAuth Token"

def get_twitch_stream_url(username):
    # 获取用户ID
    user_url = f"https://api.twitch.tv/helix/users?login={username}"
    headers = {
        "Client-ID": TWITCH_CLIENT_ID,
        "Authorization": f"Bearer {TWITCH_OAUTH_TOKEN}"
    }
    user_response = requests.get(user_url, headers=headers)
    user_data = user_response.json()
    if not user_data["data"]:
        return None
    user_id = user_data["data"][0]["id"]
    
    # 获取直播流信息
    stream_url = f"https://api.twitch.tv/helix/streams?user_id={user_id}"
    stream_response = requests.get(stream_url, headers=headers)
    stream_data = stream_response.json()
    if not stream_data["data"]:
        return None
    
    # 获取播放列表URL
    playlist_url = f"https://usher.ttvnw.net/api/channel/hls/{username}.m3u8?player=twitchweb"
    playlist_response = requests.get(playlist_url, headers=headers)
    return playlist_response.url

class StreamPlayer(QWidget):
    def __init__(self, stream_url):
        super().__init__()
        self.setWindowTitle("Twitch Stream Player")
        self.resize(800, 450)
        
        layout = QVBoxLayout()
        self.setLayout(layout)
        
        # 初始化VLC播放器
        self.instance = vlc.Instance()
        self.player = self.instance.media_player_new()
        
        # 创建播放窗口
        self.media = self.instance.media_new(stream_url)
        self.player.set_media(self.media)
        self.player.set_hwnd(self.winId())
        
        # 开始播放
        self.player.play()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    stream_url = get_twitch_stream_url("3v1lxd")
    if stream_url:
        player = StreamPlayer(stream_url)
        player.show()
        sys.exit(app.exec_())
    else:
        print("该用户未开播或API请求失败")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:25:30