Bagaimana cara saya beralih dari .flac ke .mp3 menggunakan LAME & FLAC menggunakan Terminal saja?

31

Untuk waktu yang lama saya telah menggunakan teknik yang relatif kikuk yang melibatkan Audacity dengan plugin LAME. Saya kira ini baik-baik saja, tetapi daya tarik pendekatan Terminal adalah saya bisa sedikit lebih pintar dengan saya [options]dan mungkin menggunakan lebih banyak biner yang terkini.

Selain itu, MacBook saya sedikit menua sekarang dan jika saya bisa menyingkirkan GUI yang tidak perlu, semuanya akan lebih baik.

Terima kasih sebelumnya.

boehj
sumber
1
Anda benar-benar akan mendapatkan poin untuk melakukan itu;)
Mortimer
Haha ... Saya sudah menjawab pertanyaan tapi katanya saya tidak bisa mengkonfirmasi jawaban saya selama dua hari. Maaf. Masih mencari tahu cara kerja di sekitar sini. Situs yang luar biasa. : D
boehj

Jawaban:

41

Mengonversi satu file tanpa menyimpan tag

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

Skrip shell yang mempertahankan beberapa tag ID3

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

Untuk menggunakan skrip, cukup simpan di suatu tempat seperti ~/bin/flac2mp3dan buatlah itu dapat dieksekusi chmod +x ~/bin/flac2mp3.

Ini akan mengonversi semua file flac di folder Musik Anda:

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

Atau sedikit lebih cepat, karena hanya memanggil flac2mp3 sekali:

find ~/Music/ -name '*.flac' -print0 | xargs -0 ~/bin/flac2mp3
boehj
sumber
2
Anda harus memposting jawabannya di sini, bukan referensi ke teks dalam pertanyaan. IMHO, Anda harus mengedit pertanyaan dan jawaban dan pindah ke sini kesimpulannya.
lpacheco
OK akan ku lakukan. Maaf.
boehj
2
${file%.flac}.mp3Mengagumkan! Sebelumnya saya menggunakan ${x:: ${#x}-3}m4auntuk mengubah nama file lagu dari .wav ke .m4a. Luar biasa melihat cara yang terlihat sedikit lebih mudah.
Jason Salaz
1
Sepertinya ada bug dalam Opsi 3. Mungkin karena versi lumpuh, tetapi kode saat ini tidak memberi tahu lumpuh itu harus menggunakan input stream sebagai file input, dan juga file output tidak ditentukan, karena stream digunakan, itu adalah perlu. Bagi saya kode terakhir adalah: !/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
Juga menyenangkan untuk membuat skrip yang melakukan hal 'mencari' ini ...
Mehal
10

ffmpeg akan mempertahankan tag (tetapi tidak mencakup seni) secara default.

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

-aq 1sesuai dengan -V 1lumpuh. -acodec libfaacakan mengonversi file ke AAC:

for f in *.flac; do ffmpeg -i "$f" -acodec libfaac -aq 200 "${f%flac}m4a"; done
Lri
sumber
Saya hanya melakukan ini dan katanya: `` `Metadata: komentar: Cover (depan) encoder: Lavc57.107.100 png` `` macOS finder menunjukkan cover art. ffmpeg 3.4.2 dari minuman.
Habbie
Saya kemudian menyadari bahwa ffmpeg saya sudah sangat tua. Saya memutakhirkannya ke 4.1.3 dengan hasil yang sama - file mp3 dengan ukuran yang sama, dengan cover art yang berfungsi.
Habbie
4

saya mengambil apa yang kalian miliki, tetapi kemudian membuatnya berjalan lebih cepat dengan menggunakan xargsuntuk memparalelkan pekerjaan.

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

Maka ini adalah skrip dari atas / usr / local / bin / flac2mp3

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

dan inilah beberapa statistik untuk peningkatan kinerja menggunakan paralelisme.

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

Anda dapat melihatnya juga menggunakan CPU saya lebih efektif, saya punya intel i7, jadi 8 mungkin jumlah proses yang tepat.

Jake Plimack
sumber
2

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 ffmpegdan lamesudah 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 ffmpegdan lame:

brew install ffmpeg lame

Setelah selesai, Anda siap menjalankan skrip ini. Skrip ini akan mencari file FLAC dalam direktori path/to/FLAC/filestetapi 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 grepperintah untuk tag parsing (menggunakan FFprobe yang diinstal dengan FFmpeg) adalah case sensitif menggunakan -ipilihan untuk membuatnya grep -i.
  • cutPerintah 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 sedyang mendapat menyingkirkan nol terkemuka: sed 's/^0*//'.
  • Dalam skrip yang serupa di Internet, keluaran FFmpeg adalah sesuatu seperti itu -f wavdan 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_s16leyang 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 -ropsi.
  • Perhatikan juga --tt, --ta, --tl, --tndan --tgID3v2 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, --tndan --tgpilihan bekerja lebih baik; semua metadata dituliskan di tempat sehingga file duplikat perlu dibuat.
JakeGould
sumber