Yalnız Terminal'i kullanarak LAME & FLAC kullanarak .flac'dan .mp3'e nasıl geçebilirim?


31

Uzun zamandır LAME eklentisine sahip Audacity'yi içeren göreceli bir boşluk tekniği kullanıyorum. Bu iyi bir şey sanırım, ancak Terminal yaklaşımının çekiciliği kendime biraz daha ince olabilir [options]ve belki de daha güncel ikili dosyalar kullanabilirim.

Ayrıca, MacBook'um şimdi biraz yaşlanıyor ve gereksiz bir GUI'den kurtulabilirsem daha da iyi.

Şimdiden teşekkürler.


1
Aslında bunu yapmak için puan kazanacaksınız;)
Mortimer

Haha ... Soruma cevap verdim ancak iki gün boyunca cevabımı onaylayamadığımı söylüyor. Üzgünüm. Hala burada işlerin nasıl yürüdüğünü anlamaya çalışıyorum. Harika site : D
boehj

Yanıtlar:


41

Etiketleri korumadan tek bir dosyayı dönüştürme

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
  • --decode --stdout = -dc
  • lame - $outfile = STDIN'den giriş
  • --preset extreme= ~ 245 kbit / s VBR

Bazı ID3 etiketlerini koruyan bir kabuk betiği

#!/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

Komut dosyasını kullanmak için, yalnızca benzer bir yere kaydedin ~/bin/flac2mp3ve çalıştırılabilir hale getirin chmod +x ~/bin/flac2mp3.

Bu, Müzik klasörünüzdeki tüm flac dosyalarını dönüştürür:

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

Veya biraz daha hızlı, çünkü sadece bir kez flac2mp3 çağırıyor:

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

2
Cevabı buraya yazmalısınız, sorudaki metne atıfta bulunmayacaksınız. IMHO, hem soruyu hem de cevabı düzenlemeli ve sonucu buraya taşımalısınız.
lpacheco

Tamam yapacağım. Üzgünüm.
boehj

2
${file%.flac}.mp3harika! Daha önce ${x:: ${#x}-3}m4aşarkının dosya adını .wav'den .m4a'ya değiştirmek için kullanıyordum . Biraz daha kolay görünen bir yol görmek harika.
Jason Salaz

1
Seçenek 3'te bir hata var gibi görünüyor. Muhtemelen topal sürümü nedeniyle, ancak geçerli kod topalına giriş dosyası olarak girdi akışını kullanması gerektiğini söylemeli ve ayrıca çıktı dosyası belirtilmemiştir, akış kullanıldığından, gerekli. Benim için final kodu şudur:!/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

Ayrıca bu 'bul' şeyleri yapan bir komut dosyası oluşturmak güzel ...
Mehal

10

ffmpeg etiketleri varsayılan olarak koruyacaktır (kapak resmini değil).

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

-aq 1-V 1topal karşılık gelir . -acodec libfaacdosyaları AAC'ye dönüştürür:

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

Bunu daha yeni yaptım ve dedi ki: `` Meta veri: yorum: Kapak (ön) kodlayıcı: Lavc57.107.100 png macOS bulucu kapak resmini gösterir. ffmpeg 3.4.2 demlemek.
Habbie

Sonra benim ffmpegimin çok eski olduğunu fark ettim. Aynı sonuçla 4.1.3'e yükselttim - aynı boyutta mp3 dosyaları, çalışma kapağı resmiyle.
Habbie

4

sahip olduklarınızı aldım, ancak xargsişleri paralel hale getirmek için daha da hızlı çalışmasını sağladım.

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

O zaman bu yukarıdaki / usr / local / bin / flac2mp3 kodudur.

#!/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

ve paralellik kullanarak performans hızlandırması için bazı istatistikler var.

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

İşlemcilerimin daha verimli kullanıldığını görebilirsiniz, bir intel i7'm var, yani 8 muhtemelen doğru işlem sayısıdır.


2

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 ffmpegve lamezaten 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 ffmpegve 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/filesancak .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 -ibunu yapmak için bir seçenek grep -i.
  • Aşağıdaki cutkomut, çı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 wavve 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 -rseçeneği eklemek zorunda kaldım .
  • Ayrıca dikkat --tt, --ta, --tl, --tnve --tgLAME 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, --tnve --tgseçenekler daha iyi çalışır; tüm meta veriler yerinde yazıldığından, yinelenen dosyanın oluşturulması gerekir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.