Знайшов цей потік, намагаючись зробити пряме кодування 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
і --tg
ID3v2 тегів варіанти для 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
варіанти роботи краще; всі метадані записані на місці, тому повторюваний файл повинен бути створений.