
Tengo una colección de música en formato .wav y me gustaría convertirla a .aac/.mp4 usando neroAacEnc.
¿Cómo hago esto? Estoy usando Arch Linux x86_64 y Xterm.
Respuesta1
Aquí hay una frase 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 avanzado y bastante popular entre muchos usuarios de Linux.
Explicación
find
es un programa que devuelve rutas a archivos que coinciden con una determinada propiedad del archivo, en este caso el nombre del archivo. Si todo lo que quisiera saber es qué archivos .wav hay en los subdirectorios de su ruta actual, haría find . -name "*.wav"
. Normalmente, esto genera cada archivo en una nueva línea. En su lugar, hace -print0
que se separen las coincidencias con un carácter nulo. Esto permite un manejo adecuado de los nombres de archivos con espacios cuando pasamos el resultado a los siguientes comandos.
El |
personaje se conoce como pipa. Le dice al shell que tome la salida del comando de la izquierda y la pase como entrada al comando de la derecha, en este caso, el read
comando dentro del while
bucle.
El read
comando se utiliza para tomar la salida find
y asignarla a una variable, "archivo". Normalmente, esto asignaría valores al "archivo" de cada palabra a la vez, pero esto -d $'\0'$
hace que las asignaciones estén delimitadas por el carácter nulo (que coincide con cómo delimitamos los archivos find
usando la -print0
bandera).
Los bucles while hacen read
que se asigne valores de forma iterativa al "archivo" para cada nombre de archivo coincidente. Los do
y done
son parte de la sintaxis estándar de bash para un bucle while:
while <something is true>; do
<run some commands>
done
En este caso, nuestro "ejecutar algún comando" es ffmpeg
o neroAacEnc
. En cada uno de los casos, el archivo de entrada (es decir, $file
) se especifica con la variable "archivo" que asignamos con read
, y el archivo de salida (es decir, ${file%wav}w4a
) es una manipulación de esta variable que nos permite especificar un nombre diferente para el producción. Normalmente $file
o ${file}
evaluaría el nombre del archivo, digamosalguna cancion.wav. Dice %
que se corte desde la derecha de la variable cualquier secuencia que coincida con los caracteres [1] a la derecha de %
(es decir, "wav"). Entonces ${file%wav}
evaluaría aalguna canción., y luego "m4a" será el nuevo final del nombre del archivo:alguna cancion.m4a.
[1] Aquí digo "caracteres" por simplicidad. La secuencia a la derecha de %
podría ser una expresión regular. Por ejemplo, si dijéramos ${file%w*v}
y la variable eraalguna canción.w1234v, también evaluaría aalguna canción..
Respuesta2
No estoy seguro de que la línea de comando cambie a neroAacEnc, pero es 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 podrías usar ffmpeg para realizar 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 script (ponga lo siguiente en un archivo)
#!/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 crear el archivo (myscript.bash), hágalo ejecutable chmod +x myscript.bash
, ejecútelo ./myscript.bash
y listo.
Referencias
-Guía de codificación FFmpeg y AAC
NOTA:Existen "recetas" adicionales para convertir .wav a .aac y obtener diferentes calidades, características, etc.
Respuesta3
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 archivos de resultados con ffmpeg -i
.
De acuerdo ahttp://ffmpeg.org/trac/ffmpeg/wiki/AACEncodingGuide, el codificador nativo (que se usó si no especificaba -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, se ejecutan hasta 4 procesos 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.