# 房间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),命令没按预期执行时先看日志里替换后的实际命令是否正确。