如何用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
相关产品推荐
相关产品推荐

