38 votos

¿Cómo puedo pasar de .flac a .mp3 utilizando LAME y FLAC sólo con el Terminal?

Durante mucho tiempo he estado utilizando una técnica relativamente torpe que implica Audacity con un plugin LAME. Esto está bien, supongo, pero el atractivo del enfoque de la Terminal es que puedo ser un poco más fino con mi [options] y quizás utilizar binarios más actualizados.

Además, mi MacBook está envejeciendo un poco y si puedo deshacerme de una GUI innecesaria, mejor.

Gracias de antemano.

49voto

David Bar Moshe Puntos 14259

Convertir un solo archivo sin conservar las etiquetas

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
  • --decode --stdout = -dc
  • lame - $outfile = entrada desde STDIN
  • --preset extreme = ~245 kbit/s VBR

Un shell script que conserva algunas etiquetas ID3

#!/bin/bash

for f in "$@"; do
    [[ "$f" != *.flac ]] && continue
    album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
    artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
    date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
    year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
    genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
    tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

    flac --decode --stdout "$f" | lame --preset extreme --add-id3v2 --tt "$title" --ta "$artist" --tl "$album" --ty "$year" --tn "$tracknumber" --tg "$genre" - "${f%.flac}.mp3"
done

Para utilizar el script, basta con guardarlo en algún lugar como ~/bin/flac2mp3 y hacerla ejecutable con chmod +x ~/bin/flac2mp3 .

Esto convertirá todos los archivos flac de tu carpeta de música:

find ~/Music/ -name '*.flac' -exec ~/bin/flac2mp3 {} \;

O ligeramente más rápido, ya que sólo llama a flac2mp3 una vez:

find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3

14voto

Ffmpeg conservaría las etiquetas (pero no las carátulas) por defecto.

for f in *.flac; do ffmpeg -i "$f" -aq 1 "${f%flac}mp3"; done

-aq 1 corresponde a -V 1 en la cojera. -acodec libfaac convertiría los archivos a AAC:

for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done

4voto

Jake Plimack Puntos 51

Tomé lo que ustedes tenían, pero luego lo hice correr aún más rápido usando xargs para paralelizar los trabajos.

find <directory> -name '*.flac' -print0 | xargs -0 -P8 -n1  /usr/local/bin/flac2mp3

Entonces este es el script de arriba /usr/local/bin/flac2mp3

#!/usr/bin/env bash

for f in "$@"; do
  [[ "$f" != *.flac ]] && continue
  album="$(metaflac --show-tag=album "$f" | sed 's/[^=]*=//')"
  artist="$(metaflac --show-tag=artist "$f" | sed 's/[^=]*=//')"
  date="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  title="$(metaflac --show-tag=title "$f" | sed 's/[^=]*=//')"
  year="$(metaflac --show-tag=date "$f" | sed 's/[^=]*=//')"
  genre="$(metaflac --show-tag=genre "$f" | sed 's/[^=]*=//')"
  tracknumber="$(metaflac --show-tag=tracknumber "$f" | sed 's/[^=]*=//')"

  flac --decode --stdout "$f" \ 
         | lame --preset extreme \
                --add-id3v2 \
                 --tt "$title" \
                 --ta "$artist" \
                 --tl "$album" \
                 --ty "$year" \
                 --tn "$tracknumber" \
                 --tg "$genre" \
                 - "${f%.flac}.mp3"
done

y aquí hay algunas estadísticas para el aumento de la velocidad de rendimiento utilizando el paralelismo.

find <dirOfFlac24s> -name '*.flac -print0 | xargs -0 -P8 -n1 /usr/local/bin/flac2mp320  

0.00s user 0.00s system 60% cpu 0.002 total
115.94s user 1.40s system 359% cpu 32.655 total

