在循环中执行ffmpeg命令

Moh*_*had 12 bash ffmpeg

我有我的文件夹中的3个.wav文件,我想将它们转换成MP3播放与ffmpeg的我写了这个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
Run Code Online (Sandbox Code Playgroud)

Sha*_*Lee 34

使用-nostdinffmpeg命令行中的标志

ffmpeg -nostdin -i "$name.wav" -ab 320k -ac 2 "$name.mp3"
Run Code Online (Sandbox Code Playgroud)

请参阅此页面上的"-stdin/-nostdin"标志=> https://ffmpeg.org/ffmpeg.html

  • 这应该是最好的答案. (14认同)

che*_*ner 16

如果您确实需要find(查看子目录或执行更高级的过滤),请尝试以下操作:

find ./ -name "*.wav" -exec ffmpeg -i "{}" -ab 320k -ac 2 '$(basename {} wav)'.mp3 \;
Run Code Online (Sandbox Code Playgroud)

管道输出findwhile循环有两个缺点:

  1. 它在匹配的文件名包含换行符的(可能很少见的)情况下失败.
  2. ffmpeg由于我不知道的某些原因,将从标准输入读取,这会干扰read命令.通过简单地重定向标准输入即可轻松修复/dev/null,即 find ... | while read f; do ffmpeg ... < /dev/null; done.

在任何情况下,都不要将命令存储在变量名中并使用它们进行评估eval.进入是危险的,也是一种坏习惯.如果确实需要将实际命令行分解出来,请使用shell函数.

  • 这真的回答了这个问题.不完全,但至少`</ dev/null`修复了这个问题.这让我疯了好几次.看来真的ffmpeg正在消耗find的输出! (2认同)
  • 我花了几天时间才发现</ dev/null应该与while循环中的ffmpeg一起使用.真的让我发疯了!谢谢 (2认同)

Rei*_*ase 5

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

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

  • 投反对票。这是一种解释“bash”功能的解决方法,而不是“ffmpeg”实际问题的解决方案。参见 Shammell Lee 的回答。 (4认同)