Як перейти з .flac до .mp3, використовуючи LAME & FLAC, використовуючи один термінал?


29

Тривалий час я використовував відносну незграбну техніку, яка передбачає Audacity з плагіном LAME. Я гадаю, це добре, але привабливість термінального підходу полягає в тому, що я можу бути трохи тоншим [options]і добре використовувати більш сучасні бінарні файли.

Крім того, мій MacBook зараз трохи старіє, і якщо я можу позбутися зайвого графічного інтерфейсу, тим краще.

Заздалегідь спасибі.


1
ви фактично отримаєте бали за це;)
Мортімер

Ха-ха ... Я відповів на питання, але це означає, що я не можу підтвердити свою відповідь протягом двох днів. Вибачте. Ще розгадую, як тут все працює. Дивовижний сайт. : D
boehj

Відповіді:


39

Перетворення одного файлу без збереження тегів

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3

Сценарій оболонки, який зберігає деякі теги 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

Щоб використовувати скрипт, просто збережіть його десь як ~/bin/flac2mp3і зробіть його виконуваним chmod +x ~/bin/flac2mp3.

Це перетворило б усі файли flac у папці "Музика":

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

Або трохи швидше, оскільки він викликає flac2mp3 лише один раз:

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

2
Ви повинні розмістити тут відповідь, а не посилання на текст у питанні. ІМХО, ви повинні відредагувати і питання, і відповідь, і перенести тут висновок.
lpacheco

Добре, зроблю. Вибачте.
boehj

2
${file%.flac}.mp3дивовижно! Раніше я використовував ${x:: ${#x}-3}m4aдля того, щоб змінити назву пісні з .wav на .m4a. Приємно бачити спосіб, який виглядає зовсім легше.
Джейсон Салаз

1
Схоже, є помилка у варіанті 3. Можливо, через кульгаву версію, але поточний код не каже кульгати, він повинен використовувати вхідний потік як вхідний файл, а також вихідний файл не вказаний, оскільки потік використовується, це необхідні. Для мене остаточний код: !/bin/sh file="$1" outfile=${file%.flac}.mp3 eval $(metaflac --export-tags-to - "$file" | sed "s/=\(.*\)/='\1'/") flac -cd "$file" | lame --preset standard \ --add-id3v2 --tt "$TITLE" --ta "$ARTIST" --tl "$ALBUM" \ --ty "$DATE" --tn "$TRACKNUMBER" --tg "$GENRE" \ - "$outfile"
Мехал,

Крім того, приємно створити сценарій, який робить це "знайти" речі
Mehal

10

ffmpeg за замовчуванням збереже теги (але не охоплює арт).

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

-aq 1відповідає -V 1в кульгавому. -acodec libfaacперетворив би файли в AAC:

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

Я щойно це зробив, і він сказав: `` Метадані: коментар: Обкладинка (передній) кодер: Lavc57.107.100 png `` `Пошук macOS показує обкладинку. ffmpeg 3.4.2 від заварювання.
Habbie

Тоді я зрозумів, що мій ffmpeg дуже старий. Я оновив його до 4.1.3 з тим же результатом - mp3-файли однакового розміру, з робочим обкладинкою.
Habbie

4

Я взяв те, що ви, хлопці, але потім змусив його працювати ще швидше, використовуючи xargsпаралельну роботу.

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

Тоді це сценарій зверху / 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

і ось деякі статистичні дані щодо прискорення продуктивності за допомогою паралелізму.

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

Ви можете бачити, що він також більш ефективно використовував мої процесори, у мене є Intel i7, тому 8 - це, мабуть, правильна кількість процесів.


2

Знайшов цей потік, намагаючись зробити пряме кодування MP3 з вихідних файлів FLAC. Відповідь Boehj забезпечує гідний сценарій, але я особисто вважаю за краще використовувати FFmpeg, тому це сценарій Bash, який я придумав, щоб впоратися з цим завданням. Випробуваний і чудово працює в macOS Сьєрра (10.12.2).

Умови: Ви повинні мати ffmpegі lameвже встановити на вашому Mac. Найпростіший спосіб зробити це через Homebrew. Спочатку переконайтеся, що у вас є Homebrew, встановлений так:

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

Потім запустіть цю команду для встановлення ffmpegта lame:

brew install ffmpeg lame

Після цього ви готові запустити цей сценарій. Цей скрипт шукатиме файли FLAC у каталозі, path/to/FLAC/filesале це можна змінити просто, .якщо файли FLAC знаходяться в тому самому каталозі, в якому ви запускаєте цей скрипт. Коли він буде запущений, він створить mp3/підкаталог, де будуть знаходитися всі 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

Деякі зауваження щодо речей, які я навчився “The Hard Way ™”, щоб інші могли отримати від того, що я робив по-іншому в цьому сценарії порівняно з іншими в Інтернеті.

  • Ці grepкоманди для тегів розбору ( з використанням FFprobe , який встановлюється з допомогою FFmpeg) нечутливі до регістру , використовуючи -iопцію , щоб зробити це grep -i.
  • Наступна cutкоманда обмежена діленням виводу тільки на основі першого =в імені тегу з -f 2-параметром, який робить команду cut -d '=' -f 2-. Наприклад, у Pavement є пісня під назвою "5-4 = Єдність", і якби тільки другий шматок був обраний за допомогою вирізання, цей заголовок був би усічений на "5-4".
  • Для відстеження і загальне кількість доріжок-номерів я додав додаткову трубу , sedяка позбавляється від провідних нулів: sed 's/^0*//'.
  • У подібних сценаріях в Інтернеті вихід FFmpeg - це щось подібне, -f wavі це насправді стискає вихід FFmpeg, що не має сенсу в настройках труби, де LAME збирається перекодувати його. Натомість тут встановлено вихід, -f s16le -acodec pcm_s16leякий в основному є вихідним RAW; ідеально підходить для передачі аудіо до іншого подібного процесу.
  • Щоб мати справу з виведенням RAW на LAME стороні труби, мені довелося додати -rпараметр.
  • Також зверніть увагу на --tt, --ta, --tl, --tnі --tgID3v2 тегів варіанти для LAME. Коли аудіо передається / передається з одного процесу в LAME, метадані з вихідного файлу втрачаються. Один з запропонованих варіантів, щоб отримати FFmpeg зберегти метадані в текстовий файл, встановивши параметр з , -f ffmetadata "[metadata filename here]"а потім знову запустити FFmpeg з чим - щось на зразок цього: -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1. Це працює, але врахуйте вимогу до файлу призначення. Схоже, FFmpeg імпортує метадані лише тоді, коли він може скопіювати файл, що здається дуже марним процесом. Використання FFprobe для отримання значень , а потім встановлювати їх в LAME з --tt, --ta, --tl, --tnі --tgваріанти роботи краще; всі метадані записані на місці, тому повторюваний файл повинен бути створений.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.