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

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

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

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

答案1

这是您可以在终端中输入的快速一行:

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

您还可以使用 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

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


解释

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

|角色被称为管道。它告诉 shell 获取左侧命令的输出并将其作为右侧命令(在本例中为循环read内的命令)的输入传递while

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

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

while <something is true>; do
    <run some commands>
done

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


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

答案2

不确定命令行是否切换到neroAacEnc,但类似这样:

% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
neroAacEnc $orgfile $newfile
' {} \;

或者您可以使用 ffmpeg 进行转换(未经测试):

% cd <dir where .wav files are>
% find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"
ffmpeg -i $orgfile -ab 256 $newfile
' {} \;

作为脚本(将以下内容放入文件中)

#!/bin/bash

# myscript.bash
cd <dir where .wav files are>

find . -type f -name '*.wav' -exec sh -c '
orgfile="$0"
newfile="$(echo "$0" | sed 's/.wav/.aac/')"

neroAacEnc -2pass -q 1 -if $orgfile -of $newfile
' {} \;

将文件 (myscript.bash) 设为可执行后chmod +x myscript.bash,运行它./myscript.bash,就完成了。

参考

-FFmpeg 和 AAC 编码指南

笔记:还有其他“秘诀”可用于将 .wav 转换为 .aac 并获得不同的品质、特征等。

答案3

我也会使用 ffmpeg。如果您使用 libfaac,它仅支持 -aq,而不支持 -vbr 或 -ab:

for f in **/*.wav; do ffmpeg -i "$f" -c:a libfaac -aq 150 "${f%wav}m4a"; done

**需要 bash 4.0 或更高版本和/shopt -s globstar或 zsh。您可以使用 来显示有关结果文件的信息ffmpeg -i

根据http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide,本机编码器(如果我没有指定 -c:a 则使用该编码器)的质量低于 libfaac,而 libfaac 的质量低于 libfdk_aac。--enable-libfdk_aac --enable-nonfree(或brew install ffmpeg --with-fdk-aac)包括对 libfdk_aac 的支持。

如果您有 4 个 CPU,则最多并行运行 4 个进程:

find . -name \*.wav | parallel ffmpeg -i {} -c:a libfdk_aac -vbr 4.5 {.}.m4a

-vbr 0 最低,-vbr 5 最高。

相关内容