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

while ループを使用すると、read「file」に一致する各ファイル名の値が繰り返し割り当てられます。 whileループの標準bash構文の一部doです。done

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

この場合、「一部のコマンドの実行」はまたffmpegはですneroAacEnc。それぞれの場合、入力ファイル(例$file:)は私たちが割り当てた「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を使用している場合は、-vbrまたは-abではなく-aqのみをサポートします。

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よりも品質が低く、結果として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が最も高い。

関連情報