web-dev-qa-db-ja.com

neroAacEncを使用してサブディレクトリ内のすべての.wavファイルを.aacに変換するにはどうすればよいですか?

.wav形式の音楽のコレクションがあり、neroAacEncを使用して.aac /.mp4に変換したいと思います。

どうすればよいですか? Arch Linuxx86_64とXtermを使用しています。

5
OMGtechy

ターミナルに入力できる簡単なワンライナーは次のとおりです。

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は、一致するファイル名ごとに「ファイル」に値を繰り返し割り当てます。 dodoneは、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にも評価されます。 。

5
drs

私も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が最高です。

2
Lri

コマンドラインが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に変換し、さまざまな品質や特性などを取得するための追加の「レシピ」があります。

2
slm