bash脚本使用ffmpeg的诡异变量乱码问题,是ffmpeg的bug吗?

问题描述

打算把一个音频文件按内容分段,所以先把各分段的时间点都找了出来,用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

阅读 2.5k
1 个回答
新手上路,请多包涵

本打算去 stackoverflow 再开一贴,忽然发现有人问过了,不愧是面向 stackoverflow 编程啊
看来这里的人气还是不够足哦
bash - Execute "ffmpeg" command in a loop - Stack Overflow

原因在于 ffmpeg 默认会读取 stdin 作为交互输入,把 read 嘴里的粮给抢了,真是够坑的,这也是 shell dirty 之处
显式禁用就好:ffmpeg -nostdin

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题