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