我的文件夹中有3个.wav文件,我想用ffmpeg将它们转换为.mp3 我写了这个bash脚本,如下所示,但是当我执行它时,只有第一个将转换为mp3 我该怎么做才能让脚本不断浏览我的文件
这是剧本:
#!/bin/bash
find ./ -name "*.wav" -print | while read f
do
name=${f:2:${#f}-6}
cmd='ffmpeg -i "$name.wav" -ab 320k -ac 2 "$name.mp3"'
eval $cmd<br>
done
答案 0 :(得分:22)
使用ffmpeg命令行中的-nostdin
标志
ffmpeg -nostdin -i "$name.wav" -ab 320k -ac 2 "$name.mp3"
请参阅ffmpeg文档中的“-stdin / -nostdin”标志➠https://ffmpeg.org/ffmpeg.html
答案 1 :(得分:15)
如果您确实需要find
(查看子目录或执行更高级的过滤),请尝试以下操作:
find ./ -name "*.wav" -exec ffmpeg -i "{}" -ab 320k -ac 2 '$(basename {} wav)'.mp3 \;
将find
的输出管道传输到while
循环有两个缺点:
ffmpeg
将从标准输入读取,这会干扰read
命令。通过简单地重定向/dev/null
的标准输入,即find ... | while read f; do ffmpeg ... < /dev/null; done
,这很容易解决。在任何情况下,都不要将命令存储在变量名中,并使用eval
对它们进行评估。进入是危险的,也是一种坏习惯。如果确实需要将实际命令行分解出来,请使用shell函数。
答案 2 :(得分:5)