录制过程直接写进配置里的保存目录,不再落到程序目录下绕一圈

为什么:

原来存在两个语义几乎相同的目录函数:recordingDir() 只看 -record 命令行参数,
没传就是程序所在目录;recordSaveDir() 才尊重 config.json 里的 directory。
ffmpeg 的实时输出、弹幕 ass/jsonl 的落盘、启动时建目录都走前者,录制结束后
moveFile() 才把文件搬到后者。

后果是:配了 directory 的人会发现录制中的文件一直躺在程序目录里(通常是系统盘),
录完才搬一次,跨盘就等于把整份文件再复制一遍;录制中途中断或者进程崩掉,文件还会
永久留在那儿。根目录 record\、merged\ 里那几个旧产物就是这么留下的。

处理方式是删掉 recordingDir(),四处调用点(启动建目录、两个平台的 transFilename、
web 保存设置后)统一走 recordSaveDir()。没有给旧函数留壳:留两个语义相近的目录函数,
迟早还会再漂一次。

saveRootDir() 依次兜底到 -record 目录、程序所在目录、当前工作目录,绝不返回空串——
空串会让后面 filepath.Join 拼出个相对路径,ffmpeg 就按自己的当前目录去写,文件落到
哪里完全不可控。

顺带订正两处与代码不符的注释:configData.Directory 原本写的是「弹幕文件录制结束后
会被移动到该文件夹」,README 也跟着这么写;现在如实写成保存根目录,并补上优先级。

验证:

- gofmt -l 干净、go vet ./... 干净、Windows 与 GOOS=linux 均编译通过。
- 新增 filename_test.go:锁住 transFilename 生成的路径必然落在 recordSaveDir() 下
  (含 directory 为空时回落 -record 目录),以及 moveFile 在路径一致时不动文件。
- go test ./... 全绿。
- 反向验证:把 recordSaveDir() 退回旧的 recordingDir() 写法后,对应用例确实变红。
- 最小实例端到端:exe 放进单独目录、-record 指向自身、directory 指向别处,
  record\ 与 merged\ 建在 directory 下,程序目录里一个都没有。
This commit is contained in:
tamakyi
2026-09-28 02:03:39 +08:00
parent 3c17503a21
commit 7ab80ec429
6 changed files with 111 additions and 22 deletions
+2 -2
View File
@@ -75,7 +75,7 @@ GOOS=windows GOARCH=amd64 go build -o acfunlive.exe
"qualities": [] // 开播时读到的码率档位列表,缓存下来让没开播时也能显示对应关系
}
],
"directory": "", // 录制文件保存的文件夹,留空是程序运行时的 -record 文件夹
"directory": "", // 录播和弹幕文件的保存根目录,录制时就直接写在这里;留空用运行时的 -record 文件夹
"webPort": 51880, // web UI 的端口,为 0 时不启动 web UI
"autoMerge": false, // 直播结束后自动把弹幕层合并进录播
@@ -127,7 +127,7 @@ GOOS=windows GOARCH=amd64 go build -o acfunlive.exe
档位表要开播后读直播源列表才知道(写在`config.json`的`qualities`里缓存)。没读到过的行,选项后面不会带档位名,旁边的`档位`按钮可以去直播间接一次(主播没开播时会失败并提示,服务端本身要重试三次、约 5 秒,所以点下去会先给一句`正在读取码率档位…`)。读档位的时机是:录制开始取流时、页面上点`档位`按钮、以及发现主播在直播但还没有档位缓存时自动读一次(同一个主播 10 秒内只读一次)。录制始终是原画质直接保存(`-c copy`),不会重新编码,所以只能在这几个档位里挑。
录播原片和弹幕文件(`.ass`、`.nick.ass`、`.jsonl`)保存在保存目录下的`recordSubdir`子文件夹里(默认`record`),两者同名配对才能自动合并;合并后的成片保存在`mergeSubdir`子文件夹里(默认`merged`),留空则用默认值,两个名字不能相同。如果设置了`mergeOutputDir`,成片优先移动到那里。
录播原片和弹幕文件(`.ass`、`.nick.ass`、`.jsonl`)保存在保存目录下的`recordSubdir`子文件夹里(默认`record`),**录制过程中 ffmpeg 就直接写在这里**,不会再先落到别处中转;两者同名配对才能自动合并。保存目录的优先级是:`directory` > 命令行`-record`指定的文件夹 > 程序所在目录。合并后的成片保存在`mergeSubdir`子文件夹里(默认`merged`),留空则用默认值,两个名字不能相同。如果设置了`mergeOutputDir`,成片优先移动到那里。
合成**先在录播文件夹里做完,写完了才落到成片文件夹**(同一个盘时是直接改名,几乎瞬时;跨盘会自动拷贝):成片文件夹是网络盘、外接盘或者中途断线时,不会在里面留下一个写到一半、看起来却像正常成片的文件。合成失败或中途强杀程序时,临时文件(`acfunlive_chunk_*`、`*.acfunlive.part`)不会出现在文件管理的列表里,程序下次启动会自动清掉。