time /usr/local/bin/flac2mp320 <dirOfFlac24s>/*.flac
96.63s user 1.46s system 109% cpu 1:29.98 total

puedes ver que también utilizó mis CPUs más efectivamente, tengo un intel i7, así que 8 es probablemente el número correcto de procesos.

3voto

JakeGould Puntos 1926

Encontré este hilo mientras intentaba hacer una codificación directa de MP3 a partir de archivos fuente FLAC. Respuesta de Boehj proporciona una opción de scripting decente, pero personalmente prefiero usar FFmpeg, así que este es el Bash script que se me ocurrió para manejar esta tarea. Probado y funciona muy bien en MacOS Sierra (10.12.2).

Permisos: Deberías tener ffmpeg y lame ya instalado en tu Mac. La forma más fácil de hacerlo es a través de Homebrew. Primero asegúrate de que tienes Homebrew instalado así:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

A continuación, ejecute este comando para instalar ffmpeg y lame :

brew install ffmpeg lame

Una vez hecho esto, estás listo para ejecutar este script. Este script buscará los archivos FLAC en el directorio path/to/FLAC/files pero se puede cambiar para que sea simplemente . si los archivos FLAC están en el mismo directorio en el que está ejecutando este script. Cuando se ejecute creará un mp3/ subdirectorio donde se colocarán todos los archivos MP3.

find -E "path/to/FLAC/files" -type f -iregex ".*\.(FLAC)$" |\
  while read full_audio_filepath
  do

    # Break up the full audio filepath stuff into different directory and filename components.
    audio_dirname=$(dirname "${full_audio_filepath}");
    audio_basename=$(basename "${full_audio_filepath}");
    audio_filename="${audio_basename%.*}";
    # audio_extension="${audio_basename##*.}";

    # Set the MP3
    mp3_dirpath="${audio_dirname}/mp3";
    mp3_filepath="${mp3_dirpath}/${audio_filename}.mp3";

    # Create the child MP3 directory.
    mkdir -p "${mp3_dirpath}";

    # Get the track metadata.
    mp3_title=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TITLE= | cut -d '=' -f 2- );
    mp3_artist=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ARTIST= | cut -d '=' -f 2- );
    mp3_album=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:ALBUM= | cut -d '=' -f 2- );
    mp3_year=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:YEAR= | cut -d '=' -f 2- );
    mp3_track=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACK= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_tracktotal=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:TRACKTOTAL= | cut -d '=' -f 2- | sed 's/^0*//' );
    mp3_genre=$(ffprobe 2> /dev/null -show_format "${full_audio_filepath}" | grep -i TAG:GENRE= | cut -d '=' -f 2- );

    # Where the magic happens.
    ffmpeg -y -v quiet -nostdin -i "${full_audio_filepath}" -ar 44100 -sample_fmt s16 -ac 2 -f s16le -acodec pcm_s16le - | \
      lame --quiet --add-id3v2 --pad-id3v2 --tt "${mp3_title}" --ta "${mp3_artist}" --tl "${mp3_album}" --tn "${mp3_track}"/"${mp3_tracktotal}" --tg "${mp3_genre}" -r -m s --lowpass 19.7 -V 3 --vbr-new -q 0 -b 96 --scale 0.99 --athaa-sensitivity 1 - "${mp3_filepath}";

  done

Algunas notas sobre las cosas que aprendí "The Hard Way™" para que otros puedan beneficiarse de lo que hice de manera diferente en este script en comparación con otros en Internet.

  • El grep para el análisis sintáctico de las etiquetas (utilizando FFprobe que se instala con FFmpeg) no distinguen entre mayúsculas y minúsculas utilizando el -i opción para hacerlo grep -i .
  • Lo siguiente cut se limita ahora a dividir la salida sólo en función del primer = en un nombre de etiqueta con el -f 2- que hace que el comando cut -d '=' -f 2- . Por ejemplo, Pavimento tiene una canción titulada "5-4=Unidad" y si sólo se seleccionara el segundo trozo vía corte ese título se habría truncado a "5-4".
  • Para los números de pista -y de pista total- he añadido una tubería adicional a sed que elimina los ceros a la izquierda: sed 's/^0*//' .
  • En otros scripts scripts de Internet, la salida de FFmpeg es algo así como -f wav y eso en realidad comprimiría la salida de FFmpeg, lo que no tiene sentido en una configuración de tuberías donde LAME va a recodificarla. En lugar de eso, la salida aquí se establece en -f s16le -acodec pcm_s16le que es básicamente la salida RAW; perfecto para canalizar el audio a otro proceso como este.
  • Para hacer frente a la salida RAW en el lado LAME de la tubería, tuve que añadir el -r opción.
  • También hay que tener en cuenta el --tt , --ta , --tl , --tn y --tg Opciones de etiquetas ID3v2 para LAME. Cuando se transmite el audio desde un proceso a LAME, se pierden los metadatos del archivo de origen. Una opción sugerida es hacer que FFmpeg guarde los metadatos en un archivo de texto estableciendo la opción con -f ffmetadata "[metadata filename here]" y luego ejecutar FFmpeg de nuevo con el algo como esto: -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1 . Eso funciona, pero ten en cuenta el requisito de un archivo de destino. Parece que FFmpeg sólo importa los metadatos cuando puede copiar el archivo, lo que parece un proceso muy desperdiciado. Usando FFprobe para obtener los valores y luego establecerlos en LAME con --tt , --ta , --tl , --tn y --tg funciona mejor; todos los metadatos se escriben en su lugar, por lo que es necesario generar un archivo duplicado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X