任务:将一个 mp3 文件拆分为多个 mp3 文件,使用带有开始时间、结束时间和标题的 CSV 文件。
错误:跳过的部分,一些部分命名错误,随机累积错误:
- ss 的持续时间规范无效::05
- t 的持续时间规范无效:Name4
迄今已完成:仔细检查了 CSV 文件,更改了脚本代码。
文件:
- 数据.csv
00:01:14,00:08:42,Name1
00:08:42,00:17:17,Name2
[...]
- 脚本
#!/bin/bash
inputCSV="data.csv"
inputMP3="audioFile.mp3"
i=0
#ffmpeg -i $inputMP3 -f null -
while IFS=',' read -r f1 f2 f3
do
((i++))
#echo "$i $f1 $f2 $f3"
ffmpeg -i "$inputMP3" -vn -acodec copy -ss "$f1" -t "$f2" "$i|25 - $f3.mp3"
done < "$inputCSV"
顺便一提:当仅使用 echo "$i $f1 $f2 $f3" 而不是 ffmpeg 命令时,CSV 文件的输出是正确的。
答案1
这涵盖Bash常见问题/089。问题是ffmpeg
消耗了(部分)stdin,所以不是所有的都data.csv
进入了read
。
解决这个问题最简单的方法是ffmpeg
读取/dev/null
:
</dev/null ffmpeg …
这种方法需要 shell,所以对你来说没问题。如果你需要类似的东西而不需要 shell,请使用该-nostdin
选项(在 shell 中也应该有效):
ffmpeg -nostdin …
当仅使用 时echo
,没有ffmpeg
并且echo
不会从其标准输入读取。在这种情况下,仅从read
读取data.csv
,因此整个循环的行为符合您的预期。