You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用awk/sed结合FFmpeg按预定义时间分割有声书为带序号章节

用awk生成FFmpeg有声书分割命令的解决方案

看来你在处理有声书分割时遇到了awk字段处理和文件名序号格式化的问题,别担心,这两个问题用awk都能轻松解决,下面给你具体的实现方案:

假设你的时间元数据格式

先确认下你的时间元数据文件(比如命名为chapter_timestamps.txt)的格式,应该是每行两个字段,分别是章节的开始和结束时间,类似这样:

0.000000 3472.683000
3472.683000 7642.058000
7642.058000 12105.724000
...

核心awk命令

直接用下面的awk命令就能生成符合要求的FFmpeg分割命令:

awk '{printf "ffmpeg -i output.mp3 -acodec copy -ss %s -to %s ch%02d.mp3\n", $1, $2, NR}' chapter_timestamps.txt

命令解释

  • $1 和 $2:分别提取每行的第一个(开始时间)和第二个(结束时间)字段,完美解决你之前的字段位置处理问题;
  • NR:awk的内置变量,代表当前处理的行号(从1开始递增);
  • %02d:格式化输出两位数字,行号1会变成01,行号10就是10,这样就能自动生成ch01.mp3、ch02.mp3...ch10.mp3这类规范的文件名;
  • printf:确保输出的FFmpeg命令格式完全符合要求,没有多余的空格或换行。

如果你的元数据带章节前缀(比如ch0、ch1)

要是你的元数据每行开头已经有chX的标识,比如:

ch0 0.000000 3472.683000
ch1 3472.683000 7642.058000

那可以调整awk命令来提取章节号并格式化:

awk '{chapter_num = substr($1, 2); printf "ffmpeg -i output.mp3 -acodec copy -ss %s -to %s ch%02d.mp3\n", $2, $3, chapter_num + 1}' chapter_timestamps.txt

这里substr($1, 2)会提取ch0里的0,加1后就变成01,对应ch01.mp3,以此类推。

批量执行生成的命令

如果想直接批量执行这些分割命令,可以把输出重定向到一个脚本文件,然后执行:

# 生成脚本
awk '{printf "ffmpeg -i output.mp3 -acodec copy -ss %s -to %s ch%02d.mp3\n", $1, $2, NR}' chapter_timestamps.txt > split_chapters.sh
# 赋予执行权限
chmod +x split_chapters.sh
# 运行脚本
./split_chapters.sh

可选:用sed实现(不如awk直观)

如果你想用sed尝试,也可以通过行号生成和文本替换来实现,但写法会复杂一些:

sed '=' chapter_timestamps.txt | sed 'N;s/\n/ /' | sed -E 's/([0-9]+) ([0-9.]+) ([0-9.]+)/ffmpeg -i output.mp3 -acodec copy -ss \2 -to \3 ch\0\1.mp3/'

不过还是更推荐awk方案,逻辑更清晰,维护起来也方便。

内容的提问来源于stack exchange,提问作者Karim Bn Abdlaziz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:34:49