¿Cómo convertir todos los files .wav en subdirectorys a .aac usando neroAacEnc?

Tengo una colección de música en formatting .wav y me gustaría convertirla en .aac / .mp4 usando neroAacEnc.

¿Cómo hago esto? Estoy usando Arch Linux x86_64 y Xterm.

Aquí hay una línea rápida que puede escribir en una terminal:

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

También puedes usar ffmpeg, como sugiere @slm,

 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 

No estoy seguro de cómo se compara neroAacEnc con ffmpeg, pero sé que ffmpeg es bastante popular entre muchos usuarios de Linux.


Explicación

find es un progtwig que devuelve routes a files que coinciden con una determinada propiedad del file, en este caso el nombre del file. Si todo lo que quería saber era qué files .wav están en subdirectorys de su ruta actual, lo haría find . -name "*.wav" find . -name "*.wav" . Normalmente, esto genera cada file en una nueva línea. El -print0 hace separar las coincidencias con un carácter nulo en su lugar. Esto permite un manejo adecuado de los nombres de file con espacios cuando pasamos el resultado a los siguientes commands.

El | el personaje se conoce como una tubería. Le dice al shell que tome la salida del command de la izquierda y la pase como la input al command de la derecha, en este caso, el command de read dentro del ciclo while.

El command de read se utiliza para tomar el resultado de find y asignarlo a una variable, "file". Normalmente, esto asignaría valores para "archivar" cada palabra a la vez, pero -d $'\0'$ hace que las asignaciones sean delimitadas por el carácter nulo (haciendo coincidir cómo hemos delimitado los files en find utilizando la bandera -print0 )

Los loops while ocasionan que la read iterativamente asignada a los valores de "file" para cada nombre de file coincidente. El do y el done son parte de la syntax bash estándar para un ciclo while:

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

En este caso, nuestro "ejecutar algún command" es ffmpeg o neroAacEnc . En cada uno de los casos, el file de input (es decir, $file ) se especifica con la variable "file" que asignamos con read , y el file de salida (es decir, ${file%wav}w4a ) es una manipulación de esta variable eso nos permite especificar un nombre diferente para la salida. Normalmente $file o ${file} evaluarían el nombre del file, digamos algunos song.wav . El % dice cortar de la derecha de la variable cualquier secuencia que coincida con los caracteres [1] a la derecha del % (es decir, "wav"). Entonces, ${file%wav} evaluaría alguna canción. , y luego el "m4a" está allí para ser el nuevo final del nombre de file: alguna canción.m4a .


[1] Digo "personajes" aquí por simplicidad. La secuencia a la derecha del % podría ser una expresión regular. Por ejemplo, si dijéramos ${file%w*v} y la variable fuera alguna song.w1234v , también evaluaría alguna canción. .

No estoy seguro de que la command-line cambie a neroAacEnc, pero algo como esto:

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

O puede usar ffmpeg para hacer la conversión (no probado):

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

Como un script (ponga lo siguiente en un file)

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

Después de hacer que el file (myscript.bash) lo haga ejecutable chmod +x myscript.bash , ejecútelo ./myscript.bash , y listo.

Referencias

– Guía de encoding FFmpeg y AAC

NOTA: Existen "recetas" adicionales para convertir .wav en .aac y get diferentes cualidades, características, etc.

También usaría ffmpeg. Si usa libfaac, solo admite -aq y no -vbr o -ab:

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

** requiere bash 4.0 o superior y shopt -s globstar o zsh. Puede mostrar información sobre los files de resultados con ffmpeg -i .

De acuerdo con http://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide , el codificador nativo (que se usó si no especifiqué -c: a) es de menor calidad que libfaac, que es de menor calidad que libfdk_aac. --enable-libfdk_aac --enable-nonfree (o brew install ffmpeg --with-fdk-aac ) incluye soporte para libfdk_aac.

Si tiene 4 CPU, esto ejecuta hasta 4 processs en paralelo:

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

-vbr 0 es el más bajo, -vbr 5 es el más alto.