¿Cómo puedo pasar de .flac a .mp3 usando LAME y FLAC usando solo el Terminal?

Durante mucho time he estado usando una técnica relativamente torpe que implica Audacity con un complemento LAME. Esto está bien, supongo, pero el atractivo del enfoque de Terminal es que puedo ser un poco más fino con mis [options] y quizás usar binarys más actualizados.

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

  • Alternativa a "luit" que está disponible a través de homebrew
  • ¿Alguien conoce un cortador .mp3 súper fácil?
  • ¿Cómo codifico los files mp4 con códec H.264 (o x264) en AVIDemux?
  • ¿Cómo puedo convertir las grabaciones de iPhone .m4a a un formatting más común y sin pérdidas?
  • reproductor de MP3 simple con carpetas
  • Comando de terminal para mover una cantidad de files que contienen corchetes a otra carpeta o papelera
  • Gracias por adelantado.

  • .profile configurado, sin post de error, pero sin cambios
  • Cómo definir alias persistentemente en Terminal
  • Ejecutar lolcat después de cada command?
  • Aplicación recién instalada (gem) a través de la terminal, ruta de acceso?
  • Asociar controller de protocolo en Mac OS X
  • OSX Bash for loop - ¿Problemas con los espacios en los nombres de las carpetas?
  • 4 Solutions collect form web for “¿Cómo puedo pasar de .flac a .mp3 usando LAME y FLAC usando solo el Terminal?”

    Convirtiendo un solo file sin conservar las tags

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

    Un script de shell que conserva algunas tags 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 usar el script, simplemente guárdelo en algún lugar como ~/bin/flac2mp3 y ~/bin/flac2mp3 ejecutable con chmod +x ~/bin/flac2mp3 .

    Esto convertiría todos los files flac en su carpeta de Música:

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

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

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

    ffmpeg preservaría las tags (pero no las portadas) por defecto.

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

    -aq 1 corresponde a -V 1 en cojo. -acodec libfaac convertiría los files a AAC:

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

    Tomé lo que ustedes tenían, pero luego lo hice funcionar 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 esta es la secuencia de commands 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 statistics para la aceleración del performance usando 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 

    se puede ver que también utilizó mis CPU de manera más efectiva, tengo un Intel i7, por lo que 8 es probablemente el número correcto de processs.

    Encontré este hilo al intentar hacer una encoding directa de MP3 desde files fuente FLAC. La respuesta de Boehj proporciona una opción de guiones decente, pero personalmente prefiero usar FFmpeg, así que este es el guión de Bash que se me ocurrió para manejar esta tarea. Probado y funciona muy bien en macOS Sierra (10.12.2).

    Perquisitos: Debería tener ffmpeg y lame ya instalados en su Mac. La forma más fácil de hacerlo es a través de Homebrew. Primero asegúrese de tener instalado Homebrew así:

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

    Luego ejecuta este command para instalar ffmpeg y lame :

     brew install ffmpeg lame 

    Una vez hecho esto, está listo para ejecutar este script. Esta secuencia de commands searchá los files FLAC en la path/to/FLAC/files del directory path/to/FLAC/files pero se puede cambiar para simplemente ser . si los files FLAC están en el mismo directory en el que está ejecutando este script. Cuando se ejecute creará un subdirectory mp3/ donde se colocarán todos los files 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 -ms --lowpass 19.7 -V 3 --vbr-new -q 0 -b 96 --scale 0.99 --athaa-sensitivity 1 - "${mp3_filepath}"; done 

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

    • Los commands grep para el análisis de tags (usando FFprobe que está instalado con FFmpeg) no distinguen entre mayúsculas y minúsculas al usar la opción -i para hacerlo grep -i .
    • El siguiente command de cut ahora se limita a dividir la salida en function del primero = en un nombre de label con la opción -f 2- que hace que el command cut -d '=' -f 2- . Por ejemplo, Pavement tiene una canción titulada "5-4 = Unity" y si solo se seleccionó el segundo fragment por corte, ese título se truncaría a "5-4".
    • Para track-and-track-numbers agregué un tubo extra a sed que elimina los ceros sed 's/^0*//' : sed 's/^0*//' .
    • En scripts similares en Internet, la salida de FFmpeg es algo así como -f wav y eso realmente comprimiría la salida de FFmpeg que no tiene sentido en una configuration de tubería donde LAME la va a recodificar. En cambio, la salida aquí se establece en -f s16le -acodec pcm_s16le que básicamente es salida RAW; perfecto para conectar el audio a otro process como este.
    • Para tratar con la salida RAW en el lado LAME de la tubería, tuve que agregar la opción -r .
    • También tenga en count las opciones de label --tt , --ta , --tl , --tn y --tg ID3v2 para LAME. Cuando el audio se transmite / canaliza de un process a LAME, los metadatos del file de origen se pierden. Una opción sugerida es get FFmpeg para save los metadatos en un file de text configurando la opción con -f ffmetadata "[metadata filename here]" y luego ejecutando FFmpeg nuevamente con 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 tenga en count el requisito de un file de destino. Parece que FFmpeg solo importa metadatos cuando puede copyr el file, lo que parece un process muy desperdiciado. Usar FFprobe para get valores y luego configurarlos en LAME con las --tt , --ta , --tl , --tn y --tg funciona mejor; todos los metadatos se escriben en su lugar para que se genere un file duplicado.
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).