ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Jasna 视频修复 GUI 实战指南:从首启卡红行到激活支持者模型,一次讲透

Jasna 视频修复 GUI 实战指南:从首启卡红行到激活支持者模型,一次讲透

Jasna 视频修复 GUI 实战指南:从首启卡红行到激活支持者模型,一次讲透

【免费下载链接】jasnaVideo restoration tool项目地址: https://gitcode.com/GitHub_Trending/ja/jasna

第一次打开 Jasna,启动窗口卡在"检查中"十几秒,弹出一行红字,主窗口迟迟不出现——多数新手都卡在这里。Jasna 是一个开源视频修复工具,GUI 支持批量喂入素材、实时预览修复效果、单图精修,并可激活解锁 UNet 4x、SD 1.5、LTX 等支持者模型。本文每个约束都能在源码里找到对应实现,出问题你知道往哪儿查。

🧭 首启自检:7 项检查逐项拆解

安装位置的两个硬条件

启动向导出现之前,安装位置必须先过关,两条都是硬性的:

  • 装本地磁盘(Windows 用 NTFS,Linux 用 ext4 / Btrfs / XFS),网络磁盘不支持;
  • 安装路径必须是纯 ASCII 字符,出现中文、日文或带重音的字母直接判失败。

路径讲究的根源:check_ascii_install_path直接对安装目录做encode("ascii")尝试,编码失败即不合规(逻辑在 jasna/os_utils.py)。

机械盘同理:install_on_hard_disk会判断磁盘类型——Windows 查驱动器的寻道开销,Linux 读/sys的rotational标志(逻辑在 jasna/os_utils.py)。装在机械盘上,日志面板会写一条hard_disk_warning警告:"Jasna 安装在机械硬盘(HDD)上,启动和加载模型都很慢。请把 Jasna 文件夹移到固态硬盘(SSD)上"(逻辑在 jasna/gui/app.py)。这是警告不是错误,但启动和加载模型都会明显变慢。

⚠️ 路径装错是"一票否决"型问题:ASCII 检查失败会直接阻塞启动,之后所有操作都无从谈起。先cd确认路径,再谈其他。

自检项到底在查什么

检查逻辑集中在 jasna/gui/system_checks.py,run_system_checks逐项填入结果,逐项含义如下:

检查键查什么失败后果
ascii_path安装路径是否纯英文阻塞启动
ffprobe能否找到 ffprobe,且 FFmpeg 主版本号必须为 8(check_ffprobe里major != 8即失败)阻塞启动
gpu是否检测到受支持 GPU(架构与计算能力)阻塞启动
cudaCUDA / ROCm 是否可用,报告版本与计算能力阻塞启动
driverGPU 驱动版本阻塞启动
sysmem(仅 Windows)NVIDIA 共享内存回退策略仅警告,不阻塞
amf(仅 AMD)AMD AMF 视频运行库,读写视频必需(check_amd_amf_runtime加载libamfrt64.so.1验证)阻塞启动

注意sysmem是源码里WARNING_ONLY_CHECKS = {"sysmem"}中唯一的键(逻辑在 jasna/gui/system_checks.py):只有它失败时,底部按钮仍显示"开始使用";其余任何一项失败,按钮变成"退出",点击直接关程序。

卡住之后出现的红行是怎么回事

检查在后台线程跑,UI 每 100ms 轮询一次;如果驱动查询卡住或 torch 冷导入特别慢,向导等 30 秒就放弃(_CHECKS_TIMEOUT_SECONDS = 30.0,逻辑在 jasna/gui/wizard.py),先展示已完成的项。

⚠️ 兜底超时后未完成的检查项会被按失败处理而不是通过——evaluate_check_results的文档写得很明确:从未运行的检查宁可读成失败,也不能"显示红行却放行开始使用"(逻辑在 jasna/gui/system_checks.py)。所以看到红行别急着重装环境,先确认是不是卡住了 30 秒。

检查结果按版本记录:只有该版本首次启动才强制走一遍流程,通过状态由get_system_check_passed_version与__version__对比决定(逻辑在 jasna/gui/app.py),之后可随时从页眉手动重跑,见文末排错部分。

装好跑通之后,第一批素材怎么喂进去?主窗口中间的项目列表就是答案。

📦 素材怎么喂进队列:排序、翻页与单条操作

三种添加方式与分页边界

