问题描述
打算把一个音频文件按内容分段,所以先把各分段的时间点都找了出来,用bash脚本循环读取,再用ffmpeg切割出来。
但诡异的是,切割出来的文件名是乱码。调试了一下,发现只要调用ffmpeg,bash变量里的数据就开始出错。已怀疑ffmpeg有内存越界问题,或搞乱了脚本输入。
问题出现的平台版本及自己尝试过哪些方法
OS: Manjaro Linux 21
ffmpeg: n4.4.1 built with gcc 11.1.0
方法1:把所有时间点放到单独文件中,通过循环读取,问题依旧
方法2:使用 sh -c 新开shell独立执行 ffmpeg,问题依旧
相关代码
seg.txt,第一列是分段名称:
1 00:00 00:08:41
v2 00:08:41 00:13:30
3 00:13:30 00:19:10
4 00:19:10 00:38:40
5 00:38:40 00:38:50
6 00:38:50 00:47:35
7 00:47:35 00:47:50
8 00:47:50 00:48:50
v9 00:48:50 01:05:10
10 01:05:10 01:21:37
11 01:21:37 01:28:08
v12 01:28:08 01:36:40
f=2022-1-28.aac
while read -r n s e; do
echo $n, $s, $e
ffmpeg -hide_banner -loglevel error -ss "$s" -i "$f" -to "$e" -c copy -y "$n.aac"
done < seg.txt
你期待的结果是什么?实际看到的错误信息又是什么?
输出:
10.aac
8.aac
6.aac
4.aac
2.aac
1.aac
可以看到缺失了不少分段。如果分段名称是中文,还会有 ? 乱码
根据调试,调用ffmpeg后变量n的值开始出错,时常为空值,导致ff截取失败。
如果把ff的调用语句注释掉,n值输出就正常,真是诡异!
目前的临时解决办法:
echo ffmpeg -hide_banner -loglevel error -ss "$s" -i "$f" -to "$e" -c copy -y "$n.aac" >> ff.sh
然后手动执行 ff.sh
本打算去 stackoverflow 再开一贴,忽然发现有人问过了,不愧是面向 stackoverflow 编程啊
看来这里的人气还是不够足哦
bash - Execute "ffmpeg" command in a loop - Stack Overflow
原因在于 ffmpeg 默认会读取 stdin 作为交互输入,把 read 嘴里的粮给抢了,真是够坑的,这也是 shell dirty 之处
显式禁用就好:
ffmpeg -nostdin