
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
find
ist 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 -print0
trennt 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 read
Befehl innerhalb der while
Schleife.
Der read
Befehl wird verwendet, um die Ausgabe zu übernehmen find
und 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, read
dass für jeden übereinstimmenden Dateinamen iterativ Werte an "file" zugewiesen werden. Die do
und done
sind 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 ffmpeg
oder 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 $file
oder ${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.bash
und 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.