把素材放进列表有三条路(实现在 jasna/gui/queue_panel.py):

  1. 点添加文件按钮选视频或图片(_on_add_files);
  2. 点旁边的文件夹图标,整个文件夹一次丢进来(_on_add_folder,按 jasna/media/media_files.py 的folder_media_in_processing_order递归收集,图片在前、视频在后);
  3. 直接把文件拖到列表上(enable_file_drop基于TkinterDnD,拖文件夹会同样递归展开)。

处理顺序就是从上到下:拖动每个条目的把手即可调整。列表超过 20 条时下方出现翻页箭头,分页常量_PAGE_SIZE = 20写在源码里(逻辑在 jasna/gui/queue_panel.py)。所有页都会被依次处理,但拖动只能在同一页内——拖拽重排的代码只按当前页的 widget 计算新位置,跨页换顺序得先翻页再拖。

每个条目上的四个按钮

对单个条目(JobListItem,见 jasna/gui/job_list_item.py):

  • 剪刀:打开区间编辑器,只修复视频里的一段(仅PENDING状态可编辑);
  • 播放:在内置播放器里打开该视频,快速瞄一眼原片(仅列表空闲时可用);
  • 三点(或右键):打开所在文件夹、复制路径、打开修复后的输出、重新加入队列(把已完成/失败/跳过的项目放回列表末尾,见 jasna/gui/queue_panel.py 的_requeue_job);
  • 叉号:移除该项目。

中途停止后,写到一半的文件去哪了

处理中每个条目实时刷出进度、FPS 和剩余时间。点停止按钮结束本次处理后,当前条目回到等待中状态(_mark_stopped把job.status重置为PENDING,逻辑在 jasna/gui/processor.py),已写入的半成品输出文件则原样留在磁盘上。

⚠️ 半成品文件下次再跑时按什么处理,取决于基本处理里的文件冲突策略。"跑一半就停"和"覆盖"同时开着时,别把上次的半成品当成品——它会被下一次输出直接替换。

开始按钮会处理列表中所有项目,包括已完成和失败的(reset_jobs_for_run把所有 job 重置为PENDING,逻辑在 jasna/gui/queue_panel.py)——改完设置不用重新添加文件,直接再按即可。隐含限制:列表非空、没有模型在下载、修复预览没占用 GPU 时,开始按钮才可用(can_start = bool(jobs) and not self._preview_gpu_busy and not downloading,逻辑在 jasna/gui/app.py)。

⚙️ 输出文件怎么落地:命名模板、冲突策略与预设

命名模板与"与输入相同"的联动

结果放哪,看队列底部工具栏的两个联动控件:点与输入相同,每个结果保存在原文件旁边;手动输入文件夹路径或点文件夹按钮选别处,会自动关闭"与输入相同"。

命名用模板,{original}代表输入文件名(不含扩展名)。默认模板是{original}_restored.mp4(DEFAULT_OUTPUT_PATTERN,定义在 jasna/gui/models.py),所以my_video.mp4出片就是my_video_restored.mp4。替换逻辑很直白:folder_output_path里就是output_pattern.replace("{original}", 输入文件主名)(逻辑在 jasna/media/media_files.py)。

关键体验:改保存位置或模板的瞬间,任何会覆盖其他文件的条目会立即被高亮标出——_refresh_conflicts对每个PENDING条目重算输出路径并检查output_path.exists()(逻辑在 jasna/gui/queue_panel.py),不用等跑完才发现重名。

同名文件三种处理方式

文件冲突选项在基本处理部分(下拉框实现在 jasna/gui/settings_sections/basic.py),默认值file_conflict = "auto_rename"(逻辑在 jasna/gui/models.py):

选项行为备注
自动重命名(auto_rename)输出改名为xxx (1).mp4这类不冲突的名字(unique_path)默认值
覆盖(overwrite)直接替换已有文件选中后弹出 ⚠️ 提示(file_conflict_overwrite_warning)
跳过(skip)已有文件时不动,状态标为SKIPPED适合增量补跑

⚠️ 选"覆盖"前确认目标文件确实可以丢——这个选项没有撤销,界面给出的唯一防线就是那枚警告图标(_on_file_conflict_changed,逻辑在 jasna/gui/settings_sections/basic.py)。

预设一键切换,重启还会记住

不同画质的片子参数差很远,手动来回调很痛苦。设置面板上方的工具栏(_build_preset_bar,见 jasna/gui/settings_panel.py)能把当前全部设置存成一个名字:建个"1080p 快速",再建个"4K 最佳质量",之后一键来回切。

