Jak przekonwertować pliki FLAC na AAC (najlepiej VBR 320k +)?

12

Tworzę kopie zapasowe dysków CD do formatu FLAC, a następnie transkoduję do plików AAC (.m4a) w celu przeniesienia na mój telefon z Androidem i iPhone'a żony. Używałem XLD na Macu i robi to świetną robotę, ale wolałbym nie ukraść jej Maca, aby to zrobić i móc to zrobić na własnym pudełku Debiana. Następujące prace:

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

Ale poniższe nie (dobrze robi, ale ignoruje 320 dla jakości dźwięku i wyników takich samych jak powyżej):

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

Znalazłem inne polecenia online, takie jak „ffmpeg”, ale najwyraźniej większość lub wszystkie z nich są amortyzowane na rzecz powyższej metody avconv. Każda pomoc byłaby bardzo mile widziana! Mógłbym żyć z 320 Kbps, jeśli nie prawda VBR, ale LC VBR co najmniej 320 byłby najlepszy.

statyczny
źródło
Powinienem zaznaczyć, że bez określenia otrzymuję plik o rozmiarze około 192 KB i chociaż strona podręcznika dla avconv mówi, że możesz określić jakość dźwięku za pomocą -aq, nie ma różnicy w wynikowym pliku. Dostaję błąd segmentacji, jeśli dodam „k” do 320.
statyczny
Jeśli 320k + jest dla Ciebie OK, możesz być naprawdę bezpieczniejszy, korzystając z WavPack (tryb hybrydowy) (można go odtwarzać na Androidzie w oprogramowaniu innych firm, na przykład w Deadbeef). Używa zupełnie innej metody kompresji, która nie ma żadnych obowiązkowych transformacji stratnych, a jedynym kompromisem jest ilość szumu kwantyzacji w stosunku do bitrate, śmieszne artefakty są niemożliwe. Sugerowałbym przynajmniej spróbować. Problemem może być iPhone: /
Nazwa wyświetlana

Odpowiedzi:

16

Po pierwsze, -aqustawia zmienną przepływność w oparciu o jakość - myślę, że szukasz -ab(zauważ, że jestem użytkownikiem ffmpeg, więc moja wiedza na temat składni avconv jest ograniczona - nie mam pojęcia, jak daleko się posunęła) widelec).

Niezależnie od tego wbudowany koder AAC avconv / ffmpeg jest dość zły.

fdk_aac

Jedynym naprawdę dobrym koderem AAC dla avconv / ffmpeg jest libfdk_aac - ale licencja na to jest niezgodna z GPL, więc aby uzyskać do niego dostęp, musisz skompilować własny (jest to przewodnik kompilacji ffmpeg, ponieważ ja nie nie znam jednego dla avconv - przewodnik po Ubuntu powinien być odpowiedni dla Debiana, ponieważ nie sądzę, że jest tam coś specyficznego dla Ubuntu).

Gdy go zdobędziesz, postępuj zgodnie z przewodnikiem kodowania AAC ; Zdecydowanie polecam wypróbowanie -vbropcji fdk_aac - ustawienie 3 brzmi dla mnie przezroczysto we wszystkich plikach, które próbowałem, jeśli chcesz placebo o wyższej przepływności lub jesteś inżynierem dźwięku, możesz spróbować ustawienia 5

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

Nie ma -map_metadatatakiej potrzeby , ponieważ ffmpeg automatycznie przesyła metadane (i jestem pewien, że avconv też).

Dla stałej szybkości transmisji 320 kbit / s (poważnie, nie jest to tego warte, AAC osiąga przezroczystość dźwięku w porównaniu do oryginalnego audio CD przy około stałym 128 kbit / s):

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

neroAacEnc

Koder AAC Nero należy traktować na równi z fdk_aac i qaac (Quicktime AAC). Różni ludzie będą opiniować, która z nich jest lepsza, ale zauważysz różnice tylko przy bardzo niskich przepływnościach i wszyscy zgadzają się, że wszyscy są bardzo wysokiej jakości.

neroAacEncjest dostępny na stronie internetowej Nero . Rozpakuj go i umieść gdzieś w $ PATH.

Niestety neroAacEncmoże przyjmować tylko dźwięk WAV jako wejście; możesz obejść ten problem, używając avconv lub ffmpeg jako dekodera:

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

