
.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」に値が繰り返し割り当てられます。 およびdo
はdone
、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
完了です。
参考文献
注記:.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 のサポートが含まれています。
CPU が 4 つある場合、最大 4 つのプロセスが並列に実行されます。
find . -name \*.wav | parallel ffmpeg -i {} -c:a libfdk_aac -vbr 4.5 {.}.m4a
-vbr 0 が最低、-vbr 5 が最高です。