底层是PresetManager(逻辑在 jasna/gui/models.py),两点值得知道:

  • 重启后记住上次预设:get_last_selected()/set_last_selected()记录你最后一次用的名字,持久化在settings.json;
  • 手动改过设置后,面板会标记"已修改"({name}(已修改)*,见 jasna/gui/locales/zh.py),防止你以为还停在某个出厂预设上。出厂预设(FACTORY_PRESETS = {"Default": ...})与用户预设分开管理,删除出厂预设会被delete_preset直接拒绝。

全局参数归预设管,但有两类例外只属于单个视频:在区间编辑器里设置的检测模型和检测阈值,只保存给当前这一个视频。队列条目通过JobItem.try_set_video_options单独记录这些按视频覆盖的值(逻辑在 jasna/gui/models.py),且仅在状态为PENDING时生效。也就是说,同一个列表里可以混放"高阈值粗检"和"低阈值精检"的视频,互不干扰。

想不产出文件、直接看效果时,走实时预览这条路。

🔍 不产出文件直接看效果:实时预览与单帧精修

打开播放器:三步操作和一个硬互斥

点页眉里的视频播放器(_open_video_player,逻辑在 jasna/gui/app.py):

  1. 选检测模型、检测阈值,需要的话再选二次修复(RTX Super Res或UNet 4x,默认值为secondary_restoration = "none",逻辑在 jasna/gui/models.py);
  2. 点选择视频挑片子;
  3. 按播放。

⚠️ 播放器和批量处理互斥:只要有项目在处理、或修复预览在跑,点"视频播放器"没反应,页眉按钮也会置灰。源码里就是一句硬检查:self._preview_gpu_busy或处理器在跑时直接return(逻辑在 jasna/gui/app.py)。它是硬性约束,不是显示 bug。

快捷键:左/右方向键前后跳转 30 秒(_SEEK_STEP_SECONDS = 30.0,逻辑在 jasna/gui/video_player.py);全屏时鼠标移到底部边缘,控制栏自动浮出。改了模型、阈值或二次修复后,管线会重建并从当前位置重新播放。

秒数反复归零说明什么

状态栏显示已提前修复好的秒数:后台修复线程往带时间戳的帧缓冲里写帧,缓冲最多领先播放 3 秒(BUFFER_SECONDS = 3.0、BUFFER_FRAMES = 90),预滚 1.5 秒(PREROLL_SECONDS = 1.5)后才真正开声,实现见 jasna/gui/raw_player.py。缓冲满了之后写入端会等空位而不是丢帧——所以一旦修复速度跟不上,领先秒数会一路掉光。

所以这个秒数反复掉到零,就是 GPU 在当前设置下追不上实时播放:画面卡顿、音频暂停。此时换低一点的分辨率或模型档位再看,别怀疑软件坏了。

静态图单帧精修:快一个数量级

在图像修复(静态图片)部分点交互式处理图片(_open_interactive_image_restore,逻辑在 jasna/gui/app.py),打开一个左右对比视图(窗口实现在 jasna/gui/interactive_image_restore.py):

  • 上一张 / 下一张逐张浏览;
  • 换种子立刻重新渲染出图;
  • 原图、遮罩、结果三种视图切换;
  • 满意才点保存,只留你喜欢的。

为什么快?渲染在后台 worker 线程按单帧进行,帧已预先准备好,换种子只是同一帧上的一次前向推理——不像整任务那样把解码、修复、编码全走一遍。修图这种"多试几次参数"的场景,快一个数量级。

🚑 出问题往哪儿查:日志、状态条与激活排错

重跑系统检查、导出日志与底部状态条

换了驱动、换了显卡、装了新 FFmpeg 之后,从页眉再次运行系统检查(_show_system_check,逻辑在 jasna/gui/app.py)即可——检查按版本记录通过状态,决定某个版本要不要重新走流程。

⚠️ AMD 用户:系统检查还会查 AMF 视频运行库。Linux 上需要手动安装一次(官方文档 docs/zh/gui.md 给出了curl下载amf_installer的安装命令),装完重启 Jasna 再查一次。