Niestety spowoduje to usunięcie metadanych; aby to przenieść, użyj avprobe / ffprobe (with -show_format), aby wyodrębnić i neroAacTag, aby wstawić. Skrypt bash prawdopodobnie byłby w porządku.

Zobacz stronę HydrogenAudio na neroAacEnc : z pamięci -qustawienie 0,4 brzmiało dla mnie świetnie. Można kierować przepływność z -br(ponownie, myślę, że to byłby sposób overkill):

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

EDYCJA: oto skrypt do konwersji plików audio do m4a za pomocą neroAacEnc, a następnie oznaczenia za pomocą ffprobe i neroAacTag (wymaga, aby wszystkie znajdowały się w katalogu w $ PATH). Może przyjmować wiele plików wejściowych, więc jeśli zapiszesz jako convert-to-m4a, możesz przekonwertować każdy plik FLAC w katalogu za pomocą

convert-to-m4a *.flac

Nie ogranicza się tylko do plików FLAC; będzie działał każdy format audio, który może zdekodować twój ffmpeg / avconv. Możesz zmienić ffprobe i ffmpeg na avprobe i 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
zła
źródło
Doceniam twoją odpowiedź i postaram się jak najszybciej poinformować cię, jak to pójdzie. Wolałbym pierwszą opcję / ffmpeg, ale ffmpeg kazało mi używać avconv, ponieważ to chyba nowy / preferowany sposób. (FYI)
statyczne
1
@static w rzeczywistości zarówno ffmpeg, jak i avconv są aktywnie rozwijanymi projektami; „ffmpeg” w repozytoriach Debian / Ubuntu nie jest prawdziwym ffmpeg, ale fałszywym dostarczonym przez programistów avconv, a ten komunikat spowodował wiele zamieszania. Zobacz „Kto może mi powiedzieć różnicę i związek między ffmpeg, libav i avconv?” oraz „Sytuacja FFmpeg / Libav” .
evilsoup
Zwróć też uwagę, że skrypt tutaj nie został gruntownie przetestowany, może zepsuć się z niektórymi metadanymi
evilsoup
2
„będziesz musiał skompilować własny”: odkąd @static wspomniał o Macu, pomyślałem, że rozsądnie jest powiedzieć, że z łatwością zainstalowałem ffmpeg z libfdk_aac z homebrew. brew install ffmpeg --with-fdk-aac. możesz uzyskać listę opcji za pomocą brew info ffmpeg. Ale dobry pomysł, aby nie ukraść Maca twojej żony :)
Jonathan Komar
@ macmadness86 To ciekawe, ale myślę (oczywiście nie jestem prawnikiem), że ponieważ FDK-AAC jest niezgodny z licencją GPL, z której korzysta ffmpeg, rozpowszechnianie wersji ffmpeg z zainstalowanym FDK-AAC jest nielegalne. Ktokolwiek robi to w domu, może potencjalnie wpaść w kłopoty.
evilsoup
6

Sugeruję użycie FFmpeg do konwersji z FLAC na AAC. FFmpeg można łatwo zainstalować na komputerze Mac OS X z funkcją brew:

brew install ffmpeg

Następnie uruchom następującą komendę, aby przekonwertować wszystkie pliki FLAC w bieżącym katalogu na 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

I przekonwertować je na 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
źródło
2
Używając flac 3.1.4 musiałem użyć następujących do konwersji 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

To jest mój skrypt owijający ffmpeg do konwersji dowolnego obsługiwanego formatu audio na AAC (za pomocą kodera libfdk-aac, który jest zalecanym koderem aac przez wiki wiki ffmpeg).

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

Komunikat pomocy w wierszu poleceń:

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
Miauczeć
źródło
1

Dodatkowa odpowiedź (do odpowiedzi evilsoup)

Poradzić sobie

  • Wszystkie pliki w podkatalogach
  • Spacje w nazwach plików ( find-print0+ xarg-0)
  • Zachowaj nowo utworzone pliki m4a w tym samym katalogu, co ich źródłowe pliki flac ( $1z sh -cargumentu pozycyjnego --FILEustawionego przez xargs -I)

Jednowarstwowa

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
źródło