FLAC kaynak dosyalarından doğrudan MP3 kodlama yapmaya çalışırken bu konuyu buldum. Boehj'in cevabı iyi bir betik seçeneği sunuyor, ama ben şahsen FFmpeg'i kullanmayı tercih ediyorum, bu yüzden bu görevi üstlendiğim Bash betiği bu. MacOS Sierra'da test edildi ve harika çalışıyor (10.12.2).
Ek karşılıkları: Sen olmalıdır ffmpeg
ve lame
zaten Mac yüklü. Bunu yapmanın en kolay yolu Homebrew. İlk önce Homebrew'un şu şekilde kurulu olduğundan emin olun:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Sonra yüklemek için bu komutu çalıştırın ffmpeg
ve lame
:
brew install ffmpeg lame
Bu yapıldıktan sonra bu betiği çalıştırmaya hazırsınız. Bu betik, dizindeki FLAC dosyalarını arayacaktır path/to/FLAC/files
ancak .
FLAC dosyaları bu dizini çalıştırdığınız dizinde ise basitçe değiştirilebilir . Çalıştığında mp3/
, MP3 dosyalarının tamamının bulunduğu bir alt dizin oluşturur . yerleştirdi.
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 ™” öğrendiğim şeyler hakkında bazı notlar, bu nedenle diğerleri bu betişte yaptığım şeyden, Internet'teki diğerlerine kıyasla farklı şekilde kazanabilecekler.
grep
(Kullanarak etiket ayrıştırma için komutlar FFprobe FFmpeg'den ile birlikte yüklenir) kullanarak küçük harf hassasiyetinin -i
bunu yapmak için bir seçenek grep -i
.
- Aşağıdaki
cut
komut, çıktıyı yalnızca =
etiket adındaki -f 2-
birinciye göre komutu yapan seçeneğe bölmekle sınırlıdır cut -d '=' -f 2-
. Örneğin, Pavement'in “5-4 = Birlik” başlıklı bir şarkısı var ve eğer sadece ikinci parça kesilerek seçildiyse, bu başlık “5-4” e kesilmiş olacaktı.
- Track-ve toplam iz numaraları için ben ekstra bir boru eklendi
sed
önde gelen sıfır kurtulmak aldığı: sed 's/^0*//'
.
- İnternet etrafındaki benzer komut dosyalarında, FFmpeg çıkışı benzer bir şeydir
-f wav
ve aslında LAME'in yeniden kodlayacağı bir boru kurulumunda hiçbir anlam ifade etmeyen FFmpeg çıkışını sıkıştıracaktır. Bunun yerine, buradaki çıktı -f s16le -acodec pcm_s16le
, temel olarak RAW çıktısı olarak ayarlanmıştır ; Sesi bunun gibi başka bir işleme aktarabilmek için mükemmel.
- Borunun LAME tarafındaki RAW çıkışını ele almak için
-r
seçeneği eklemek zorunda kaldım .
- Ayrıca dikkat
--tt
, --ta
, --tl
, --tn
ve --tg
LAME ID3v2 etiketleme seçenekleri. Ses bir işlemden LAME içine akıtıldığında / yayınlandığında kaynak dosyadaki meta veriler kaybolur. Bir önerilen seçenek ile seçeneğini belirleyerek bir metin dosyasına meta kaydetmek için FFmpeg elde etmektir -f ffmetadata "[metadata filename here]"
böyle bir şey ile tekrar FFmpeg çalıştıran sonra ve: -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1
. Bu işe yarar, ancak bir hedef dosya için gerekliliği not alın. Görünüşe göre FFmpeg yalnızca çok israf eden bir işlem gibi görünen dosyayı kopyalayabildiğinde meta verileri alır. Değerlerini almak için FFprobe kullanma ve daha sonra Lame onları ayarlayarak --tt
, --ta
, --tl
, --tn
ve --tg
seçenekler daha iyi çalışır; tüm meta veriler yerinde yazıldığından, yinelenen dosyanın oluşturulması gerekir.