使用unix命令批量将wav文件批量转换为16位和ffmpeg

时间:2015-02-19 14:18:04

标签: bash unix ffmpeg

我有一个由许多子文件夹组成的文件夹,每个子文件夹都有其他子文件夹,其中包含wav文件。

我想转换所有这样的文件:

ffmpeg -i BmBmGG-BmBmBmBm.wav -acodec pcm_s16le -ar 44100 BmBmGG-BmBmBmBm.wav

但我希望保留目录结构和名称。覆盖或并行目录。

当输出文件具有不同的名称时,上面的命令单词很好,但是,使用相同的名称我得到一个错误:

Multiple frames in a packet from stream 0
[pcm_s24le @ 0x1538ac0] Invalid PCM packet, data has size 4 but at least a size of 6 was expected
Error while decoding stream #0:0: Invalid data found when processing input

我首先尝试像这样批量转换:

ffmpeg -i */*/*.wav -acodec pcm_s16le -ar 44100 */*/*.wav

不幸的是,这给出了同样的问题。如何将它们存储在并行目录中?说新/ / / * .wav?

2 个答案:

答案 0 :(得分:1)

这就是诀窍:

for f in $(find ./ -name '*.wav'); do 
ffmpeg -i $f -acodec pcm_s16le -ar 44100 ${f%.wav}z.wav; 
rm $f;
mv ${f%.wav}z.wav $f;
done

答案 1 :(得分:1)

可替换地:

shopt -s globstar nullglob
for f in *.wav **/*.wav
do
  ffmpeg -i "$f" -acodec pcm_s16le -ar 44100 "${f%.wav}.new.wav"
  mv -f "${f%.wav}.new.wav" "$f"
done

这使用纯Bash构造而不是讨厌的find。如果您的文件名(或目录名)包含空格或特殊字符,则不会扩展它们。

简要说明:

  • shopt -s globstar启用双星运算符,以便**/*.wav将在所有子目录中搜索wav文件;
  • 如果没有带有wav扩展名的文件,shopt -s nullglob会使两个globs扩展为零参数(注意:如果此代码是较大脚本的一部分,请记住禁用 nullglob 一旦你离开循环,以防止不必要的行为);
  • 所有变量都用双引号括起来,再次阻止扩展;
  • 使用
  • mv -f代替 rm + mv 技巧。