Menemukan utas ini saat mencoba melakukan pengodean langsung MP3 dari file sumber FLAC. Jawaban Boehj menyediakan opsi skrip yang layak, tetapi saya pribadi lebih suka menggunakan FFmpeg, jadi ini adalah skrip Bash yang saya buat untuk menangani tugas ini. Diuji dan berfungsi dengan baik di macOS Sierra (10.12.2).
Perquisites: Anda harus memiliki ffmpeg
dan lame
sudah diinstal pada Mac Anda. Cara termudah untuk melakukan ini adalah melalui Homebrew. Pertama, pastikan Anda memiliki Homebrew yang diinstal seperti ini:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Kemudian jalankan perintah ini untuk menginstal ffmpeg
dan lame
:
brew install ffmpeg lame
Setelah selesai, Anda siap menjalankan skrip ini. Skrip ini akan mencari file FLAC dalam direktori path/to/FLAC/files
tetapi itu dapat diubah menjadi hanya .
jika file FLAC berada di direktori yang sama Anda menjalankan skrip ini. Ketika dijalankan, skrip ini akan membuat mp3/
subdirektori di mana semua file MP3 akan berada. ditempatkan.
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
Beberapa catatan tentang hal-hal yang saya pelajari "The Hard Way â„¢" sehingga orang lain dapat memperoleh manfaat dari apa yang saya lakukan secara berbeda dalam skrip ini dibandingkan dengan yang lain di Internet.
- The
grep
perintah untuk tag parsing (menggunakan FFprobe yang diinstal dengan FFmpeg) adalah case sensitif menggunakan -i
pilihan untuk membuatnya grep -i
.
cut
Perintah berikut sekarang terbatas untuk membagi output hanya berdasarkan yang pertama =
dalam nama tag dengan -f 2-
opsi yang membuat perintah cut -d '=' -f 2-
. Misalnya, Pavement memiliki lagu berjudul "5-4 = Unity" dan jika hanya potongan kedua dipilih melalui cut, judul itu akan dipotong menjadi "5-4".
- Untuk lagu-lagu dan jumlah-angka yang saya menambahkan pipa ekstra untuk
sed
yang mendapat menyingkirkan nol terkemuka: sed 's/^0*//'
.
- Dalam skrip yang serupa di Internet, keluaran FFmpeg adalah sesuatu seperti itu
-f wav
dan yang sebenarnya akan mengompresi keluaran FFmpeg yang tidak masuk akal dalam pengaturan pipa di mana LAME akan menyandikan ulang. Alih-alih, keluaran di sini diatur -f s16le -acodec pcm_s16le
yang pada dasarnya merupakan keluaran RAW; sempurna untuk pemipaan audio ke proses lain seperti ini.
- Untuk menangani output RAW di sisi LAME dari pipa, saya harus menambahkan
-r
opsi.
- Perhatikan juga
--tt
, --ta
, --tl
, --tn
dan --tg
ID3v2 pilihan tag untuk Lame. Ketika audio dialirkan / disalurkan dari satu proses ke LAME, metadata dari file sumber hilang. Salah satu pilihan yang disarankan adalah untuk mendapatkan FFmpeg untuk menyimpan metadata ke file teks dengan menetapkan pilihan dengan -f ffmetadata "[metadata filename here]"
dan kemudian berjalan FFmpeg lagi dengan sesuatu seperti ini: -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1
. Itu berfungsi, tetapi perhatikan persyaratan untuk file tujuan. Sepertinya FFmpeg hanya mengimpor metadata ketika dapat menyalin file yang tampaknya seperti proses yang sangat boros. Menggunakan FFprobe untuk mendapatkan nilai-nilai dan kemudian menetapkan mereka di Lame dengan --tt
, --ta
, --tl
, --tn
dan --tg
pilihan bekerja lebih baik; semua metadata dituliskan di tempat sehingga file duplikat perlu dibuat.