Wie konvertiere ich alle WAV-Dateien in Unterverzeichnissen mit NeroAacEnc in AAC-Dateien?

Wie konvertiere ich alle WAV-Dateien in Unterverzeichnissen mit NeroAacEnc in AAC-Dateien?

Ich habe eine Musiksammlung im WAV-Format und möchte sie mit NeroAacEnc in das AAC-/MP4-Format konvertieren.

Wie mache ich das? Ich verwende Arch Linux x86_64 und Xterm.

Antwort1

Hier ist ein kurzer Einzeiler, den Sie in ein Terminal eingeben können:

find . -name "*.wav" -print0 | while read -d $'\0' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done

Sie können auch ffmpeg verwenden, wie @slm vorschlägt,

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

Ich bin nicht sicher, wie neroAacEnc im Vergleich zu ffmpeg abschneidet, aber ich weiß, dass ffmpeg bei vielen Linux-Benutzern recht beliebt ist.


Erläuterung

findist ein Programm, das Pfade zu Dateien zurückgibt, die einer bestimmten Dateieigenschaft entsprechen, in diesem Fall dem Dateinamen. Wenn Sie nur wissen möchten, welche WAV-Dateien sich in den Unterverzeichnissen Ihres aktuellen Pfads befinden, geben Sie ein find . -name "*.wav". Normalerweise gibt dies jede Datei in einer neuen Zeile aus. Das -print0trennt die Übereinstimmungen stattdessen durch ein Nullzeichen. Dies ermöglicht die korrekte Verarbeitung von Dateinamen mit Leerzeichen, wenn wir die Ausgabe an die nächsten Befehle übergeben.

Das |Zeichen wird als Pipe bezeichnet. Es weist die Shell an, die Ausgabe des linken Befehls als Eingabe an den rechten Befehl weiterzugeben, in diesem Fall den readBefehl innerhalb der whileSchleife.

Der readBefehl wird verwendet, um die Ausgabe zu übernehmen findund sie einer Variablen, „file“, zuzuweisen. Normalerweise würde dies „file“ Wort für Wort Werte zuweisen, aber dies führt dazu, dass die Zuweisungen durch das Nullzeichen abgegrenzt werden (entsprechend der Art und Weise, wie wir die Dateien mithilfe des Flags -d $'\0'$abgegrenzt haben ).find-print0

Die while-Schleifen bewirken, readdass für jeden übereinstimmenden Dateinamen iterativ Werte an "file" zugewiesen werden. Die dound donesind Teil der Standard-Bash-Syntax für eine while-Schleife:

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

In diesem Fall ist unser „Befehl ausführen“ entweder ffmpegoder neroAacEnc. In jedem der Fälle wird die Eingabedatei (also $file) mit der Variable „file“ angegeben, die wir mit zugewiesen haben read, und die Ausgabedatei (also ${file%wav}w4a) ist eine Manipulation dieser Variable, die es uns ermöglicht, einen anderen Namen für die Ausgabe anzugeben. Normalerweise würde $fileoder ${file}als Name der Datei ausgewertet, sagen wirirgendein Lied.wav. Das %besagt, dass von der rechten Seite der Variable jede Sequenz abgeschnitten werden soll, die den Buchstaben [1] rechts von %(also "wav") entspricht. Das ${file%wav}würde also zuirgendein Lied., und dann steht dort "m4a" als neues Ende des Dateinamens:irgendein Lied.m4a.


[1] Ich sage hier der Einfachheit halber "Zeichen". Die Sequenz rechts davon %könnte ein regulärer Ausdruck sein. Wenn wir beispielsweise sagen ${file%w*v}und die Variable wäreirgendein Lied.w1234v, es würde auch bewerten,irgendein Lied..

Antwort2

Ich bin mir nicht sicher, was die Befehlszeilenschalter für neroAacEnc angeht, aber es geht ungefähr so:

% 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
' {} \;

Oder Sie können die Konvertierung mit ffmpeg durchführen (ungetestet):

% 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
' {} \;

Als Skript (fügen Sie das Folgende in eine Datei ein)

#!/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
' {} \;

Nachdem Sie die Datei (myscript.bash) erstellt haben, machen Sie sie ausführbar chmod +x myscript.bash, führen Sie sie aus ./myscript.bashund fertig.

Verweise

-FFmpeg- und AAC-Kodierungshandbuch

NOTIZ:Es gibt zusätzliche „Rezepte“ zum Konvertieren von .wav in .aac und zum Erreichen unterschiedlicher Qualitäten, Eigenschaften usw.

Antwort3

Ich würde auch ffmpeg verwenden. Wenn Sie libfaac verwenden, unterstützt es nur -aq und nicht -vbr oder -ab:

for f in **/*.wav; do ffmpeg -i "$f" -c:a libfaac -aq 150 "${f%wav}m4a"; done

**erfordert bash 4.0 oder höher und shopt -s globstar/oder zsh. Sie können Informationen zu den Ergebnisdateien mit anzeigen ffmpeg -i.

Entsprechendhttp://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide, der native Encoder (der verwendet wurde, wenn ich -c:a nicht angegeben habe) hat eine geringere Qualität als libfaac, das wiederum eine geringere Qualität als libfdk_aac hat. --enable-libfdk_aac --enable-nonfree(oder brew install ffmpeg --with-fdk-aac) enthält Unterstützung für libfdk_aac.

Wenn Sie über 4 CPUs verfügen, werden bis zu 4 Prozesse parallel ausgeführt:

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

-vbr 0 ist am niedrigsten, -vbr 5 ist am höchsten.

verwandte Informationen