web-dev-qa-db-ja.com

ffmpegを使用したFLACからALACへのロスレスオーディオ変換

ALACとFLACはどちらもロスレスオーディオ形式であり、ファイルをある形式から別の形式に変換すると、ファイルのサイズはほぼ同じになります。私が使う ffmpeg -i track.flac track.m4aこれら2つの形式間で変換しますが、生成されるALACファイルは元のファイルよりもはるかに小さいことに気づきました。 MediaHuman Audio Converterなどのコンバーターソフトウェアを使用する場合、ALACのサイズはFLACとほぼ同じサイズのままであるため、ffmpegが信号をダウンサンプリングする原因となるいくつかのフラグがないと思います。

13
DarthPaghius

わかりました、私はおそらくここで少し迅速に尋ねましたが、将来の参考のためにここに答えがあります:

フラグ-acodec alacからffmpegに変換すると、FLACとALACの間でロスレス変換が行われます。

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

22
DarthPaghius

そして、ディレクトリ全体を変換するために...

使用法

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"

代替:

これを1つのコマンドで機能させることができると思いましたが、[などの特殊文字をエスケープしません。

それはとても有望に思えた...

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