Como faço para converter arquivos FLAC em AAC (preferencialmente VBR 320k +)?

12

Eu apoio meus CDs no FLAC e depois transcodifico para arquivos AAC (.m4a) para portabilidade no meu telefone Android e no iPhone da esposa. Eu estava usando XLD no Mac e ele faz um ótimo trabalho, mas prefiro não roubar o Mac dela para fazer isso e ser capaz de fazê-lo na minha própria caixa Debian. Os seguintes trabalhos:

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

Mas o seguinte não funciona (bem, mas ignora os 320 em qualidade de áudio e resultados como os mesmos acima):

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

Eu encontrei outros comandos online, como "ffmpeg", mas aparentemente a maioria ou todos eles são depreciados em favor do método avconv acima. Qualquer ajuda seria muito apreciada! Eu poderia viver com 320 Kbps se não fosse o VBR verdadeiro, mas o LC VBR de pelo menos 320 seria o melhor.

estático
fonte
Devo salientar que, sem especificar, recebo um arquivo com 192K de qualidade e, embora a página de manual do avconv diga que você pode especificar a qualidade do áudio com -aq, não há diferença no arquivo resultante. Eu recebo uma falha de segmentação se adicionar um 'k' ao 320.
static
Se 320k + for bom para você, você pode estar realmente mais seguro usando o WavPack (modo híbrido) (é reproduzível no Android em software de terceiros, por exemplo, em deadbeef). Ele usa um método completamente diferente para compactação, que não possui transformações com perdas obrigatórias, e a única compensação é a quantidade de ruído de quantização versus taxa de bits, artefatos engraçados são impossíveis. Eu sugiro pelo menos tentar. O iPhone pode ser o problema aqui, no entanto: /
Nome para exibição

Respostas:

16

Antes de tudo, -aqdefine uma taxa de bits variável baseada na qualidade - acho que você está procurando -ab(note que eu sou um usuário ffmpeg, portanto, meu conhecimento da sintaxe avconv é limitado - não faço ideia de quão longe ela foi desde o garfo).

Independentemente disso, o codificador AAC avconv / ffmpeg embutido é muito ruim.

fdk_aac

O único codificador AAC realmente bom para avconv / ffmpeg é libfdk_aac - mas a licença é incompatível com a GPL, portanto, para ter acesso a ele, você precisará compilar o seu próprio (esse é um guia de compilação do ffmpeg, já que eu não conheço um para o avconv - o guia Ubuntu deve ser bom para o Debian, já que não acho que exista algo específico do Ubuntu nele).

Depois de conseguir, siga o guia de codificação AAC ; Eu recomendo fortemente experimentar a -vbropção de fdk_aac - uma configuração de 3 parece transparente para mim em todos os arquivos que tentei, se você deseja um placebo com uma taxa de bits mais alta ou é um engenheiro de som, pode tentar uma configuração de 5)

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

Não é necessário -map_metadata, pois o ffmpeg transfere automaticamente os metadados (e tenho certeza de que o avconv também).

Para uma taxa de bits fixa de 320 kbit / s (sério, isso não vale a pena, o AAC obtém transparência de áudio versus o áudio do CD original em torno de 128 kbit / s fixos):

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

neroAacEnc

O codificador AAC do Nero deve ser considerado igual ao fdk_aac e qaac (Quicktime AAC). Pessoas diferentes darão opiniões diferentes sobre qual é o melhor, mas você só notará diferenças a taxas de bits muito baixas e todos concordam que todos são de alta qualidade.

neroAacEncestá disponível no site da Nero . Descompacte e coloque-o em algum lugar do seu $ PATH.

Infelizmente, neroAacEncsó pode receber áudio WAV como entrada; você pode contornar isso usando avconv ou ffmpeg como decodificador:

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

Infelizmente, isso removerá os metadados; Para transferir isso, use avprobe / ffprobe (with -show_format) para extrair e neroAacTag para inserir. Um script bash provavelmente estaria em ordem.

Veja a página HydrogenAudio no neroAacEnc : pela memória, uma -qconfiguração de 0,4 me pareceu muito boa. Você pode direcionar uma taxa de bits com -br(novamente, eu acho que isso seria como um exagero):

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

EDIT: aqui está um script para converter arquivos de áudio para m4a com o neroAacEnc e depois marcar com ffprobe e neroAacTag (requer que todos estejam em um diretório no seu $ PATH). Pode levar vários arquivos de entrada; portanto, se você o salvar como convert-to-m4a, poderá converter todos os arquivos FLAC em um diretório com

convert-to-m4a *.flac

Não se limita apenas aos arquivos FLAC; qualquer formato de áudio que seu ffmpeg / avconv possa decodificar funcionará. Você pode alterar ffprobe e ffmpeg para avprobe e 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
evilsoup
fonte
Agradeço sua resposta e tentarei o mais rápido possível e informaremos como será. Eu preferiria a primeira opção / ffmpeg, mas ffmpeg é o que me disse para usar o avconv porque é a maneira nova / preferida, eu acho. (FYI)
estático
1
@estatic, na verdade, ffmpeg e avconv são projetos ativamente desenvolvidos; o 'ffmpeg' nos repositórios Debian / Ubuntu não é o ffmpeg real, mas sim um falso fornecido pelos desenvolvedores do avconv, e essa mensagem causou muita confusão. Consulte 'Quem pode me dizer a diferença e a relação entre ffmpeg, libav e avconv?' e 'A situação do FFmpeg / Libav' .
Evilsoup
Observe também que o script aqui não tem sido extensivamente testado, pode muito bem romper com alguns metadados
evilsoup
2
"você terá que compilar o seu próprio": como a @static mencionou um Mac, achei prudente dizer que instalei o ffmpeg com libfdk_aac facilmente com o homebrew. brew install ffmpeg --with-fdk-aac. você pode obter uma lista de opções com brew info ffmpeg. Mas boa idéia para não roubar Mac de sua esposa :)
Jonathan Komar
@ macmadness86 Isso é interessante, mas acho (obviamente não sou advogado) que, como o FDK-AAC é incompatível com a licença GPL usada pelo ffmpeg, é ilegal distribuir uma versão do ffmpeg com o FDK-AAC instalado. Quem está fazendo isso por causa da cerveja caseira pode se dar ao trabalho de se incomodar.
evilsoup
6

Eu sugiro usar o FFmpeg para converter de FLAC para AAC. O FFmpeg é facilmente instalado em uma máquina Mac OS X com brew:

brew install ffmpeg

Em seguida, execute o seguinte comando para converter todos os arquivos FLAC no diretório atual em 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

E para convertê-los em MP3:

for i in *flac;do of="${i/.flac/.mp3}"; ffmpeg -i "${i}" -vn -acodec mp3 -b:a 320k -f mp3 -y "${of}";done
Scott Kidder
fonte
2
Usando flac 3.1.4, tive que usar o seguinte para conversão de 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 10/10
2

Este é o meu script que envolve ffmpeg para converter qualquer formato de áudio suportado em AAC (usando o codificador libfdk-aac, que é o codificador aac recomendado pelo ffmpeg wiki).

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

A mensagem de ajuda da linha de comando:

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
Miau
fonte
1

Resposta suplementar (à resposta de evilsoup)

Lidar

  • Todos os arquivos nos subdiretórios
  • Espaços em nomes de arquivos ( find's -print0+ xarg' s -0)
  • Mantenha os arquivos m4a recém-criados no mesmo diretório que os arquivos flac de origem (a $1partir sh -cdo argumento posicional --FILEdefinido por xarg's -I)

One-liner

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
Jonathan Komar
fonte