Transcodificación masiva .flac -> .mp3: ¿Cómo escribir un script de shell que conserve la información de la etiqueta ID3?

9

En las últimas semanas, pasé de un enfoque bastante práctico a la transcodificación .flac -> .mp3, a uno que es mucho más "configurar y olvidar".

El primer paso fue dejar de usar una interfaz gráfica de usuario (Audacity con un complemento LAME) y, en su lugar, usar el método que describí aquí .

El segundo paso fue encontrar un script de shell bash que le dijera a ese ciclo de comandos que funcionara recursivamente, permitiendo que los directorios con muchos subdirectorios que contienen archivos .flac se transcodifiquen en un solo paso. Esa respuesta fue proporcionada por un usuario en askubuntu.com.

Ahora deseo aprender cómo refinar aún más las cosas para preservar la información de la etiqueta ID3. Los métodos vinculados a los datos de etiqueta ID3 de la tira anterior, dejando el mínimo (es decir, solo queda el campo de título).

¿Alguien puede enseñarme cómo escribir un script de shell?


El script de shell se ha actualizado así:

#!/bin/bash
file="$1"
flac -cd "$file" | lame --preset fast extreme - "${file%.flac}.mp3"
id3cp "$file" "${file%.flac}.mp3"

Hacer find . -name '*.flac' -exec ~/bin/flac2mp3 '{}' \;en ~ / Desktop / stack da el siguiente resultado:

01 - Amon Tobin - Chomp Samba.flac: done         
LAME 3.98.4 64bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 19383 Hz - 19916 Hz
Encoding <stdin> to ./01 - Amon Tobin - Chomp Samba.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III VBR(q=0)
Parsing ./01 - Amon Tobin - Chomp Samba.flac: done.  Copying to ./01 - Amon Tobin - Chomp Samba.mp3: done

id3info para el .flac original y el .mp3 resultante da, respectivamente:

*** Tag information for 01 - Amon Tobin - Chomp Samba.flac

(es decir, nada);

*** Tag information for 01 - Amon Tobin - Chomp Samba.mp3
*** mp3 info
MPEG1/layer III
Bitrate: 128KBps
Frequency: 44KHz

El .flac definitivamente tiene información de etiqueta. Puedo verificar esto abriendo EasyTAG. EasyTAG se refiere a esto como 'Etiqueta FLAC Vorbis' pero 'Etiqueta ID3' para el .mp3. ¿Es este el problema?

boehj
fuente
¿Has intentado usar ffmpeg?
Hola71
No, no lo he hecho. Nunca lo usé antes en la CLI para ser honesto. Alguien me habló de este guión de Perl. Lo intentaré mañana e informaré ya que ya es tarde.
boehj

Respuestas:

7
#!/bin/sh

file="$1"
outfile=${file%.flac}.mp3

eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/")

flac -cd "$file" | lame --preset fast extreme \
        --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \
        --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \
        - "$outfile"
Kambus
fuente
Gracias Kambus! Eso prácticamente funciona. La mayoría de las etiquetas que quiero ahora están allí, después de la transcodificación: Título, Álbum, Artista, Año, Número de pista. El campo CD (1/1, 1/2, etc.) no ha cruzado, y tampoco tiene el campo para el 'Número de pista de '. Pero esto realmente no me molesta. Curiosamente, probé este script en un directorio que contiene música 'Trip Hop'. Las etiquetas se mantuvieron intactas, pero el guión cambió el género de 'Trip Hop' a 'Trip-Hop'. Así que supongo que depende de una base de datos de géneros conocidos allí. Muchas gracias una vez más por su aporte!
boehj
@pedrogent: ¡Me alegra haber podido ayudar! Puede verificar manualmente cuáles son las otras etiquetas con "metaflac --export-tags-to - file" y usarlas de la misma manera que $ TITLE y las demás, pero el problema es que no hay campos equivalentes para ellas en id3 AFAIK. Tal vez puedas ponerlos en la etiqueta de comentario. Sí, hay una lista predefinida de géneros: enlace
Kambus
Hola kambus Sí, creo que parte del problema aquí es que no hay un 'estándar' claro para los datos de etiqueta ID3. La etiqueta de comentario se interpreta de manera muy diferente de jugador a jugador (o no lo hace en absoluto). Tu guión es asombroso. Gracias de nuevo.
boehj
1

Cómo usar mp3fs para codificar en masa flac a mp3

En lugar de usar un programa para convertir archivos flac a mp3, puede usar mp3fs para presentarlos como mp3 virtuales y un programa que puede poner en cola trabajos de copia. Funciona maravillosamente bien para mí.

Descargue e instale mp3fs y ultracopiadora:

sudo apt-get install mp3fs ultracopier

Cree un par de directorios flac y mp3 para cada mp3fs que desee ejecutar. Tengo una CPU de doble núcleo, así que ejecuto dos. Si mantiene los directorios flac en la partición donde están sus archivos flac, puede moverlos rápidamente. Esa partición se llama "Almacenamiento" en mi sistema.

