¿Cómo convierto archivos FLAC a AAC (preferiblemente VBR 320k +)?

12

Respaldo mis CD en FLAC y luego los transcodifico en archivos AAC (.m4a) para poder transportarlos en mi teléfono Android y en el iPhone de la esposa. Había estado usando XLD en Mac y hace un gran trabajo, pero prefiero no robarle su Mac para hacer esto y poder hacerlo en mi propia caja de Debian. Los siguientes trabajos:

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

Pero lo siguiente no (bueno, lo hace, pero ignora el 320 para la calidad de audio y los resultados son los mismos que los anteriores):

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

Encontré otros comandos en línea, como "ffmpeg", pero aparentemente la mayoría o todos ellos se deprecian a favor del método avconv anterior. Cualquier ayuda sería muy apreciada! Podría vivir con 320 Kbps si no es cierto VBR, pero LC VBR de al menos 320 sería lo mejor.

estático
fuente
Debo señalar que, sin especificar, obtengo un archivo de alrededor de 192K de calidad, y aunque la página de manual de avconv dice que puede especificar la calidad de audio con -aq, no hay diferencia en el archivo resultante. Me sale un error de segmentación si agrego una 'k' al 320.
estático
Si 320k + está bien para usted, puede estar más seguro usando WavPack (modo híbrido) (se puede jugar en Android en software de terceros, por ejemplo en deadbeef). Utiliza un método completamente diferente para la compresión, que no tiene transformaciones con pérdidas obligatorias, y la única compensación es la cantidad de ruido de cuantificación frente a la tasa de bits, los artefactos divertidos son imposibles. Sugeriría al menos intentarlo. Sin embargo, el iPhone puede ser el problema aquí: /
Nombre para mostrar

Respuestas:

16

En primer lugar, -aqestablece una velocidad de bits variable basada en la calidad: creo que lo está buscando -ab(tenga en cuenta que soy un usuario de ffmpeg, por lo que mi conocimiento de la sintaxis de avconv es limitado; no tengo idea de cuán lejos se ha derivado desde el tenedor).

En cualquier caso, el codificador AAC avconv / ffmpeg incorporado es bastante malo.

fdk_aac

El único codificador AAC realmente bueno para avconv / ffmpeg es libfdk_aac, pero la licencia para eso es incompatible con la GPL, por lo que para obtener acceso a él tendrá que compilar el suyo (es una guía de compilación de ffmpeg, ya que no No sé uno para avconv: la guía de Ubuntu debería estar bien para Debian, ya que no creo que haya nada específico de Ubuntu allí).

Una vez que lo tenga, siga la guía de codificación AAC ; Recomiendo probar la -vbropción de fdk_aac : una configuración de 3 suena transparente para mí en todos los archivos que he probado, si desea el placebo de una tasa de bits más alta, o si es un ingeniero de sonido, puede probar una configuración de 5)

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

No es necesario -map_metadata, ya que ffmpeg transferirá metadatos automáticamente (y estoy bastante seguro de que avconv también lo hará).

Para una velocidad de bits fija de 320 kbit / s (en serio, esto no vale la pena, AAC logra la transparencia de audio frente al audio de CD original a aproximadamente 128 kbit / s fijos):

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

neroAacEnc

El codificador AAC de Nero debe considerarse a la par con fdk_aac y qaac (Quicktime AAC). Diferentes personas darán diferentes opiniones sobre cuál es mejor, pero solo notará las diferencias a tasas de bits muy bajas, y todos están de acuerdo en que todos son de muy alta calidad.

neroAacEncestá disponible en el sitio web de Nero . Descomprímalo y colóquelo en algún lugar de su $ PATH.

Lamentablemente neroAacEncsolo puede tomar audio WAV como entrada; puede solucionar esto usando avconv o ffmpeg como decodificador:

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

Desafortunadamente, esto eliminará los metadatos; para transferir eso, use avprobe / ffprobe (with -show_format) para extraer y neroAacTag para insertar. Un script bash probablemente estaría en orden.

Consulte la página de HydrogenAudio en neroAacEnc : desde la memoria, una -qconfiguración de 0.4 me pareció genial. Puede dirigirse a una velocidad de bits con -br(de nuevo, creo que esto sería así una exageración):

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

EDITAR: aquí hay un script para convertir archivos de audio a m4a con neroAacEnc, luego etiquetar con ffprobe y neroAacTag (requiere que todos estén en un directorio en su $ PATH). Puede tomar múltiples archivos de entrada, por lo que si lo guarda como convert-to-m4a, puede convertir cada archivo FLAC en un directorio con

convert-to-m4a *.flac

No se limita solo a los archivos FLAC; funcionará cualquier formato de audio que su ffmpeg / avconv pueda decodificar. Es posible que desee cambiar ffprobe y ffmpeg a avprobe y 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
maldad
fuente
Agradezco su respuesta e intentaré lo antes posible y hacerle saber cómo va. Preferiría la primera opción / ffmpeg, pero ffmpeg es lo que me dijo que usara avconv porque es la forma nueva / preferida, supongo. (FYI)
estática
1
@static en realidad, tanto ffmpeg como avconv son proyectos desarrollados activamente; el 'ffmpeg' en los repositorios de Debian / Ubuntu no es el verdadero ffmpeg, sino uno falso proporcionado por los desarrolladores de avconv, y ese mensaje ha causado mucha confusión. Consulte "¿Quién puede decirme la diferencia y la relación entre ffmpeg, libav y avconv?" y 'La situación de FFmpeg / Libav' .
evilsoup
También tenga en cuenta que el script aquí no se ha probado exhaustivamente, bien puede romper con algunos metadatos
evilsoup
2
"tendrás que compilar el tuyo": como @static mencionó una Mac, me pareció prudente decir que instalé ffmpeg con libfdk_aac fácilmente con homebrew. brew install ffmpeg --with-fdk-aac. Puede obtener una lista de opciones con brew info ffmpeg. Pero es una buena idea no robar la Mac de tu esposa :)
Jonathan Komar
@ macmadness86 Eso es interesante, pero creo (obviamente, no soy abogado) que, dado que FDK-AAC es incompatible con la licencia GPL que usa ffmpeg, en realidad es ilegal distribuir una versión de ffmpeg con FDK-AAC instalado. Quien sea que esté haciendo eso con homebrew podría potencialmente meterse en un problema.
evilsoup
6

Sugiero usar FFmpeg para convertir de FLAC a AAC. FFmpeg se instala fácilmente en una máquina Mac OS X con brew:

brew install ffmpeg

Luego ejecute el siguiente comando para convertir todos los archivos FLAC en el directorio actual a 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

Y para convertirlos a 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
fuente
2
Usando flac 3.1.4 tuve que usar lo siguiente para la conversión 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

Este es mi script que envuelve ffmpeg para convertir cualquier formato de audio compatible a AAC (usando el codificador libfdk-aac, que es el codificador aac recomendado por 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

El mensaje de ayuda de la línea 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
maullar
fuente
1

Respuesta suplementaria (a la respuesta de evilsoup)

Manejar

  • Todos los archivos en subdirectorios.
  • Espacios en nombres de archivo ( find's -print0+ xarg' s -0)
  • Mantenga los archivos m4a recién creados en el mismo directorio que sus archivos flac de origen ( $1del sh -cargumento posicional --FILEestablecido por xarg's -I)

Un trazador de líneas

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
fuente