.wav形式の音楽のコレクションがあり、neroAacEncを使用して.aac /.mp4に変換したいと思います。
どうすればよいですか? Arch Linuxx86_64とXtermを使用しています。
ターミナルに入力できる簡単なワンライナーは次のとおりです。
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
は、代わりにnull文字で一致を分離します。これにより、出力を次のコマンドに渡すときに、スペースを含むファイル名を適切に処理できます。
|
文字はパイプと呼ばれます。シェルに、左側のコマンドの出力を取得し、それを右側のコマンド(この場合はread
ループ内のwhile
コマンド)への入力として渡すように指示します。
read
コマンドは、find
の出力を取得し、それを変数「file」に割り当てるために使用されます。通常、これは一度に各単語の「ファイル」に値を割り当てますが、-d $'\0'$
により、割り当てはヌル文字で区切られます(-print0
フラグを使用してfind
内のファイルを区切る方法と一致します)。
Whileループにより、read
は、一致するファイル名ごとに「ファイル」に値を繰り返し割り当てます。 do
とdone
は、whileループの標準のbash構文の一部です。
while <something is true>; do
<run some commands>
done
この場合、「コマンドの実行」はffmpeg
またはneroAacEnc
のいずれかです。いずれの場合も、入力ファイル(つまり、$file
)はread
で割り当てた「file」変数で指定され、出力ファイル(つまり、${file%wav}w4a
)は、この変数の操作であり、出力に別の名前を指定します。通常、$file
または${file}
は、ファイルの名前に評価されます。たとえば、some song.wavです。 %
は、変数の右側から、%
の右側の文字[1]に一致するシーケンス(つまり、「wav」)を切り取るように指示します。したがって、${file%wav}
はsome song。と評価され、「m4a」はファイル名の新しい終わりになります:いくつかのsong.m4a。
[1]簡単にするためにここでは「キャラクター」と言います。 %
の右側のシーケンスは、正規表現である可能性があります。たとえば、${file%w*v}
と言い、変数がsome song.w1234vの場合、somesongにも評価されます。 。。
私もffmpegを使います。 libfaacを使用する場合、-aqのみをサポートし、-vbrまたは-abはサポートしません。
for f in **/*.wav; do ffmpeg -i "$f" -c:a libfaac -aq 150 "${f%wav}m4a"; done
**
にはbash4.0以降とshopt -s globstar
またはzshが必要です。結果ファイルに関する情報は、ffmpeg -i
で表示できます。
http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide によると、ネイティブエンコーダー(-c:aを指定しなかった場合に使用された)は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が最低、-vbr5が最高です。
コマンドラインが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に変換し、さまざまな品質や特性などを取得するための追加の「レシピ」があります。