在循环中执行ffmpeg命令

时间:2014-02-07 17:28:04

标签: bash ffmpeg

我的文件夹中有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

3 个答案:

答案 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循环有两个缺点:

  1. 在匹配的文件名包含换行符的情况下(可能很少见)失败。
  2. 由于某些我不知道的原因,
  3. ffmpeg将从标准输入读取,这会干扰read命令。通过简单地重定向/dev/null的标准输入,即find ... | while read f; do ffmpeg ... < /dev/null; done,这很容易解决。
  4. 在任何情况下,都不要将命令存储在变量名中,并使用eval对它们进行评估。进入是危险的,也是一种坏习惯。如果确实需要将实际命令行分解出来,请使用shell函数。

答案 2 :(得分:5)

没有理由,只需使用通配符globbing

#!/bin/bash
for name in *.wav; do
  ffmpeg -i "$name" -ab 320k -ac 2 "${name%.*}.mp3" 
done