Konversi audio lossless dari FLAC ke ALAC menggunakan ffmpeg

13

Baik ALAC dan FLAC adalah format audio lossless dan file biasanya akan memiliki ukuran yang kurang lebih sama ketika dikonversi dari satu format ke format lainnya. Saya menggunakan ffmpeg -i track.flac track.m4auntuk mengkonversi antara dua format ini tetapi saya perhatikan bahwa file ALAC yang dihasilkan jauh lebih kecil daripada yang asli. Saat menggunakan perangkat lunak konverter seperti MediaHuman Audio Converter, ukuran ALAC akan tetap sekitar ukuran yang sama dengan FLAC jadi saya kira saya kehilangan beberapa bendera di sini yang menyebabkan ffmpegdownsample sinyal.

DarthPaghius
sumber
ffmpegumumnya perlu -acodecuntuk tujuan apa pun untuk memastikan Anda menyelesaikan percakapan dengan benar. Ada banyak ujung depan yang digunakan ffmpegtetapi saya perhatikan banyak yang tidak memasukkan ALAC sebagai opsi output.
Vegan Fanatic

Jawaban:

23

Ok, saya mungkin sedikit cepat bertanya di sini tapi demi referensi di masa depan inilah jawabannya:

Satu harus melewati bendera -acodec alacuntuk ffmpeguntuk konversi lossless FLAC antara dan ALAC:

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

DarthPaghius
sumber
6
Untuk menjelaskan apa yang terjadi di sini: .m4a adalah varian Apple dari format file MP4. FFmpeg dan kebanyakan s / w lainnya akan secara default ke encoder AAC ketika menghasilkan mp4atau m4a, maka -acodecopsi ekspres diperlukan.
Gyan
2
Beberapa file FLAC berisi thumbnail sampul album. Anda dapat menambahkan -vcodec copyuntuk memasukkannya ke file ALAC baru Anda.
Sean
2

Dan untuk mengonversi seluruh direktori ...

Pemakaian

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"

Alternatif:

Saya pikir saya bisa membuat ini bekerja dalam satu perintah, tetapi tidak luput dari karakter khusus, seperti [.

Tampaknya sangat menjanjikan ...

#!/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')"
CoolAJ86
sumber
2
Berikut ini adalah satu-liner yang saya gunakan untuk konversi: 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 Itu terlihat seperti pilihan sempurna untuk direktori tunggal, tanpa rekursi.
CoolAJ86