Làm cách nào để chuyển từ .flac sang .mp3 bằng LAME & FLAC chỉ bằng Terminal?


31

Trong một thời gian dài, tôi đã sử dụng một kỹ thuật tương đối lộn xộn liên quan đến Audacity với plugin LAME. Tôi đoán là ổn, nhưng sự hấp dẫn của phương pháp Terminal là tôi có thể tinh tế hơn một chút với tôi [options]và có lẽ sử dụng các nhị phân cập nhật hơn.

Hơn nữa, MacBook của tôi đã già đi một chút và nếu tôi có thể thoát khỏi một GUI không cần thiết, thì tốt hơn hết.

Cảm ơn trước.


1
bạn thực sự sẽ nhận được điểm khi làm điều đó;)
Mortimer

Haha ... Tôi đã trả lời câu hỏi nhưng nó nói rằng tôi không thể xác nhận câu trả lời của mình trong hai ngày. Lấy làm tiếc. Vẫn đang tìm hiểu làm thế nào mọi thứ hoạt động xung quanh đây. Trang web tuyệt vời. : D
boehj

Câu trả lời:


41

Chuyển đổi một tập tin duy nhất mà không lưu giữ các thẻ

brew install lame
flac --decode --stdout test.flac | lame --preset extreme - test.mp3
  • --decode --stdout = = -dc
  • lame - $outfile = đầu vào từ STDIN
  • --preset extreme= ~ 245 kbit / s VBR

Một tập lệnh shell bảo tồn một số thẻ 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

Để sử dụng tập lệnh, chỉ cần lưu nó ở đâu đó như thế nào ~/bin/flac2mp3và làm cho nó có thể thực thi được chmod +x ~/bin/flac2mp3.

Điều này sẽ chuyển đổi tất cả các tệp flac trong thư mục Âm nhạc của bạn:

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

Hoặc nhanh hơn một chút, vì nó chỉ gọi flac2mp3 một lần:

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

2
Bạn nên đăng câu trả lời ở đây, không phải là một tài liệu tham khảo cho văn bản trong câu hỏi. IMHO, bạn nên chỉnh sửa cả câu hỏi và câu trả lời và chuyển đến đây kết luận.
lpacheco

Được, sẽ làm. Lấy làm tiếc.
boehj

