网站首页 > 技术文章 正文
我们将进行以下优化:
- 将下载和合并分开,但同步进行:即每下载完一个视频和音频,就立即合并,而不是等所有下载完成再合并。
- 在合并时使用subprocess运行ffmpeg,并确保在后台运行(不显示窗口)。同时,检查ffmpeg是否存在,如果不存在则弹窗提醒。
- 去掉分辨率选择功能,默认选择最高画质。
- 修改界面,下方窗口只显示每一个视频的下载情况(如:第1个视频:下载完成,合并完成),而详细的日志记录在文件中,并提供打开日志目录的按钮。
- 实现断点下载功能:记录每个视频的下载状态(未开始、下载中、下载完成、合并完成),程序启动时检查并恢复。
- 解决exe图标问题:确保在打包时指定图标,并在代码中正确设置窗口图标。
具体步骤:
- 移除画质选择相关代码。
- 在下载线程中,每下载完一个视频和音频,立即合并,然后删除临时文件。
- 使用subprocess运行ffmpeg时,设置`creationflags=subprocess.CREATE_NO_WINDOW`(仅Windows)来隐藏窗口。同时,在运行ffmpeg之前检查是否存在,如果不存在则弹窗提醒并终止。
- 修改主界面,移除日志区域,改为一个列表控件(如QListWidget)来显示每个视频的状态(如:第1个视频:下载完成,合并完成)。
- 实现状态记录:
- 使用一个JSON文件记录任务状态(保存目录下的`download_status.json`)。
- 每个视频的状态包括:cid, title, 视频下载状态, 音频下载状态, 合并状态, 临时文件路径等。
- 每次开始下载前,检查状态文件,跳过已完成的视频。
- 每个步骤(视频下载完成、音频下载完成、合并完成)后更新状态并保存。
注意:由于断点续传需要记录状态,因此我们将每个视频的下载和合并视为一个独立任务,并记录其状态。
由于改动较大,我们将逐步调整代码。
首先,修改DownloadThread类:
- 移除画质选择,固定使用最高画质。
- 在下载每个视频前检查状态,如果已下载并合并则跳过。
- 每完成一个步骤(视频下载、音频下载、合并)更新状态并保存到文件。
- 合并操作放在下载音频完成后立即进行。
其次,修改主界面:
- 去掉日志区域,添加一个QListWidget来显示每个视频的状态(一行一个)。
- 添加一个“查看日志”的链接,点击后显示下载过程打印的信息。
但注意:我们之前是实时将日志输出到界面的QTextEdit,现在改为:
- 在下载线程中,我们将日志同时输出到文件和控制台(通过信号更新界面状态列表)。
- 同时,我们使用一个状态列表(列表控件)来显示每个视频的简要状态。
由于要求详细日志通过文件查看,我们可以:
- 在保存目录下创建一个`logs`子目录,每次运行生成一个日志文件(以时间命名)。
- 同时,在界面上我们只显示每个视频的当前状态(用列表控件,一行一个视频,显示标题和状态)。
考虑到时间,我们简化日志记录:将详细日志写入文件,同时将每个视频的状态更新通过信号发送到主界面,更新列表控件。
具体实现:
1. 状态记录文件(`download_status.json`)结构示例:
{
"url": "原始URL",
"save_dir": "保存目录",
"tasks": [
{
"cid": 123,
"title": "视频标题",
"video_downloaded": true,
"audio_downloaded": true,
"merged": true,
"output_file": "保存目录/1-标题.mp4"
},
... 其他任务
]
}
- 每次启动时,如果状态文件存在且URL和保存目录匹配,则恢复状态。
- 下载过程中,每完成一步更新状态并保存。
- 在合并时,使用subprocess运行ffmpeg,并设置CREATE_NO_WINDOW标志(Windows)以避免弹出控制台窗口。同时捕获ffmpeg的错误。
- 检查ffmpeg是否存在:在程序启动时,尝试运行`ffmpeg -version`,如果返回错误,则弹窗提醒用户安装。
猜你喜欢
- 2025-07-28 用python嗅探网络中所有HTTP数据包
- 2025-07-28 python制作仪表盘图(python动态仪表盘)
- 2025-07-28 一起来用 Python 做个是男人就坚持100秒游戏
- 2025-07-28 编程之美:分享Python简单界面框架easygui使用方法
- 2025-07-28 想了解Python源代码加密吗?现总结如下5大加密混淆手段!
- 2025-07-28 不容易!找到一个python的超简易网站搭建神器
- 2025-07-28 多学习才能多赚钱之:python怎么制作游戏脚本
- 2025-07-28 由浅入深和由简单到复杂,带你学习wxpython的菜单
- 2025-07-28 零基础Python自学教程9:Python中运算符的优先级和条件表达式
- 2025-07-28 python 标志法-优化版(数值判断[正负])、非空判断、退出判断)
- 290℃Python短文,Python中的嵌套条件语句(六)
- 286℃PythonNet:实现Python与.Net代码相互调用!
- 283℃python笔记:for循环嵌套。end=""的作用,图形打印
- 282℃Python实现字符串小写转大写并写入文件
- 279℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 140℃原来2025是完美的平方年,一起探索六种平方的算吧
- 123℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 115℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)