# CSRM
**Repository Path**: jslxxgyy/CSRM
## Basic Information
- **Project Name**: CSRM
- **Description**: 一个《都市:天际线Ⅱ》电台制作软件。
- **Primary Language**: 易语言
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-08-02
- **Last Updated**: 2026-03-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Cities Skylines Radio Manager,CSRM
一个《都市:天际线 2》电台制作软件。
简体中文丨
English
> [!CAUTION]
> **本软件由易语言编写,会有杀毒软件误报的情况,本项目保证软件中没有任何恶意代码,请自行添加杀毒软件信任区。编译结果已作打乱处理。**
---
本软件与都市天际线2模组[ExtendedRadio](https://mods.paradoxplaza.com/mods/75862/Windows)配套使用,可根据输入的内容一键生成自定义电台目录树及对应的json配置文件,无需手动编辑 json 文件即可在游戏中创建自定义电台,并可导入/导出电台。软件自带 FFmpeg,可以将音频文件转换为游戏需要的 .ogg 格式。
> [!TIP]
> 在使用此软件前,请确保已安装都市天际线2模组ExtendedRadio并能被正常加载。
## 如何新建电台:
- 1.首次启动,会自动打开设置,设置好有关选项后点击确定重启程序。
- 2.点击新建电台,打开电台新建窗口。
- 3.填写自定义电台信息,标*的为必填。
其中:
- 电台名称会显示在图中①处
- 电台描述会显示在图中②处
- 频道名称会显示在图中③处
- 频道描述会显示在图中④处
- 节目名称会显示在图中⑤处
- 节目描述会显示在图中⑥处
- 开始时间和结束时间会显示在图中⑦处
> [!TIP]
> 如果不填写开始时间和结束时间,那么⑦处对应的时间和进度条不会变化。
在以上信息填写完毕后,即可点击右方音乐管理分组框的“添加”按钮向对应的电台节目中添加音乐。这一环节支持几乎所有的音频格式,非`.ogg`文件会在新建电台时调用FFmpeg自动转换。
点击新建电台按钮即可生成电台。生成的电台位置由在设置中填写的游戏数据目录所决定。生成完成后可选择导出电台,并指定导出位置和文件名。随后提示“电台新建完成”,即可在ExtendedRadio模组设置中重新加载电台,建议重启游戏以重新加载模组。
也可访问bilibili获取[视频教程](https://www.bilibili.com/video/BV1Hvh1evEuw/)
## 导入电台
CSRM的导入电台功能可以导入在新建电台时导出的zip格式电台包。只需在主界面点击导入电台,选中要导入的电台包,再点击确定即可。无需输入额外信息。
### 前向兼容性
CSRM的导入电台功能具有一定的前向兼容性(没错,这么一个屁大点的史程序还有前向兼容),各发行版与现版本的CSRM(0.2.2 - Eula)兼容性如下表:
| 版本 | 兼容性 | 说明 |
|-----|---------|------|
| 0.0.3 - Aether | ❌ | 该版本无电台导出功能 |
| 0.1.0 - Bennett | ❌ | 由于软件在0.2.0版本经历重构,因此0.1.0版本的电台包与0.2.0版本后的结构完全不同,故不做兼容。仅0.1.0版本的程序能导入0.1.0版本的电台包 |
| 0.2.0 - Citlali | ⚠ | 可以导入,但有一些问题,已知问题有:①电台导入的目录由写入在被导入电台中的配置决定,与设置中的游戏数据目录无关。如果被导入电台中配置的目录不存在,则会导致导入失败。②如电台新建时勾选了“不使用FFmpeg对音频转换格式”则会导致电台导入失败。③无论新建电台时是否勾选“对节目写入额外的数据”,在电台导入时都不会保留节目额外数据。 |
| 0.2.1 - Dehya | ⚠ | 同0.2.0 - Citlali版本 |
| 0.2.2 - Eula | ✔ | 完全兼容 |
❌:不兼容,在尝试导入时会提示“非法电台文件!”
⚠:部分兼容,在尝试导入时潜在风险和存在的问题。
✔:完全兼容。
## 设置说明:
### 电台生成设置
游戏数据目录应填写游戏存放存档、自定义资产、日志与从Paradox Mods上获取的模组的目录,它通常在`C:/Users/<你的用户名>/AppData/LocalLow/Colossal Order/Cities Skylines Ⅱ/`。如果你正在使用CSUL(Cities: Skylines II Universal Launcher),也可以从CSUL的配置文件`CSUL.config`获取该目录。
> [!WARNING]
> 对BeplnEx版模组的支持已从0.2.2 - Eula版本中移除。
> [!WARNING]
> 部分用户会将游戏数据目录通过创建软链接的方式移动到其他位置。程序对软链接目录的支持尚不明确,建议填写真实目录而非软链接入口。
### 临时文件目录
临时文件目录是软件运行时的重要目录,会存储在电台创建过程中的关键文件。建议使用“程序目录下的临时目录”选项,或在自定义时设置一个简明易记的位置。在报告问题时需提供完整的临时文件目录内容。
### FFmpeg选项
FFmpeg选项中的编码质量等级用于控制使用FFmpeg转码音频文件时生成ogg文件的码率。共有12档可选,不同的质量等级与码率的对应关系大致如下:
| 质量等级 | 码率 |
|------------|----------------------------|
|-1 |32-48kbps |
|0 |48-64kbps |
|1 |64-80kbps |
|2 |80-96kbps |
|3 |96-112kbps(默认) |
|4 |112-128kbps |
|5 |128-160kbps |
|6 |160-192kbps |
|7 |192-224kbps |
|8 |224-256kbps |
|9 |256-320kbps |
|10 |可能的最大码率 |
如果需要更精确地控制生成文件的质量,可以勾选下方“使用恒定码率”的选项,并输入一个码率数。码率数值没有限制,推荐在32-500Kbps之间。太高或太低的码率可能导致编码器初始化失败。Vorbis编码器采用VBR可变比特率编码,实际码率与设置码率可能略有出入。
启用“并行多音频转码”可以在转码时创建多个FFmpeg进程同时转码所有音频,速度可能会稍快于按顺序转码各个音频。
## 功能计划:
- [x] 新建单频道单节目多音乐的电台
- [x] 使用FFmpeg自动转换音频
- [x] 自定义音频转换质量
- [x] 从CSUL读取游戏数据目录
- [x] 导出电台
- [x] 导入电台
- [x] 联网更新程序
- [ ] 使用自定义FFmpeg程序
- [ ] 自定义电台图标
- [ ] 修改现有电台
- [ ] 电台新建窗口引入选项卡布局
- [ ] 多语言支持
- [ ] 新建多频道多节目多音乐的电台
## 问题反馈与Q&A
### 问题反馈:
如在使用时出现问题,请在备份后清除游戏自定义电台文件目录并再次尝试出现问题的操作。若问题仍然存在,请于[CSLBBS](https://www.cslbbs.net/threads/cities-skylines-radio-manager.1053/)提交反馈。考虑到国内访问GitHub较为困难,会优先处理CSLBBS上的问题。
最近CSLBBS出现了访问不稳定的问题,如果无法访问CSLBBS,则请移步至GitHub提交问题。
在提交问题时:
- 需提供详细的问题说明或问题出现的视频或截图
- 需写明程序的版本号及编译时间
- 需上传程序运行目录下的`load.ini`文件
- 临时文件目录中有文件需一并上传
### Q&A
Q:为什么程序下载后无法运行,提示“包含病毒或潜在的垃圾软件”?
A:本程序由易语言编写,会有杀毒软件误报的情况。如果出现类似的提示,将程序所在目录添加至杀毒软件的排除项、信任区、白名单即可。
---
Q:为什么我每次启动程序都会进入设置?
A:这种情况大概率是程序的配置文件丢失或损坏,程序在检测到配置文件无效后会弹出设置窗口要求重新设置。可在删除程序运行目录下的load.ini文件后,重新启动程序正确填写设置即可。
---
Q:为什么节目的描述与开始结束时间默认是被禁止输入的?勾选“写入额外的数据”会发生什么?
A:在当前1.4.6版本的ExtendedRadio模组中,某一电台的目录下如有`program.json`文件并写入了描述与开始结束时间等数据。则在游戏中,该电台中所有音乐随机播放完一遍后,该电台就会卡死。无论是切换至其它电台后切回该电台,还是手动切换音乐,该电台都不会播放下一首音乐,除非在ExtendedRadio模组设置中重新加载电台或重启游戏。
---
Q:在FFmpeg转码时,对我的音频文件进行了那些操作?
A:首先,在转码时会用“-vn”参数去除包含音频封面信息的视频流。游戏无法播放带有封面视频流的ogg音频文件。其次,已知在CSRM自带的FFmpeg中如输入大于48KHz采样率的24位深度flac编码文件,调用libvorbis转换ogg时会返回“编码器初始化失败”。不确定32位或32位浮点深度的flac与采用其它编码的文件是否会发生此问题。在问题解决之前,同时也为了避免游戏与模组的潜在对高采样率音频的兼容性问题,在转码时会使用`-ar 48000`参数强制指定采样率为48KHz。
---
Q:为什么在打开游戏的同时新建电台,重新加载自定义电台后切到刚刚新建的电台却无法播放?
A:这种情况并非是电台本身有问题,而是电台没有被正确加载,重启游戏以重新加载模组即可解决此问题。
## 仓库结构及开发流程说明
CSRM项目采取双分支并行的开发模式。main分支为主分支,另一个分支为测试分支,名称为下一版本的的开发代号。所有的功能与性能改进都会优先推送到该分支,当测试分支成熟时,就会PR到主分支,并在稍后放出release。当一个release有缺陷时,补丁会直接推送到主分支,放出fix的release,并会在稍后合并补丁到测试分支。
### 自行编译
想体验测试分支中没有release的功能,可以先安装最新的release,再把测试分支中的文件拉取放在包含正式版的release的文件夹中,在自行编译时替换掉原本的主程序即可,这样可以最大限度的避免依赖问题。CSRM依赖精易模块,请确保自行编译时准备好该模块。准备好了这些以后,你也有了一个适用于CSRM的开发环境,为什么不提交一个PR呢?
### 你这代码保熟吗?
这是我的第一个GitHub项目,现在仍在早期阶段,代码中有很多细节问题,我也无法确保测试到每一种情况,难免会有疏漏之处。如果你对这个项目有意见或想贡献代码,欢迎提交PR/issue!(后面项目会用C#重写喔)
## 致谢
感谢[Snap.Hutao](https://github.com/DGP-Studio/Snap.Hutao)[^1]项目,该项目对CSRM文档与Changelog的规范化提供了借鉴与参考
感谢[Snap.Hutao.Deployment](https://github.com/Masterain98/Snap.Hutao.Deployment)项目,该项目对CSRM的更新器设计提供了借鉴与参考
感谢[FFmpeg](https://github.com/FFmpeg/FFmpeg)项目,该项目为CSRM提供了音频转码功能,依照GPL开源协议,您可以在[此仓库](https://github.com/jslxxgyy/FFmpeg)查看CSRM使用的FFmpeg的源代码
感谢[ExtendedRadio](https://github.com/AlphaGaming7780/ExtendedRadio)项目,作为CSRM的依赖,没有该项目就没有CSRM
[^1]: 原Snap.Hutao项目已因收到上海米哈游天命科技有限公司的律师函而停止开发,链接指向的原Snap.Hutao仓库已不再公开,如需参阅源代码请查看[此仓库](https://github.com/jslxxgyy/Snap.Hutao.backup),Snap.Hutao的继任项目请查看[此仓库](https://github.com/wangdage12/Snap.Hutao)
希望上海米哈游天命科技有限公司能做到“TECH OTAKU EMBRACE OPEN SOURCE COMMUNITY”
最后,向Snap.Hutao的开发组织 —— [DGP-Studio](https://github.com/DGP-Studio)和每位开发者、贡献者与支持者,[@wangdage12](https://github.com/wangdage12),以及每位努力在桌面端《原神》上获得最佳和更佳游戏体验的玩家致以最崇高的敬意!