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

@slmが提案しているように、ffmpegを使用することもできます。

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代わりに一致をヌル文字で区切ります。これにより、出力を次のコマンドに渡すときに、スペースを含むファイル名を適切に処理できます。

この|文字はパイプと呼ばれます。これは、左側のコマンドの出力を取得し、それを右側のコマンド (この場合はループread内のコマンド)の入力として渡すようにシェルに指示しますwhile

readコマンドは、の出力を取得して、それを変数「file」に割り当てるために使用されます。通常、このコマンドfindは、一度に各単語ごとに「file」に値を割り当てますが、 により、-d $'\0'$割り当てがヌル文字で区切られることになります (フラグをfind使用して でファイルを区切った方法と一致します-print0)。

while ループにより、read一致するファイル名ごとに「file」に値が繰り返し割り当てられます。 およびdodone、while ループの標準の bash 構文の一部です。

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

この場合、「コマンドを実行する」は またはffmpegですneroAacEnc。いずれの場合も、入力ファイル (つまり$file) は で割り当てた「ファイル」変数で指定されread、出力ファイル (つまり${file%wav}w4a) はこの変数の操作によって出力に別の名前を指定できます。通常、$fileまたは は${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 globstarzsh が必要です。 を使用すると、結果ファイルに関する情報を表示できます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 のサポートが含まれています。

CPU が 4 つある場合、最大 4 つのプロセスが並列に実行されます。

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

-vbr 0 が最低、-vbr 5 が最高です。

関連情報