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


12

我将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"

但是以下内容并非如此(它确实做到了,但是忽略了320的音频质量和结果与上面相同):

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

我在网上找到了其他命令,例如“ ffmpeg”,但显然大多数或全部命令已被弃用,以支持上述avconv方法。任何帮助将不胜感激!如果不是真正的VBR,我可以使用320 Kbps,但是LC VBR至少为320最好。


我应该指出,没有指定我可以获得质量约为192K的文件,尽管avconv的手册页说您可以使用-aq指定音频质量,但是生成的文件没有任何区别。我得到一个分段错误,如果我一个“K”至320加

如果320k +适合您,那么使用WavPack(混合模式)实际上可能会更安全(在第三方软件(例如Deadbeef)中的Android上可播放)。它使用完全不同的压缩方法,该方法没有任何强制性的有损变换,并且唯一的权衡是量化噪声量与比特率之间的关系,不可能产生有趣的伪像。我建议至少尝试一下。iPhone可能是这里的问题,但:/
显示名称为

Answers:


16

首先,-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

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

对于320 kbit / s的固定比特率(严重的是,这是不值得的,AAC与原始CD音频在大约128 kbit / s的固定速度下实现了音频透明性):

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

NeroAacEnc

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

不幸的是,这会删除元数据。要将其转移过来,请使用avprobe / ffprobe(带有-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开发人员提供的假冒ffmpeg,该消息引起了很多混乱。请参阅“谁能告诉我ffmpeg,libav和avconv之间的区别和关系?” “ FFmpeg / Libav情况”
evilsoup

另请注意,这里的脚本尚未经过广泛的测试,可能会破坏一些元数据
evilsoup

2
“您必须自己编译”:由于@static提到了Mac,因此我谨慎地说,我很容易通过自制软件安装了带有libfdk_aac的ffmpeg。brew install ffmpeg --with-fdk-aac。您可以使用获得选项列表brew info ffmpeg。但是,最好不要偷妻子的Mac :)
乔纳森·科马尔

@ macmadness86这很有趣,但是我认为(显然我不是律师)由于FDK-AAC与ffmpeg使用的GPL许可证不兼容,因此分发安装了FDK-AAC的ffmpeg版本实际上是非法的。谁通过自制程序这样做可能会使自己陷入麻烦。
evilsoup 2014年

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
Yannick Wurm

2

这是我的脚本包装ffmpeg,用于将任何支持的音频格式转换为AAC(使用libmpdk-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

命令行帮助消息:

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
  • 请同一目录新创建的文件的m4a作为其源FLAC文件($1sh -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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.