FLACファイルをAAC(できればVBR 320k +)に変換するにはどうすればよいですか?


12

私のCDをFLACにバックアップしてから、Androidフォンと妻のiPhoneでの移植性のためにAAC(.m4a)ファイルにトランスコードします。私はMacでXLDを使用していましたが、それは素晴らしい仕事ですが、私は彼女のMacを盗んでこれを実行せず、自分のDebianボックスで実行できるようにしたくありません。次の作品:

avconv -i "inputfile.flac" -acodec aac -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"

しかし、以下はそうではありません(そうですが、オーディオ品質と上記と同じ結果の320は無視されます)。

avconv -i "inputfile.flac" -acodec aac -aq 320 -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"

「ffmpeg」などの他のコマンドをオンラインで見つけたのですが、それらのほとんどまたはすべてが、上記のavconvメソッドを優先して減価されているようです。どんな助けでも大歓迎です!私は本当のVBRでなければ320 Kbpsで生活できますが、少なくとも320のLC VBRが最適です。


指定しないと、ファイルの品質が約192Kになることを指摘しておく必要があります。avconvのマニュアルページでは、-aqを使用してオーディオ品質を指定できると記載されていますが、結果のファイルに違いはありません。私は「K」320に追加した場合、私は、セグメンテーションフォールトを取得
静的

320k +で問題がなければ、実際にはWavPack(ハイブリッドモード)を使用した方が安全な場合があります(Androidのサードパーティソフトウェア(デッドビーフなど)で再生できます)。圧縮にまったく異なる方法を使用し、必須の不可逆変換はありません。唯一のトレードオフは、量子化ノイズとビットレートの量であり、面白いアーティファクトは不可能です。少なくとも試すことをお勧めします。ただし、ここではiPhoneが問題になる可能性があります:/
表示名

回答:


16

まず-aq、品質ベースの可変ビットレートを設定します-あなたが探していると思います-ab(私はffmpegのユーザーなので、avconv構文の知識は限られていることに注意してください)。フォーク)。

とにかく、組み込みのavconv / ffmpeg AACエンコーダーはかなり悪いです。

fdk_aac

