我有一个由许多子文件夹组成的文件夹,每个子文件夹都有其他子文件夹,其中包含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?
答案 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文件; shopt -s nullglob
会使两个globs扩展为零参数(注意:如果此代码是较大脚本的一部分,请记住禁用 nullglob 一旦你离开循环,以防止不必要的行为); mv -f
代替 rm + mv 技巧。