Chuyển đổi âm thanh không mất dữ liệu từ FLAC sang ALAC bằng ffmpeg


13

Cả ALAC và FLAC đều là các định dạng âm thanh và tệp không mất dữ liệu thường sẽ có cùng kích thước hoặc ít hơn khi được chuyển đổi từ định dạng này sang định dạng khác. Tôi sử dụng ffmpeg -i track.flac track.m4ađể chuyển đổi giữa hai định dạng này nhưng tôi nhận thấy rằng các tệp ALAC kết quả nhỏ hơn nhiều so với các định dạng ban đầu. Khi sử dụng một phần mềm chuyển đổi như MediaHuman Audio Converter, kích thước của ALAC sẽ vẫn ở cùng kích thước với FLAC, vì vậy tôi đoán rằng tôi đang thiếu một số cờ ở đây gây ra ffmpegtín hiệu giảm.


ffmpegthường cần -acodeccho bất kỳ điểm đến nào để chắc chắn rằng bạn đã hoàn thành cuộc trò chuyện. Có rất nhiều giao diện người dùng sử dụng ffmpegnhưng tôi nhận thấy nhiều người không bao gồm ALAC làm tùy chọn đầu ra.
cuồng ăn chay

Câu trả lời:


23

Ok, tôi có thể hơi nhanh để hỏi ở đây nhưng vì mục đích tham khảo trong tương lai, đây là câu trả lời:

Người ta phải chuyển cờ -acodec alacđể ffmpegchuyển đổi không mất mát giữa FLAC và ALAC:

ffmpeg -i track.flac -acodec alac track.m4a


6
Để giải thích những gì đang xảy ra ở đây: .m4a là một biến thể của Apple có định dạng tệp MP4. FFmpeg và hầu hết các s / w khác sẽ mặc định cho bộ mã hóa AAC khi xuất ra mp4hoặc m4ado đó, -acodectùy chọn express là cần thiết.
Gyan

2
Một số tệp FLAC chứa hình thu nhỏ bìa album. Bạn có thể thêm -vcodec copyđể bao gồm những người trong các tệp ALAC mới của bạn.
Sean

2

Và để chuyển đổi toàn bộ thư mục ...

Sử dụng

pushd './Music/Some Album [flac]'
bash flac-to-alac.sh 

flac-to-alac.sh:

#!/usr/bin/env bash
my_bin="$(dirname $0)/flac-to-alac-ffmpeg.sh"
find . -type f -name '*.flac' -exec "$my_bin" {} \;

flac-to-alac-ffmpeg.sh:

#!/usr/bin/env bash
set -e # fail if there's any error
set -u

my_file=$1
my_new="$(echo $(dirname "$my_file")/$(basename "$my_file" .flac).m4a)"
echo "$my_file"
ffmpeg -y -v 0 -i "$my_file" -acodec alac "$my_new"
# only gets here if the conversion didn't fail
#rm "$my_file"

Thay thế:

Tôi nghĩ rằng tôi có thể làm cho nó hoạt động trong một lệnh duy nhất, nhưng nó không thoát khỏi các ký tự đặc biệt, chẳng hạn như [.

Có vẻ như rất hứa hẹn ...

#!/usr/bin/env bash
set -e # exit immediately on error
set -u # error if a variable is misspelled

while read -r my_file; do
  # ./foo/bar.flac => ./foo/bar.m4a
  my_new="$(dirname "$my_file")/$(basename "$my_file" .flac).m4a"

  ffmpeg -i "$my_file" -acodec alac "$my_new"

  # safe because of set -e, but still do a test run
  #rm "$my_file"
done <<< "$(find . -type f -name '*.flac')"

2
Đây là một lớp lót tôi sử dụng để chuyển đổi: for i in *.flac; do echo $i; ffmpeg -i "$i" -y -v 0 -vcodec copy -acodec alac "${i%.flac}".m4a && rm -f "$i"; done
Paul Lindner

@PaulLindner Trông giống như một lựa chọn hoàn hảo cho các thư mục đơn, không có đệ quy.
CoolAJ86
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.