avconv / ffmpegの本当に優れたAACエンコーダーはlibfdk_aacのみですが、そのライセンスはGPLと互換性がないため、それにアクセスするには、独自コンパイルする必要があります(これはffmpegコンパイルガイドです。 avconvの1つを知らない-Ubuntu固有のものがそこにあるとは思えないので、UbuntuガイドはDebianには問題ないはずです。

入手したら、AACエンコーディングガイドに従ってください。私はfdk_aacの-vbrオプションを試すことを強くお勧めします-私が試したすべてのファイルで3つのサウンドの設定は私には透過的です、より高いビットレートのプラシーボが必要な場合、またはサウンドエンジニアの場合は、 5。

ffmpeg -i input.flac -c:a libfdk_aac -vbr 3 output.m4a

-map_metadataffmpegは自動的にメタデータを転送するため、の必要はありません(そして、avconvも確実に転送されます)。

固定ビットレート320 kbit / sの場合(真剣に、これは価値がありません。AACは、約128 kbit / sの固定で、元のCDオーディオに対してオーディオの透過性を実現します):

ffmpeg -i input.flac -c:a libfdk_aac -b:a 320k

neroAacEnc

NeroのAACエンコーダは、fdk_aacおよびqaac(Quicktime AAC)と同等であると見なされます。人によって意見の違いはありますが、ビットレートが非常に低い場合にのみ違いに気付くでしょう。そして、すべてが非常に高品質であることに誰もが同意します。

neroAacEncNeroのWebサイトから入手できます。解凍して、$ PATHのどこかに配置します。

残念ながらneroAacEnc、WAVオーディオは入力としてしか受け取ることができません。これを回避するには、デコーダーとしてavconvまたはffmpegを使用します。

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -q 0.4 output.m4a

残念ながら、これはメタデータを取り除きます。それを転送するには、avprobe / ffprobe(with -show_format)を使用して抽出し、neroAacTagを使用して挿入します。おそらくbashスクリプトが適切でしょう。

neroAacEncのHydrogenAudio ページを参照してください。メモリから-q、0.4の設定は私にとって素晴らしい音でした。あなたはしてビットレートをターゲットにすることができます-br(再び、私はこれが可能だと思う方法のやり過ぎ):

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -br 320000 output.m4a

編集:これはneroAacEncでオーディオファイルをm4aに変換し、ffprobeとneroAacTagでタグ付けするためのスクリプトです(すべて$ PATHのディレクトリにある必要があります)。複数の入力ファイルをとることができるので、それをとして保存するとconvert-to-m4a、ディレクトリ内のすべてのFLACファイルを

convert-to-m4a *.flac

FLACファイルだけに限定されません。ffmpeg / avconvがデコードできるすべてのオーディオ形式が機能します。ffprobeとffmpegをavprobeとavconvに変更することができます:

#!/usr/bin/env bash

until [[ "$1" = '' ]]; do
  ffmpeg -i "$1" -f wav - | neroAacEnc -if - -ignorelength -q 0.4 "${1%.*}.m4a"
  tags=()
  while read -r; do
    tags+=("$REPLY")
  done < <(ffprobe -i "$1" -show_format 2>/dev/null | sed -ne 's/date/year/' -e '/TAG:/s/TAG/-meta/p')
  neroAacTag "${1%.*}.m4a" "${tags[@]}"
  shift
done
exit 0

お返事をお待ちしております。できる限り早急に対応させていただきます。私は最初の/ ffmpegオプションを好みますが、ffmpegは、私が推測する新しい/推奨される方法であるため、avconvを使用するように指示したものです。(FYI)
静的

1
@static実際には、ffmpegとavconvはどちらも積極的に開発されているプロジェクトです。Debian / Ubuntuリポジトリの「ffmpeg」は本当のffmpegではありませんが、avconv開発者によって提供された偽のmpmpegであり、そのメッセージは多くの混乱を引き起こしています。「ffmpeg、libav、avconvの違いと関係を教えてくれる人はいますか?」を参照してくださいそして'FFmpeg / Libavの状況'
evilsoup 2013年

また、ここでのスクリプトは十分にテストされていないため、一部のメタデータでうまく機能しない可能性があることに注意してください
evilsoup

2
「自分でコンパイルする必要があります」:@staticがMacについて言及したので、自作のlibfdk_aacを使ってffmpegを簡単にインストールしたと言うのは賢明だと思いました。brew install ffmpeg --with-fdk-aac。でオプションのリストを取得できますbrew info ffmpeg。しかし、妻のMacを盗まない方がいいでしょう:)
Jonathan Komar 14

@ macmadness86興味深いですが、FDK-AACはffmpegが使用するGPLライセンスと互換性がないため、FDK-AACがインストールされたバージョンのffmpegを配布することは実際には違法だと思います(明らかに私は弁護士ではありません)。自作でそれをしている人は誰でも潜在的に迷惑の場所に入ることができます。
evilsoup 14

6

FFmpegを使用してFLACからAACに変換することをお勧めします。FFmpegは、brewを使用してMac OS Xマシンに簡単にインストールできます。

brew install ffmpeg

次に、次のコマンドを実行して、現在のディレクトリにあるすべてのFLACファイルをAACに変換します。

for i in *flac;do of="${i/.flac/.m4a}"; ffmpeg -i "${i}" -vn -acodec libvo_aacenc -b:a 320k -f mp4 -y "${of}";done

そしてそれらをMP3に変換するには:

for i in *flac;do of="${i/.flac/.mp3}"; ffmpeg -i "${i}" -vn -acodec mp3 -b:a 320k -f mp3 -y "${of}";done

