如何使用 neroAacEnc 将子目录中的所有 .wav 文件转换为 .aac?

OMG*_*chy 5 bash arch-linux shell-script

我有一组 .wav 格式的音乐,想使用 neroAacEnc 将其转换为 .aac/.mp4。

我该怎么做呢?我正在使用 Arch Linux x86_64 和 Xterm。

drs*_*drs 5

这是您可以在终端中键入的快速单行:

find . -name "*.wav" -print0 | while read -d $'\0' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done
Run Code Online (Sandbox Code Playgroud)

您也可以使用 ffmpeg,正如@slm 所建议的那样,

find . -name "*.wav" -print0 | while read -d $'\0' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done
Run Code Online (Sandbox Code Playgroud)

我不确定 neroAacEnc 与 ffmpeg 相比如何,但我知道 ffmpeg 非常受许多 Linux 用户欢迎。


解释

find是一个程序,它返回与某个文件属性匹配的文件的路径,在这种情况下是文件名。如果您只想知道当前路径的子目录中的 .wav 文件是什么,您可以执行find . -name "*.wav". 通常这会在一个新行上输出每个文件。这-print0使它用空字符分隔匹配项。当我们将输出传递给下一个命令时,这允许正确处理带有空格的文件名。

这个|角色被称为管道。它告诉 shell 获取左边命令的输出并将其作为输入传递给右边的命令,在这种情况下,readwhile循环中的命令。

read命令用于获取输出find并将其分配给变量“文件”。通常,这会一次为每个单词“文件”分配值,但这-d $'\0'$会导致分配由空字符分隔(与我们find使用-print0标志分隔文件的方式相匹配)。

while 循环导致read为每个匹配的文件名迭代地为“文件”分配值。的dodone是一个while循环标准的bash语法的一部分:

while <something is true>; do
    <run some commands>
done
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们的“运行一些命令”是ffmpegneroAacEnc。在每种情况下,输入文件(即$file)是用我们分配的“文件”变量指定的read,输出文件(即${file%wav}w4a)是对这个变量的操作,它允许我们为文件指定不同的名称输出。通常$file${file}会评估文件的名称,比如some song.wav。的%说,从变量的右切断匹配的字符[1]〜的权的任何序列%(即,“WAV”)。所以${file%wav}会评价一些歌曲。,然后“m4a”是文件名的新结尾:some song.m4a


[1] 为简单起见,我在这里说“字符”。右边的序列%可以是正则表达式。例如,如果我们说${file%w*v}变量是some song.w1234v,它也会评估为some song。.

  • 根据记录,fdk_aac 和 neroAacEnc 都被认为是很好的 AAC 编码器,而 ffmpeg 中的所有其他 AAC 编码器都......不是。此外,由于许可问题,fdk_aac 不能与 ffmpeg 以二进制形式合法分发,因此要使用它,您必须编译自己的 ffmpeg。 (2认同)