Kivy VideoPlayer播放下载视频仅出音频无画面问题求助
Kivy VideoPlayer仅播放音频无画面问题排查与修复
问题背景
我正在开发一款应用,流程为通过youtube-search-python搜索视频,使用Pytube下载视频,再用Kivy的VideoPlayer播放。目前除视频播放环节外其余功能均正常,仅能听到音频却看不到画面。看到ffpyplayer可解决类似问题后我已安装,但仍无法显示视频。
原代码
from pytube import YouTube from kivy.app import App from youtubesearchpython import VideosSearch from kivy.uix.videoplayer import VideoPlayer videosSearch = VideosSearch('心臓を捧げよ!', limit = 1) for i in range(1): download_link = videosSearch.result()['result'][i]['link'] yt = YouTube(download_link) yt.streams.get_highest_resolution().download() video = (yt.title) + '.mp4' class Player(VideoPlayer): player = VideoPlayer(source= video, state = 'play') class VideoApp(App): def build(self): return Player() if __name__ == '__main__': VideoApp().run()
运行日志
[INFO ] [Logger ] Record log in C:\Users\Shahzad\.kivy\logs\kivy_23-03-30_14.txt [INFO ] [Kivy ] v2.1.0 [INFO ] [Kivy ] Installed at "C:\ProgramData\miniconda3\lib\site-packages\kivy\__init__.py" [INFO ] [Python ] v3.10.9 | packaged by conda-forge | (main, Jan 11 2023, 15:15:40) [MSC v.1916 64 bit (AMD64)] [INFO ] [Python ] Interpreter at "C:\ProgramData\miniconda3\python.exe" [INFO ] [Logger ] Purge log fired. Processing... [INFO ] [Logger ] Purge finished! [INFO ] [Factory ] 189 symbols loaded [INFO ] [ImageLoaderFFPy] Using ffpyplayer 4.4.0 [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_ffpyplayer [INFO ] [Text ] Provider: sdl2 [INFO ] [VideoFFPy ] Using ffpyplayer 4.4.0 [INFO ] [Video ] Provider: ffpyplayer(['video_ffmpeg'] ignored) [INFO ] [Window ] Provider: sdl2 [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] GLEW initialization succeeded [INFO ] [GL ] Backend used <glew> [INFO ] [GL ] OpenGL version <b'4.6.0 Compatibility Profile Context 23.3.1.230305'> [INFO ] [GL ] OpenGL vendor <b'ATI Technologies Inc.'> [INFO ] [GL ] OpenGL renderer <b'AMD Radeon(TM) Vega 3 Graphics '> [INFO ] [GL ] OpenGL parsed version: 4, 6 [INFO ] [GL ] Shading version <b'4.60'> [INFO ] [GL ] Texture max size <16384> [INFO ] [GL ] Texture max units <32> [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [Base ] Start application main loop [ERROR ] [Image ] Error loading <【MAD】『心臓を捧げよ!』で振り返る 進撃の巨人 Season 2.mp4> [INFO ] [GL ] NPOT texture support is available
问题分析
从日志的错误信息[ERROR ] [Image ] Error loading <【MAD】『心臓を捧げよ!』で振り返る 進撃の巨人 Season 2.mp4>可以定位核心问题:
- Player类实现错误:继承
VideoPlayer后,错误地在类内部定义了player变量,导致返回的是未配置参数的父类实例,而非你设置了视频源和播放状态的实例。 - 文件名含特殊字符:下载的视频文件名包含日文、全角符号等特殊字符,Kivy在解析这类路径时容易出现编码异常,导致画面无法加载。
修复方案
修改后的代码
from pytube import YouTube from kivy.app import App from youtubesearchpython import VideosSearch from kivy.uix.videoplayer import VideoPlayer # 搜索视频 videosSearch = VideosSearch('心臓を捧げよ!', limit=1) download_link = videosSearch.result()['result'][0]['link'] # 下载视频并指定简洁文件名,避免特殊字符 yt = YouTube(download_link) custom_filename = "attack_on_titan.mp4" yt.streams.get_highest_resolution().download(filename=custom_filename) class Player(VideoPlayer): def __init__(self, **kwargs): super().__init__(**kwargs) self.source = custom_filename self.state = 'play' self.options = {'allow_stretch': True} # 让视频自适应窗口大小 class VideoApp(App): def build(self): return Player() if __name__ == '__main__': VideoApp().run()
关键修改点说明
- 修正Player类初始化:通过
__init__方法调用父类构造函数,并直接设置当前实例的source和state参数,确保配置生效。 - 自定义下载文件名:使用
filename参数指定不含特殊字符的文件名,避免Kivy解析路径时出错。 - 添加自适应设置:
allow_stretch: True让视频自动适配窗口大小,优化播放体验。
额外提示
日志显示ffpyplayer已正常加载([VideoFFPy ] Using ffpyplayer 4.4.0),无需重复安装。若问题仍存在,可检查视频编码是否为ffpyplayer支持的格式(如H.264)。
内容的提问来源于stack exchange,提问作者Ahat130
相关产品推荐
相关产品推荐