2
:FLAC 3.1.4を使用すると、私はAAC変換のために、以下の使用していた for i in *flac;do of="${i/.flac/.m4a}"; ffmpeg -i "${i}" -vn -acodec aac -b:a 320k -f mp4 -y "${of}";done
ヤニック・ワーム

2

これは、サポートされているオーディオ形式をAACに変換するためのffmpegをラップする私のスクリプトです(ffmpeg wikiで推奨されるaacエンコーダーであるlibfdk-aacエンコーダーを使用)。

#!/usr/bin/env python2.7

from optparse import OptionParser
from subprocess import call
from os.path import splitext
import sys, os

def ffaac(filename, opts):
    cmd = ['ffmpeg', '-hide_banner', '-y', '-i', filename, 
            '-vn', '-c:a', 'libfdk_aac']
    profile = {'lc':'aac_low', 'he':'aac_he', 'he2':'aac_he_v2', 
            'ld':'aac_ld', 'eld':'aac_eld'}
    if not opts.br and not opts.vbr:
        cmd.extend(['-b:a', '320k'])
    if opts.br:
        cmd.extend(['-b:a', str(opts.br)+'k'])
    if opts.vbr:
        cmd.extend(['-vbr', opts.vbr])
    if opts.ar:
        cmd.extend(['-ar', opts.ar])
    if opts.ch:
        cmd.extend(['-ac', opts.ch])
    cmd.extend(['-profile:a', profile[opts.prof]])
    if opts.prof == 'eld' and opts.sbr:
        cmd.extend(['-eld_sbr', '1'])
    cmd.extend(['-f', 'adts'])

    if filename.lower().endswith('.aac'):
        return
    outfile = splitext(filename)[0] + '.aac'
    cmd.append(outfile)

    return call(cmd)

if __name__=='__main__':
    parser = OptionParser(sys.argv[0]+' [OPTIONS] FILE ...')
    parser.add_option('-b', metavar='NUM', type=int, dest='br', help='bitrate')
    parser.add_option('-r', metavar='NUM', choices=['8000','11025','16000','22050','32000', '44100', '48000'], dest='ar', help='sample rate: 8000/11025/22050/32000/44100/48000')
    parser.add_option('-c', metavar='NUM', choices=['1','2'],dest='ch', help='channels: 1/2')
    parser.add_option('-p', metavar='TYPE',choices=['lc', 'he', 'he2', 'ld', 'eld'], default='lc', dest='prof', help='profile: lc/he/he2/ld/eld')
    parser.add_option('-v', metavar='QUAL', choices=['1', '2', '3', '4', '5'], dest='vbr', help='vbr quality: 1/2/3/4/5')
    parser.add_option('-s', action='store_true', dest='sbr', help='use SBR for ELD')
    parser.add_option('-d', action='store_true', dest='delete',help='delete source after converting')
    opts,  args = parser.parse_args()
    for f in args:
        if ffaac(f, opts) == 0 and opts.delete :
            try:
                os.remove(f)
            except OSError:
                pass

コマンドラインヘルプメッセージ:

Usage: /Users/leon/bin/ffaac.py [OPTIONS] FILE ...

Options:
  -h, --help  show this help message and exit
  -b NUM      bitrate
  -r NUM      sample rate: 8000/11025/22050/32000/44100/48000
  -c NUM      channels: 1/2
  -p TYPE     profile: lc/he/he2/ld/eld
  -v QUAL     vbr quality: 1/2/3/4/5
  -s          use SBR for ELD
  -d          delete source after converting

1

補足回答(evilsoupの回答へ)

処理する

  • サブディレクトリ内のすべてのファイル
  • ファイル名のスペース(find's -print0+ xarg' s -0
  • (そのソースFLACファイルと同じディレクトリに新たに作成されたM4Aファイルを保管してください$1からsh -cの位置引数--FILEによってセットxargS ' -I

一発ギャグ

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.