cd /media/Storage
mkdir mp3fs mp3fs/flac_1 mp3fs/mp3_1 mp3fs/flac_2 mp3fs/mp3_2

Puede montar los directorios desde la línea de comandos o agregándolos a /etc/fstab. También puede configurar la tasa de bits y el algoritmo de codificación de los mp3 virtuales en el momento del montaje. Quiero mp3's con una tasa de bits constante de 320 kbps, y cojo puede tomar todo el tiempo necesario para producir el mejor mp3 posible.

En la línea de comando:

mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 -o allow_other,ro
mp3fs -b 320 -oquality=0 /media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 -o allow_other,ro

Si el fusible se queja, como

fusermount: no se pudo abrir /etc/fuse.conf: permiso denegado
fusermount: la opción allow_other solo está permitida si 'user_allow_other' está configurado en etc / fuse.conf

luego descomente la user_allow_otheropción en /etc/fuse.conf, y / o hágala legible con

sudo chmod 644 /etc/fuse.conf

O de /etc/fstab:

mp3fs#/media/Storage/mp3fs/flac_1 /media/Storage/mp3fs/mp3_1 fuse user,ro,allow_other,bitrate=320,quality=0 0 0
mp3fs#/media/Storage/mp3fs/flac_2 /media/Storage/mp3fs/mp3_2 fuse user,ro,allow_other,bitrate=320,quality=0 0 0

Después de agregar los directorios a /etc/fstab, puede montarlos usando

sudo mount -a

¡Hecho! Inicie la ultracopiadora. Colocará un ícono indicador en su panel de gnomos o lo que sea que use. Haga clic en él, seleccione agregar copia. Lo hice dos veces para usar dos núcleos. Use su navegador de archivos para mover algunos flacs a flac_1. Navegue hasta el directorio mp3_1 y arrastre sus mp3 a una de las ventanas de la ultracopiadora para iniciar una cola de copia. Ultracopier le preguntará el destino de los archivos. Ahora tiene un núcleo ocupado codificando un lote de flacs a mp3.

Para usar el otro núcleo, mueva los archivos flac a flac_2 y arrastre los mp3 de mp3_2 a la segunda ventana de la ultracopiadora.

Actualización: en lugar de la ultracopiadora, ahora estoy usando MiniCopier, es un poco más fácil de usar. Ver comentarios a continuación.

Arjan Drieman
fuente
Parece que hay un error con el listado del directorio con versiones recientes de mp3fs y fusible: sourceforge.net/tracker/…
Ophidian
@Ophidian: Interesante. Ejecuté algunas pruebas en algunas máquinas con diferentes distribuciones. Los hice correr, dentro de un minuto cada uno, sin ningún error. La versión mp3fs que he estado usando es la misma, 0.30. He usado los núcleos 2.3.38, 2.3.39 y 3.0.0, libfuse versiones 2.8.4 y 2.8.6. Libfuse mencionado en los informes de errores es 2.8.5. Eso no es suficiente para concluir que el fusible es el culpable, sin embargo, podría valer la pena probar una versión diferente si tiene problemas mientras usa 2.8.5. ¿Quizás probaste mp3fs? ¿En qué núcleo y con qué libfuse? ¿Encontró algún problema?
Arjan Drieman
En lugar de la ultracopiadora, ahora estoy usando MiniCopier , es un poco más fácil de usar. Es una aplicación de Java, no requiere instalación pero necesita un JRE. Tiene un ícono de canasta y un ícono de caja. Puede arrastrar una o más fuentes desde un administrador de archivos al icono de la cesta, un directorio de destino al icono de la caja, y eso es todo lo que necesita hacer para agregar un trabajo de copia a la cola. MiniCopier tiene una pestaña separada para elementos fallidos. MiniCopier usa menos ciclos de CPU que la ultracopiadora, 1% vs 3% en mi sistema. Eso podría ahorrar 12 minutos en una cola de 10 horas ;-)
Arjan Drieman
Si desea una cola de copia basada en shell, encontré una solución en superuser . Sin ajustes, no podrá ejecutar 2 colas con él, y no estoy seguro de qué hará con los errores.
Arjan Drieman
0

id3cpno puede funcionar ya que FLAC no usa ID3; utiliza etiquetas Vorbis en su lugar.

avconvtiene una opción para mantener las etiquetas a través de la conversión. Es un poco voluble, su valor depende de la combinación de códecs , pero funciona así en su caso (versión 9.16-6):

avconv -i in.flac -map_metadata 0:g:0 out.mp3

Aplicar esto todos los archivos FLAC en una carpeta (recursivamente) es tan fácil como esto: (usando bash)

for f in */**/*.flac; do
  avconv -i "${f}" -map_metadata 0:g:0 "`echo "${f}" | sed -e s/flac$/mp3/`";
done

Tenga en cuenta que avconvutiliza cojo automáticamente; existen otras opciones para controlar la calidad y otras cosas. Verifique los man avconvdetalles.

Rafael
fuente