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
相关产品推荐
相关产品推荐

