¿Cómo convertir todos los archivos .wav en subdirectorios a .aac usando neroAacEnc?

¿Cómo convertir todos los archivos .wav en subdirectorios a .aac usando neroAacEnc?

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

findes 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 -print0que 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 readcomando dentro del whilebucle.

El readcomando se utiliza para tomar la salida findy 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 findusando la -print0bandera).

Los bucles while hacen readque se asigne valores de forma iterativa al "archivo" para cada nombre de archivo coincidente. Los doy doneson 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 ffmpego 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 $fileo ${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.bashy 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.

información relacionada