# 房间Shell命令
房间 Shell 命令允许你在每场录制全部结束后自动执行一段自定义 Shell 脚本(如把录制文件复制到 NAS、调用其他工具处理文件)。该功能仅支持 Linux(包括 Docker),适合有一定 Linux 基础、需要自动化后处理的用户。
# 这是什么
当一个房间的录制任务完整结束(主播下播或你取消录制,且所有重连都结束)后,DDTV 会把预先配置好的命令模板里的关键字替换成实际值(文件名、房间信息等),然后通过 /bin/bash -c "命令" 执行。
# 怎么开启
第一步,打开总开关。配置文件 ./Config/DDTV_Config.ini:
| 配置项 | 默认值 | 说明 |
|---|---|---|
Linux_Only_ShellSwitch | false | Shell 功能总开关,仅 Linux 生效,Windows 下即使打开也不会执行 |
Linux_Only_ShellCommand | 空 | 全局 Shell 命令模板,房间没有单独配置命令时使用 |
第二步,配置命令。命令有两个层级:
- 房间级:
./Config/RoomListConfig.json中每个房间的Shell字段(WEBUI 的房间设置里也可以编辑),优先于全局命令; - 全局级:上面的
Linux_Only_ShellCommand,当房间的Shell为空时使用。
# 可用关键字
# 录制文件类(注意:多个文件之间用英文逗号 , 分隔!)
| 关键字 | 内容 |
|---|---|
{AfterRepairFiles} | 本次录制产出的视频文件完整路径列表(修复/转码后的文件) |
{DanmakuFiles} | 弹幕文件完整路径列表 |
{SCFiles} | SC 记录文件完整路径列表 |
{GuardFiles} | 大航海记录文件完整路径列表 |
{GiftFiles} | 礼物记录文件完整路径列表 |
{Files} | 以上所有文件合并后的完整路径列表 |
# 房间与时间类
| 关键字 | 内容 |
|---|---|
{ROOMID} | 房间号(长号) |
{NAME} | 主播昵称 |
{TITLE} | 直播间当前标题(已去除文件非法字符) |
{DATE} | 当前日期,格式 yyyy_MM_dd |
{TIME} | 当前时间,格式 HH_mm_ss |
{YYYY} {YY} | 年(2026 / 26) |
{MM} {DD} | 月、日(两位) |
{HH} {mm} {SS} {FFF} | 时、分、秒、毫秒 |
{R} | 随机四位数(1000-9999) |
{CWD} | 当前录制文件的目录完整路径 |
# 一个实用例子:录完自动复制到 NAS
需求:某主播录完后,把视频文件复制到挂载好的 NAS 目录 /mnt/nas/录播/主播昵称/ 下。
房间 Shell 字段填写:
mkdir -p '/mnt/nas/录播/{NAME}' && IFS=',' read -ra FS <<< '{AfterRepairFiles}' && for f in "${FS[@]}"; do cp "$f" '/mnt/nas/录播/{NAME}/'; done
因为 {AfterRepairFiles} 是逗号分隔的列表,上面用 IFS=',' 拆成数组后逐个复制。
重要注意事项
- 路径和文件名中可能有空格,引用时务必用单引号包裹关键字(如
'{AfterRepairFiles}')。DDTV 内部会用双引号把整个命令传给bash -c,所以命令里再出现双引号会破坏命令结构——这也是上面例子用单引号的原因。 - 确保关键字对应的内容确实存在:比如房间没开弹幕录制,
{DanmakuFiles}就会被替换成空字符串,命令拿到空参数可能执行失败。同理,关闭了自动修复/转码(AutomaticRepair)时{AfterRepairFiles}的内容也会受影响。 - Shell 执行只输出到 DDTV 日志(替换前后的命令都会记录在日志里,级别为 Warn),脚本自身的 stdout 可以在 DDTV 日志中排查。
- 执行是同步等待的,脚本跑太久会阻塞该房间的收尾流程,耗时操作建议在脚本里后台化(
nohup ... &)。
# 排查
执行前后 DDTV 都会在日志中记录原始命令和替换关键字后的命令(日志标签 Shell),命令没按预期执行时先看日志里替换后的实际命令是否正确。