Ffmpeg
使用 ffmpeg 從 FLAC 到 ALAC 的無損音頻轉換
ALAC 和 FLAC 都是無損音頻格式,當從一種格式轉換為另一種格式時,文件的大小通常或多或少相同。我曾經
ffmpeg -i track.flac track.m4a
在這兩種格式之間進行轉換,但我注意到生成的 ALAC 文件比原始文件小得多。當使用像 MediaHuman Audio Converter 這樣的轉換器軟體時,ALAC 的大小將與 FLAC 的大小保持一致,所以我想我在這裡遺漏了一些導致ffmpeg
信號下採樣的標誌。
好的,我可能有點快在這裡問,但為了將來參考,這裡是答案:
應該將標誌傳遞
-acodec alac
給ffmpeg
FLAC 和 ALAC 之間的無損轉換:
ffmpeg -i track.flac -acodec alac track.m4a
而對於轉換整個目錄…
用法
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"
選擇:
我以為我可以在一個命令中讓它工作,但它不會轉義特殊字元,例如
[
.看起來很有希望……
#!/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')"