底部工具栏的日志按钮展开 LogPanel(逻辑在 jasna/gui/log_panel.py):实时滚动,可按 debug / info / warning / error 过滤;导出保存最后5000 行(环形缓冲deque(maxlen=_MAX_LOG_ENTRIES),_MAX_LOG_ENTRIES = 5000,超出自动丢最旧的),写为.txt。反馈问题前先导出日志,基本能省掉一大轮"复现了吗"。

处理时底部状态条显示 GPU 利用率、显存、内存、CPU。数据来自read_system_stats(NVIDIA 解析nvidia-smi,AMD 读 sysfs),轮询线程每 1.5 秒采样一次(self._system_stats_stop.wait(1.5),逻辑在 jasna/gui/app.py)。跑任务时瞄一眼这排数字,显存吃紧就该降档。

激活两条路径:在线与手动

支持者模型(UNet 4x、SD 1.5、LTX)需要激活。页眉打开激活 Jasna(_open_license_dialog,逻辑在 jasna/gui/app.py),所有网络与验签操作都在后台线程执行(_start起 daemon 线程,逻辑在 jasna/gui/activation_worker.py),不卡 UI。

  • 在线激活(默认):输入许可证码,点在线激活。上传的只有许可证码和机器密钥,之后 Jasna 完全离线工作;
  • 手动激活(断网机器,或在线失败时):
    1. 复制机器密钥(machine.machine_key(cloud_workspace=False),基于本机硬件生成);
    2. 在任意联网设备打开激活页面,填入机器密钥 + 许可证码;
    3. 拿到激活密钥粘贴回 Jasna,点激活(start_activation写入本地 license)。

名额规则:一个许可证码最多用于3 台电脑或云工作区(界面提示license_service_slots_full即"已用完 3 个注册名额",见 jasna/gui/locales/zh.py)。占名额:更换主板(Windows)、重新安装 Linux、个别没有真正主板 ID 的 Windows 机换系统盘。不占名额:重装 Windows、更换显卡 / 硬盘 / 内存、同一台机器重复激活。已激活后打开该窗口会联网显示已用名额(如 2 / 3),查不到时重开窗口重试即可,修复功能不依赖这次查询。

激活密钥被拒怎么排查

按顺序过一遍:

  1. 机器密钥是不是完整复制的?
  2. 激活密钥有没有截断?重新完整复制。
  3. 密钥是不是为旧版 Jasna 生成的?旧版密钥不再通用,需回购买渠道换新密钥。

⚠️ 你手里的密钥是不是以JW1-开头?那是云端 CLI 专用身份密钥,GUI 直接粘贴会被明确拒绝:start_activation和start_online_activation都会检查前缀并抛出license_cloud_cli_only(逻辑在 jasna/gui/activation_worker.py)——请去正确的入口使用。

另外记住一条:激活密钥只包含你许可证码里购买的模型,不会顺带解锁其他支持者模型。

收尾速查:症状 → 原因 → 去哪儿查

症状大概率原因去哪儿查
启动窗口卡住后报红行30 秒兜底,检查没跑完被按失败处理页眉重跑系统检查
首次启动报路径错误安装路径含非英文字符迁移到纯 ASCII 路径
启动日志有hard_disk_warning装在机械盘上迁到 SSD
ffprobe 检查不过FFmpeg 主版本号不是 8换装 FFmpeg 8
输出文件名带(1)后缀文件冲突=自动重命名生效中基本处理 → 文件冲突
列表高亮某条目命名模板会覆盖其他文件改模板或保存位置
停止后磁盘上有半成品文件输出文件残留按文件冲突策略处理后再跑
播放器秒数反复归零GPU 修复速度 < 播放速度降分辨率 / 换模型档位
点"视频播放器"无反应队列或预览占用 GPU等处理结束或停止
激活提示license_cloud_cli_only粘了云端 CLI 密钥(JW1-开头)换回本地激活密钥

主线总结:装对位置(ASCII 路径 + SSD)→ 批量喂入队列(分页内拖动排序)→ 按预设落盘(模板 + 冲突策略)→ 单视频微调(按视频覆盖检测参数)→ 实时预览验证效果(注意 GPU 互斥与秒数归零)→ 静态图单帧精修 → 日志/状态条排错 → 激活解锁支持者模型。界面里的每个约束(分页、互斥、归零提示、名额校验)都能在源码里找到一一对应的实现。

官方文档入口:docs/zh/gui.md

【免费下载链接】jasnaVideo restoration tool项目地址: https://gitcode.com/GitHub_Trending/ja/jasna

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进