2
${file%.flac}.mp3nó thật tuyệt! Trước đây tôi đã sử dụng ${x:: ${#x}-3}m4ađể thay đổi tên tệp của bài hát từ .wav thành .m4a. Thật tuyệt vời khi thấy một cách có vẻ dễ dàng hơn một chút.
Jason Salaz

1
Có vẻ như có lỗi trong Tùy chọn 3. Có thể do phiên bản khập khiễng, nhưng mã hiện tại không cho biết nên sử dụng luồng đầu vào làm tệp đầu vào và tệp đầu ra cũng không được chỉ định, vì luồng được sử dụng, đó là cần thiết. Đối với tôi mã cuối cùng là: !/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

Ngoài ra, thật tuyệt khi tạo một tập lệnh thực hiện công cụ 'tìm' này ...
Mehal

10

ffmpeg sẽ bảo vệ các thẻ (nhưng không bao gồm nghệ thuật) theo mặc định.

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

-aq 1tương ứng với -V 1trong què. -acodec libfaacsẽ chuyển đổi các tập tin thành AAC:

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

Tôi vừa làm điều này và nó nói: `` `Siêu dữ liệu: nhận xét: Bộ mã hóa bìa (phía trước): Lavc57.107.100 png` `` công cụ tìm macOS hiển thị ảnh bìa. ffmpeg 3.4.2 từ bia.
Habbie

Sau đó tôi nhận ra ffmpeg của tôi đã rất cũ. Tôi đã nâng cấp nó lên 4.1.3 với cùng kết quả - các tệp mp3 có cùng kích thước, với ảnh bìa hoạt động.
Habbie

4

tôi đã lấy những gì các bạn có, nhưng sau đó làm cho nó chạy nhanh hơn bằng cách sử dụng xargsđể song song hóa các công việc.

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

Sau đó, đây là kịch bản từ trên / 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

và đây là một số số liệu thống kê cho việc tăng tốc hiệu suất bằng cách sử dụng song song.

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

bạn có thể thấy nó cũng sử dụng CPU của tôi hiệu quả hơn, tôi có một intel i7, vì vậy 8 có lẽ là số lượng đúng quy trình.


2

Tìm thấy chủ đề này trong khi cố gắng thực hiện mã hóa trực tiếp MP3 từ các tệp nguồn FLAC. Câu trả lời của Boehj cung cấp một tùy chọn kịch bản hợp lý, nhưng cá nhân tôi thích sử dụng FFmpeg, vì vậy đây là kịch bản Bash mà tôi nghĩ ra để xử lý tác vụ này. Đã thử nghiệm và hoạt động tuyệt vời trong macOS Sierra (10.12.2).

Yêu cầu: Bạn nên có ffmpeglameđã cài đặt trên máy Mac của mình. Cách dễ nhất để làm điều này là thông qua Homebrew. Trước tiên hãy đảm bảo bạn đã cài đặt Homebrew như thế này:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Sau đó chạy lệnh này để cài đặt ffmpeglame:

brew install ffmpeg lame

Khi đã xong, bạn đã sẵn sàng để chạy tập lệnh này. Tập lệnh này sẽ tìm các tệp FLAC trong thư mục path/to/FLAC/filesnhưng có thể thay đổi thành đơn giản .nếu các tệp FLAC nằm trong cùng thư mục mà bạn đang chạy tập lệnh này. Khi chạy, nó sẽ tạo một mp3/thư mục con trong đó tất cả các tệp MP3 sẽ ở đặt.

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

Một số lưu ý về những điều tôi đã học được cách thức Hard Hard ™ ™ để những người khác có thể đạt được từ những gì tôi đã làm khác trong kịch bản này so với những người khác trên Internet.

  • Các greplệnh để phân tích cú pháp thẻ (sử dụng FFprobe được cài đặt với FFmpeg) không phân biệt chữ hoa chữ thường bằng cách sử dụng -itùy chọn để tạo ra nó grep -i.
  • Lệnh sau đây cutđược giới hạn chỉ chia đầu ra dựa trên tên đầu tiên =trong tên thẻ với -f 2-tùy chọn tạo lệnh cut -d '=' -f 2-. Ví dụ, Pavement có một bài hát có tên là 5-4 = Unity, và nếu chỉ có đoạn thứ hai được chọn thông qua việc cắt thì tiêu đề đó sẽ bị cắt ngắn thành Chú 5-4.
  • Đối với số lượng track track và tổng số track track tôi đã thêm một đường ống bổ sung để sedloại bỏ các số 0 hàng đầu : sed 's/^0*//'.
  • Trong các tập lệnh tương tự trên Internet, đầu ra FFmpeg giống như thế -f wavvà điều đó thực sự sẽ nén đầu ra FFmpeg, điều này không có ý nghĩa gì trong thiết lập đường ống nơi LAME sẽ mã hóa lại nó. Thay vào đó, đầu ra ở đây được đặt thành -f s16le -acodec pcm_s16levề cơ bản là đầu ra RAW; hoàn hảo cho đường ống âm thanh đến một quá trình khác như thế này.
  • Để đối phó với đầu ra RAW ở phía LAME của đường ống, tôi đã phải thêm -rtùy chọn.
  • Cũng lưu ý --tt, --ta, --tl, --tn--tgtùy chọn thẻ ID3v2 cho LAME. Khi âm thanh được truyền / truyền từ một quá trình vào LAME, siêu dữ liệu từ tệp nguồn bị mất. Một tùy chọn được đề xuất là để FFmpeg lưu siêu dữ liệu vào tệp văn bản bằng cách đặt tùy chọn với -f ffmetadata "[metadata filename here]"và sau đó chạy lại FFmpeg với nội dung như sau : -i "[metadata filename here]" -map_metadata 1 -c:a copy [destination mp3 file] id3v2_version 3 -write_id3v1 1. Điều đó hoạt động, nhưng lưu ý các yêu cầu cho một tập tin đích. Có vẻ như FFmpeg chỉ nhập siêu dữ liệu khi nó có thể sao chép tệp có vẻ như là một quá trình rất lãng phí. Sử dụng FFprobe để có được giá trị và sau đó thiết lập chúng trong LAME với --tt, --ta, --tl, --tn--tgtùy chọn hoạt động tốt hơn; tất cả các siêu dữ liệu được viết tại chỗ để tập tin trùng lặp cần được tạo.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.