PyQt5程序结合pytube库更新进度条,回调晚触发问题如何解决?
pytube实时进度回调修复方案
现存代码问题
- 基础语法错误:定义流列表时变量名为
stream,后续调用时误用为streams,get_by_itag、download方法的括号未正确闭合 - 回调绑定不规范:新版pytube的
YouTube构造函数需要显式指定on_progress_callback参数绑定进度回调,直接位置传参不会生效 - 终端输出缓冲:Python默认print函数会开启输出缓冲,内容会攒到缓冲区满或者程序结束才打印,视觉上表现为回调在下载结束后才统一执行
修复后可运行代码
from pytube import YouTube def video_progress(stream, chunk, bytes_remaining): size = stream.filesize progress = (float(abs(size - bytes_remaining) / size)) * float(100) # 加flush=True关闭输出缓冲,实时打印进度 print(f"当前进度:{progress:.2f}%", flush=True) # self.progressBar1.setValue(int(progress)) def download(): v_url = input('enter your url : ') v_location = input('enter save place : ') # 显式指定on_progress_callback参数绑定回调 video = YouTube(v_url, on_progress_callback=video_progress) print("开始获取视频流信息") streams = video.streams.filter(progressive=True, file_extension='mp4') for s in streams: print(s) wanted_stream = streams.get_by_itag(input('输入你选择的流对应的itag : ')) wanted_stream.download(output_path=v_location) print("下载完成") download()
补充说明
按照以上修改后即可实现进度实时更新,无需额外调用其他方法。如果仍有延迟问题,可将pytube升级到最新正式版验证。
内容的提问来源于stack exchange,提问作者Pac Man
相关产品推荐
相关产品推荐

