mai-gen-videob50(+chu) 分表视频生成器
自动从流媒体上搜索并构建你的舞萌DX / 中二节奏 Best分表视频
Auto search and generate your best videos of MaimaiDX / Chunithm
更新速览
v1.2.6 更新
- 更新了部分图片素材,现在生成中二节奏模板将展示
中二节奏2027和CHUNITHM Mate定数变动 - 缓存重复读取的视频帧,减少 30fps 素材输出 60fps 时的重复定位开销。
- 为Taichi GPU 片段合成增加 GPU 后端选择。
- 修复 Linux 下 AV1 谱面视频无法解码、生成黑屏却提示成功的问题;固定OpenCV和NumPy依赖以临时解决该问题(#123)。
- 修复Linux环境下,舞萌和中二成绩图片中游玩次数素材的大小写路径错误(#124)。
v1.2.5 开发版本更新
- ✨ maimai 默认视频源启用数据库 Metadata:现在maimai模式下,不再要求登录或配置 Bilibili 搜索,对于所有Master/Re:Master谱面和所有11+以上的Expert谱面可自动查找匹配视频链接,此功能可避免因登录失败或搜索错误而产生的视频寻找困难问题。YouTube 搜索和中二模式暂未支持数据库 Metadata,仍然保持旧版方案。
- 🛠️ 手动修正和覆盖:如果数据源存在错误,或需要自定义非数据源覆盖的谱面,仍然可直接填写 BV/链接与分P来指定;覆盖已有缓存时先下载临时文件,成功后才替换旧文件。
- 🛠️ 若干bilibili api和GPU视频生成模式的问题修复。我们已经注意到上游bilibili api自2026年6月后不再维护,后续会将重心逐步从流媒体搜索转向可维护的元数据开发,减少对爬虫商业api的依赖。
v1.2.4 开发版本更新
以下小补丁来自@奕凌Yelon
- ✨ 新增数据源: 现在可以读取MuNET导出的JSON作为B50数据源了!但由于元数据完整度受限和Dxrating的bug修复,我们依旧建议MuNET玩家使用DXrating网站作为中转导入成绩。
- ✨ B50平替地板: 在一些国际服/日服数据导入方式中,现在可以保留多个与B35/B15地板同分的成绩。
- 🛠️ 修复了在特定导入模式下,B50筛选条件不生效的bug;
- 🛠️ 移除了maimai booklet导入方式的支持。
快速开始
- 获取打包版本:从右侧Release页面下载最新版本。
- 您需要下载两个压缩包,运行环境包和本体分离,进行以下操作:
maigen_release_v<版本号>.zip)和运行环境包(runtime_v<版本号>.zip),并解压
- 将运行环境包中的全部文件,复制到本体包解压后的目录,覆盖同名文件
- 双击start.bat文件启动应用。
- 请不要使用旧版本的runtime运行环境,其缺少新版本的依赖
- 请注意:打包版本仅支持Windows10及以上操作系统
macOS/Linux用户请使用源代码方式启动, Release 打包运行环境仅提供 Windows 版本。- 首次启动时,如果没有立刻弹出浏览器窗口,请检查控制台,如果要求输入Email,请直接回车跳过即可。
- 遇到问题请参考常见问题一节。
如果你具有基本的计算机和python知识,可以独立(或者LLM辅助)完成环境配置和脚本操作,可以直接clone仓库代码,参考安装说明部分开始使用。
效果预览
- 用户界面(支持主题换色)
|
|
|
|:---:|:---:|:---:|
| maimai Prism | maimai Circle | Chunithm Verse |
生成视频效果展示:
- 生成视频帧效果
|
|
|:---:|:---:|
| maimai | Chunithm |
特性
查分器源支持情况
国服专属的查分器导入
- [x] 水鱼查分器:请注意在个人选项中关闭掩码,并允许公开获取你的B50数据。
- [x] 落雪查分器:直接通过好友码获取(请在账户设置中打开相关权限)。如果您不愿意授权开发者读取,可选择填入落雪后台生成的个人 API KEY 拉取数据。
- [x] DXrating:支持国服/国际服/日服
- [x] MuNET导出的成绩数据JSON(有没有好心观众提供一个网站?)
已实现特性
- [x] 可交互的全流程界面(streamlit)
- [x] 支持一键更换页面主题配色
- [x] 更好的存档系统,可以保存多个历史副本,已经对应媒体信息
- [x] 支持自行筛选分表数据、自定义视频生成的列表(支持自动获取AP B50)
- [x] 支持自定义视频背景图片、字体和字号等个性化功能
- [x] 支持中二节奏B30视频生成
安装说明(从源代码启动)
- 安装python环境和依赖,推荐使用
conda。注意,python版本需要3.10以上。
conda create -n mai-chu-gen-video python=3.10
conda activate mai-chu-gen-video
- 从 requirements.txt 安装依赖
pip install -r requirements.txt
> GPU 加速推荐 Python 3.10–3.12,使用 python -m pip install -r requirements-gpu.txt 安装已验证的组合。Linux 的 AV1 解码需要 OpenCV 4.14.0.94;请不要将其自动升级到 5.0.0 以上。
- 安装ffmpeg(如果从Release包中下载,则无需此步骤):
从 CODEX FFMPEG 下载 ffmpeg-release-essentials.zip 文件,解压文件到你的电脑上的任意目录后,将 bin 目录所在路径添加到系统环境变量中。
- Linux:
使用sudo apt-get install ffmpeg安装ffmpeg。
- macOS:
推荐先安装 Homebrew,然后执行 brew install ffmpeg。
如果后续需要使用 ffmpeg-concat 的高级转场模式,还需要额外安装 Node.js:brew install node
- 使用下面的命令启动streamlit网页应用
streamlit run st_app.py
在网页运行程序时,请保持终端窗口打开,依照页面指引使用即可
> macOS/Linux 建议直接使用当前虚拟环境对应的解释器执行依赖安装,例如:python -m pip install -r requirements.txt
常见问题
安装环境相关
- 出现
ModuleNotFoundError: No module named 'moviepy'等报错
requirements.txt中的所有依赖。
- 出现类似如下的报错:
OSError: [WinError 2] The system cannot find the file specified
MoviePy error: the file 'ffmpeg.exe' was not found! Please install ffmpeg on your system, and make sure to set the path to the binary in the PATH environment variable
请检查你的python环境和ffmpeg是否安装正确,确保其路径已添加到系统环境变量或项目根目录中。
图片生成相关
- 所有曲目的成绩图片生成时都没有曲绘:
请检查杀毒软件/防火墙/路由器设置等任何可能拦截网站访问行为的因素。
视频抓取相关
- 搜索视频步骤中,扫码登录后出现如下报错:
请检查任务栏是否有未关闭的二维码扫描窗口,如果有,关闭该窗口后尝试重新开始搜索。如果弹出了新的二维码窗口请重新扫描登陆。如果没有,请尝试重新整个程序重试。
- 搜索和下载视频时出现大量失败信息:
这通常意味着您的网络环境在调用api时遇到风控问题。请查看控制台是否有有如下输出。
- 使用youtube下载器时,被风控将输出如下错误:
This request was detected as a bot. Use use_po_token=True to view.
说明你使用的ip地址可能被youtube识别为机器人导致封禁,最简单的办法是尝试更换代理ip后重试。
如果更改代理仍然无法解决问题,请尝试配置PO_TOKEN或OAUTH_TOKEN后抓取视频,参考使用自定义OAuth或PO Token。
如果仍然被风控请考虑使用 YouTube Data API v3 进行搜索(更稳定可靠)
- 前往youtube平台申请个人API Key - 在"搜索谱面确认视频信息"页面,勾选"使用 YouTube Data API v3 搜索"并填入你的 API Key
- 使用bilibili下载器时,被风控将输出如下错误:
搜索结果异常,请检查如下输出:'v_voucher': 'voucher_xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx'
说明你未使用bilibili账号登录,或登录后遭到风控。
请尝试登陆账号、更换网络运营商(ISP)后重试。若仍出现此问题,目前没有较好的解决办法,请考虑等待24h后再试。
PS:您也可以跳过自动搜索步骤,使用页面中提供的快捷跳转链接,手动在浏览器中搜索视频,将链接粘贴到输入框中。
- 网络链接问题
- RemoteProtocolError
httpx.RemoteProtocolError: peer closed connection without sending complete message body
- SSLEOFError / urlopen error
<urlopen error [Errno 2] No such file or directory>
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2423)
通常只是网络波动,重新尝试搜索/下载即可。
配置填写相关
- Q:加载页面4-1时,提示 "找不到对应的图片/视频文件"
解决方法: - 刷新页面:最简单的方法是刷新当前页面,重新加载媒体文件 - 检查文件路径:确认视频文件确实存在于本地,且路径正确 - 重新下载视频:如果文件确实丢失,请返回第1步重新生成图片,或第3步重新下载视频
- Q:我不小心更新了B50/B30数据,但是我还想要使用旧的数据生成视频
视频生成相关
- Q:视频生成过程中中断,报错中出现如下内存错误
_ArrayMemoryError: Unable to allocate xxx MiB for an array with shape (xxx, xxx, 3) and data type float64
这通常是由于ffmpeg没有被分配足够的内存导致的,由于完整生成模式需要一次缓存约50段视频的图像张量,且默认分辨率为高清,部分设备可能会出现内存瓶颈。
请考虑: - 清理系统运行内存,关闭暂时不使用的后台程序后重试。 - 缩减片段的预览时长,或降低视频分辨率(不推荐,可能导致文字错位)。 - 增加系统的虚拟内存(请参考:如何设置虚拟内存),建议可以调整至32GB以上。
- Q:视频生成速度缓慢
如果未启用 GPU 加速,本工具的性能瓶颈主要是 CPU 性能。建议在 global_config.yaml 中设置 USE_GPU_ACCEL: true 或在「合成完整视频」页面勾选 GPU 加速以显著提升渲染速度。
如果您的设备不支持 GPU 加速,该时间可能会延长到3小时甚至以上,请考虑缩减视频时长,或降低视频分辨率(不推荐,可能需要手动调整字号以防止文字错位)
- Q:视频生成过程中中断,并提示无法读取某视频文件
ffmpeg_read: ...\videos\downloads\xxx-x-xx.mp4, 3 bytes wanted but 6 bytes read at frame index 0 (ouf of a total of xx frames) 0.00 sec, Using the last valid frame instead.
请检查错误信息中输出的视频名称(如xxxx-x-xx.mp4),在./videos/downloads文件夹下检查是否存在该文件,且该视频是否可以正常播放。
如果该视频无法播放,可能意味着下载过程中视频损坏。请删除该视频文件,重新进入第3步下载。 如果重新下载后依然得到损坏的视频,那么该视频的在线媒体流可能存在问题,请考虑回到第2步,更换其他链接源。 > 您还可以考虑在4-1页面中手动上传本地文件,以替换无法解码的流媒体文件。
- Q:生成视频最后出现如下控制台错误
if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 6] 句柄无效。
这是因为ffmpeg没有正常关闭视频文件导致的,但该问题不影响最终视频生成,可以忽略。
参数与配置文件结构
如果你有兴趣贡献本仓库,或是希望了解本工具的详细结构,请参考以下内容。
全局应用参数的解释
在 global_congfig.yaml 文件可更改本应用的所有外部配置:
DOWNLOAD_HIGH_RES:设置为是否下载高分辨率视频(开启后尽可能下载1080p的视频,否则最高下载480p的视频),默认为true。
NO_BILIBILI_CREDENTIAL:使用bilibili下载器时,是否禁用bilibili账号登录,默认为false。
USE_CUSTOM_PO_TOKEN, USE_AUTO_PO_TOKEN, USE_OAUTH, CUSTOMER_PO_TOKEN:设置使用youtube下载器抓取视频时的额外验证Token。
USE_YOUTUBE_API:是否使用 YouTube Data API v3 进行搜索,默认为false。推荐设置为true以获得更稳定的搜索体验。
YOUTUBE_API_KEY:YouTube Data API v3 的 API Key。如果USE_YOUTUBE_API为true,需要填写此字段。
SEARCH_MAX_RESULTS:设置搜索视频时,最多搜索到的视频数量。
SEARCH_WAIT_TIME:设置搜索和下载视频时,每次调用API后等待的时间,格式为[min, max],单位为秒。
VIDEO_RES:设置输出视频的分辨率,格式为(width, height)。
VIDEO_TRANS_ENABLE:设置生成完整视频时,是否启用视频片段之间的过渡效果,默认为true,会在每个视频片段之间添加过渡效果。
VIDEO_TRANS_TIME:设置生成完整视频时,两个视频片段之间的过渡时间,单位为秒。
USE_ALL_CACHE:生成图片和视频需要一定时间。如果设置为true,则使用本地已经生成的缓存,从而跳过重新生成的步骤,推荐在已经获取过数据但是合成视频失败或中断后使用。如果你需要从水鱼更新新的b50数据,请设置为false。
ONLY_GENERATE_CLIPS:设置为是否只生成视频片段,如果设置为true,则只会在./videos/{USER_ID}文件夹下生成每个b的视频片段,而不会生成完整的视频。
CLIP_PLAY_TIME:设置生成完整视频时,每段谱面确认默认播放的时长,单位为秒。
CLIP_START_INTERVAL:设置生成完整视频时,每段谱面确认默认开始播放的时间随机范围,格式为[min, max],单位为秒。
鸣谢
- 舞萌 DX 查分器 提供数据库及查询接口
- 落雪查分器 提供中二节奏数据接口
- Dxrating 在线网页查分工具
- otoge DB Online DB viewer for songs in Ongeki, Chunithm, maimai
- 中二落雪查分器支持,YouTube Data API v3和部分界面重构支持,由caiccu参与贡献
- Tomsens Nanser 提供图片生成素材模板以及代码实现
Credits
- This repository fetches Unicode-defined emoji from twemoji