Come posso convertire i file FLAC in AAC (preferibilmente VBR 320k +)?


12

Eseguo il backup dei miei CD su FLAC e quindi transcodifico in file AAC (.m4a) per la portabilità sul mio telefono Android e sull'iPhone della moglie. Stavo usando XLD su Mac e fa un ottimo lavoro, ma preferirei non rubare il suo Mac per fare questo ed essere in grado di farlo sulla mia scatola Debian. Le seguenti opere:

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

Ma quanto segue non (bene lo fa, ma ignora il 320 per qualità audio e risultati come gli stessi sopra):

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

Avevo trovato altri comandi online come "ffmpeg" ma apparentemente la maggior parte o tutti sono ammortizzati a favore del metodo avconv sopra. Qualsiasi aiuto sarebbe molto apprezzato! Potrei vivere con 320 Kbps se non VBR vero, ma LC VBR di almeno 320 sarebbe il migliore.


Dovrei sottolineare che senza specificare che ottengo un file di qualità intorno a 192K, e sebbene la pagina man di avconv affermi che puoi specificare la qualità audio con -aq, non c'è differenza nel file risultante. Ottengo un errore di segmentazione se aggiungo 'k' al 320.
statico

Se 320k + è adatto a te, potresti essere effettivamente più sicuro usando WavPack (modalità ibrida) (è riproducibile su Android in software di terze parti, ad esempio in deadbeef). Utilizza un metodo completamente diverso per la compressione, che non ha trasformazioni con perdite obbligatorie e l'unico compromesso è la quantità di rumore di quantizzazione rispetto al bitrate, gli artefatti divertenti sono impossibili. Suggerirei almeno di provare. L'iPhone potrebbe essere il problema qui, tuttavia: /
Visualizza nome

Risposte:


16

Prima di tutto, -aqimposta un bit rate variabile basato sulla qualità - penso che tu stia cercando -ab(nota che sono un utente ffmpeg, quindi la mia conoscenza della sintassi avconv è limitata - non ho idea di quanto sia andato alla deriva dal forchetta).

Indipendentemente da ciò, l'encoder AAC integrato avconv / ffmpeg è piuttosto male.

fdk_aac

L'unico codificatore AAC davvero valido per avconv / ffmpeg è libfdk_aac - ma la licenza per questo è incompatibile con la GPL, quindi per accedervi dovrai compilare la tua (è una guida alla compilazione di ffmpeg, dato che ne conosco uno per avconv - la guida di Ubuntu dovrebbe andare bene per Debian, dal momento che non credo che ci sia qualcosa di specifico per Ubuntu lì dentro).

Una volta ottenuto, segui la guida alla codifica AAC ; Consiglio vivamente di provare l' -vbropzione fdk_aac : un'impostazione di 3 suona trasparente per me su tutti i file che ho provato, se vuoi un placebo con un bit rate più alto o sei un tecnico del suono, puoi provare un'impostazione di 5.

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

Non è necessario -map_metadata, poiché ffmpeg trasferirà automaticamente i metadati (e sono abbastanza sicuro che anche avconv lo farà).

Per una velocità di trasmissione fissa di 320 kbit / s (sul serio, non ne vale la pena, AAC raggiunge la trasparenza audio rispetto all'audio del CD originale a circa 128 kbit / s fissi):

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

neroaacenc

L'encoder AAC di Nero deve essere considerato alla pari con fdk_aac e qaac (Quicktime AAC). Persone diverse daranno opinioni diverse su quale sia la migliore, ma noterai solo differenze a bit rate molto bassi e tutti concordano sul fatto che sono tutti di altissima qualità.

neroAacEncè disponibile dal sito Web di Nero . Decomprimilo e mettilo da qualche parte nel tuo $ PATH.

Sfortunatamente neroAacEncpuò prendere solo audio WAV come input; puoi aggirare questo problema usando avconv o ffmpeg come decoder:

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

Sfortunatamente, questo eliminerà i metadati; per trasferirlo, usa avprobe / ffprobe (with -show_format) per estrarre e neroAacTag per inserire. Uno script bash sarebbe probabilmente in ordine.

Guarda la pagina HydrogenAudio su neroAacEnc : dalla memoria, -qun'impostazione di 0,4 mi è sembrata fantastica. È possibile indirizzare un bit rate con -br(di nuovo, credo che questo sarebbe modo eccessivo):

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

EDIT: ecco uno script per convertire i file audio in m4a con neroAacEnc, quindi taggando con ffprobe e neroAacTag (richiede che tutti siano in una directory nel tuo $ PATH). Può richiedere più file di input, quindi se lo salvi come convert-to-m4a, puoi convertire tutti i file FLAC in una directory con

convert-to-m4a *.flac

Non è limitato ai soli file FLAC; funzionerà qualsiasi formato audio decodificabile con ffmpeg / avconv. Potresti voler cambiare ffprobe e ffmpeg in 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

Apprezzo la tua risposta e proverò il prima possibile e ti farò sapere come va. Preferirei la prima opzione / ffmpeg, ma ffmpeg è ciò che mi ha detto di usare avconv perché immagino sia il modo nuovo / preferito. (FYI)
statico

1
@static attualmente, sia ffmpeg che avconv sono progetti sviluppati attivamente; il 'ffmpeg' nei repository Debian / Ubuntu non è il vero ffmpeg, ma un falso fornito dagli sviluppatori di avconv e quel messaggio ha creato molta confusione. Vedi 'Chi può dirmi la differenza e la relazione tra ffmpeg, libav e avconv?' e "La situazione FFmpeg / Libav" .
evilsoup,

Nota anche che la sceneggiatura qui non è stata ampiamente testata, potrebbe anche rompersi con alcuni metadati
evilsoup

2
"dovrai compilare il tuo": dato che @static ha menzionato un Mac, ho pensato prudentemente a dire che ho installato ffmpeg con libfdk_aac facilmente con homebrew. brew install ffmpeg --with-fdk-aac. puoi ottenere un elenco di opzioni con brew info ffmpeg. Ma buona idea non rubare il Mac di tua moglie :)
Jonathan Komar il

@ macmadness86 È interessante, ma penso (ovviamente non sono un avvocato) che dal momento che FDK-AAC è incompatibile con la licenza GPL utilizzata da ffmpeg, in realtà è illegale distribuire una versione di ffmpeg con FDK-AAC installato. Chiunque lo faccia oltre l'homebrew potrebbe potenzialmente mettersi in una situazione di disturbo.
evilsoup,

6

Suggerisco di usare FFmpeg per convertire da FLAC a AAC. FFmpeg si installa facilmente su una macchina Mac OS X con brew:

brew install ffmpeg

Quindi eseguire il comando seguente per convertire tutti i file FLAC nella directory corrente in 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 per convertirli in 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
Usando flac 3.1.4 ho dovuto usare quanto segue per la conversione 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

Questo è il mio script che avvolge ffmpeg per convertire qualsiasi formato audio supportato in AAC (usando l'encoder libfdk-aac che è l'encoder aac consigliato da 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

Il messaggio di aiuto della riga di 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

1

Risposta supplementare (alla risposta di evilsoup)

Gestire

  • Tutti i file nelle sottodirectory
  • Spazi nei nomi finddei file ( 's -print0+ xarg' s -0)
  • Mantenere i file m4a appena creati nella stessa directory in cui i file FLAC di origine ( $1da sh -c's argomento posizionale --FILEset da 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.