如何将 FLAC 文件转换为 AAC(最好是 VBR 320k+)?

sta*_*tic 12 audio conversion flac

我将我的 CD 备份到 FLAC,然后转码为 AAC (.m4a) 文件,以便在我的 android 手机和妻子的 iPhone 上便携。我一直在 Mac 上使用 XLD,它做得很好,但我宁愿不偷她的 Mac 来做到这一点,而是能够在我自己的 Debian 机器上做到这一点。以下工作:

avconv -i "inputfile.flac" -acodec aac -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"
Run Code Online (Sandbox Code Playgroud)

但以下不是(它确实如此,但忽略了 320 的音频质量和结果与上述相同):

avconv -i "inputfile.flac" -acodec aac -aq 320 -strict experimental "outputfile.m4a" -map_metadata "inputfile.flac":"outputfile.m4a"
Run Code Online (Sandbox Code Playgroud)

我在网上找到了其他命令,例如“ffmpeg”,但显然大多数或所有命令都被贬值以支持上述 avconv 方法。任何帮助将不胜感激!如果不是真正的 VBR,我可以忍受 320 Kbps,但至少 320 的 LC VBR 会是最好的。

evi*_*oup 17

首先,-aq设置一个基于质量的可变比特率——我想你正在寻找-ab(请注意,我是一个 ffmpeg 用户,所以我对 avconv 语法的了解是有限的——我不知道自叉子)。

无论如何,内置的 avconv/ffmpeg AAC 编码器非常糟糕。

fdk_aac

avconv/ffmpeg 唯一真正好的 AAC 编码器是 libfdk_aac - 但它的许可证与 GPL 不兼容,所以为了访问它,你必须自己编译(这是一个 ffmpeg 编译指南,因为我不不知道 avconv 的一个 - Ubuntu 指南应该适用于 Debian,因为我认为那里没有任何特定于 Ubuntu 的内容)。

获得后,请遵循AAC 编码指南;我强烈建议尝试 fdk_aac 的-vbr选项 - 在我尝试过的所有文件上对我透明的 3 种声音设置,如果您想要更高比特率的安慰剂,或者您是音响工程师,您可以尝试设置5.

ffmpeg -i input.flac -c:a libfdk_aac -vbr 3 output.m4a
Run Code Online (Sandbox Code Playgroud)

不需要-map_metadata,因为 ffmpeg 会自动传输元数据(我很确定 avconv 也会)。

对于 320 kbit/s 的固定比特率(说真的,这不值得,AAC 在固定的 128 kbit/s 左右实现了与原始 CD 音频相比的音频透明度):

ffmpeg -i input.flac -c:a libfdk_aac -b:a 320k
Run Code Online (Sandbox Code Playgroud)

尼禄AacEnc

Nero 的 AAC 编码器应被视为与 fdk_aac 和 qaac(Quicktime AAC)相当。不同的人会对哪个更好给出不同的意见,但您只会在非常低的比特率下注意到任何差异,并且每个人都同意它们都是非常高质量的。

neroAacEnc从 Nero 网站获得。解压缩并将其放在 $PATH 中的某个位置。

不幸的是neroAacEnc只能将WAV音频作为输入;你可以通过使用 avconv 或 ffmpeg 作为解码器来解决这个问题:

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -q 0.4 output.m4a
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会剥离元数据;要将其转移,请使用 avprobe/ffprobe(带-show_format)提取并使用 neroAacTag 插入。一个 bash 脚本可能是有序的。

请参阅neroAacEnc 上的 HydrogenAudio页面:从记忆中,-q0.4的设置对我来说听起来很棒。您可以指定与比特率-br(同样,我认为这将是这样矫枉过正):

avconv -i input.flac -f wav - | neroAacEnc -if - -ignorelength -br 320000 output.m4a
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个脚本,用于使用 neroAacEnc 将音频文件转换为 m4a,然后使用 ffprobe 和 neroAacTag 进行标记(要求它们都在您的 $PATH 目录中)。它可以接受多个输入文件,因此如果将其另存为convert-to-m4a,则可以将目录中的每个 FLAC 文件转换为

convert-to-m4a *.flac
Run Code Online (Sandbox Code Playgroud)

它不仅限于 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
Run Code Online (Sandbox Code Playgroud)

  • @static实际上,ffmpeg和avconv都是积极开发的项目;Debian/Ubuntu 存储库中的“ffmpeg”不是真正的 ffmpeg,而是 avconv 开发人员提供的假FFmpeg,该消息引起了很多混乱。请参阅['谁能告诉我ffmpeg、libav和avconv之间的区别和关系?'](http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference-and-relation- Between-ffmpeg-libav-and-avconv)和['FFmpeg/Libav情况'](http://blog.pkh.me/p/13-the-ffmpeg-libav-situation.html)。 (2认同)
  • “你必须自己编译”:由于@static 提到了 Mac,我认为谨慎地说我用自制软件轻松安装了带有 libfdk_aac 的 ffmpeg。`brew install ffmpeg --with-fdk-aac`。您可以使用“brew info ffmpeg”获取选项列表。但最好不要偷你妻子的 Mac :) (2认同)

Sco*_*der 6

我建议使用 FFmpeg 从 FLAC 转换为 AAC。FFmpeg 可以通过 brew 轻松安装在 Mac OS X 机器上:

brew install ffmpeg
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令将当前目录下的所有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
Run Code Online (Sandbox Code Playgroud)

并将它们转换为 MP3:

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

  • 使用 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认同)

Meo*_*eow 3

这是我包装 ffmpeg 的脚本,用于将任何支持的音频格式转换为AAC(使用 libfdk-aac 编码器,这是 ffmpeg wiki 推荐的 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
Run Code Online (Sandbox Code Playgroud)

命令行帮助信息:

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
Run Code Online (Sandbox Code Playgroud)