Как мне конвертировать файлы FLAC в AAC (предпочтительно VBR 320k +)?


12

Я копирую свои компакт-диски в FLAC, а затем транскодирую в файлы AAC (.m4a) для мобильности на своем телефоне Android и iPhone жены. Я использовал XLD на Mac, и он отлично справляется, но я бы предпочел не красть ее 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, описанного выше. Любая помощь будет принята с благодарностью! Я мог бы жить с 320 Кбит / с, если бы не настоящий VBR, но LC VBR, по крайней мере, 320 будет лучшим.


Я должен отметить, что без указания, что я получаю файл размером около 192 КБ, и хотя на странице руководства для avconv сказано, что вы можете указать качество звука с помощью -aq, в результирующем файле нет никакой разницы. Я получаю ошибку сегментации, если я добавляю 'k' к 320.
static

Если вам подходит 320k +, вы можете быть в большей безопасности, используя WavPack (гибридный режим) (он может воспроизводиться на Android в сторонних программах, например, в deadbeef). Он использует совершенно другой метод сжатия, который не имеет обязательных преобразований с потерями, и единственным компромиссом является величина шума квантования по сравнению с битрейтом, забавные артефакты невозможны. Я бы предложил хотя бы попробовать. В этом может быть проблема с iPhone: /
Отображаемое имя

Ответы:


16

Прежде всего, -aqустанавливает переменную скорость передачи на основе качества - я думаю, что вы ищете -ab(обратите внимание, что я пользователь ffmpeg, поэтому мои знания о синтаксисе avconv ограничены - я понятия не имею, насколько далеко он дрейфует с вилка).

Несмотря на это, встроенный кодер AAC avconv / ffmpeg довольно плохой.

fdk_aac

Единственный действительно хороший кодировщик AAC для avconv / ffmpeg - это 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 кбит / с (серьезно, это того не стоит, AAC обеспечивает прозрачность звука по сравнению с исходным звуком на компакт-диске при фиксированных 128 кбит / с)

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

neroAacEnc

Кодировщик AAC Nero следует рассматривать в одном ряду с 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, вероятно, будет в порядке.

Смотрите страницу HydrogenAudio на neroAacEnc : по памяти, -qнастройка 0,4 звучит для меня замечательно. Вы можете нацелить битрейт с -br(опять же , я думаю , что это будет путь излишним):

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

РЕДАКТИРОВАТЬ: вот скрипт для преобразования аудиофайлов в m4a с помощью neroAacEnc, а затем с помощью тегов 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 являются активно развивающимися проектами; «ffmpeg» в репозиториях Debian / Ubuntu - это не настоящий ffmpeg, а поддельный, предоставленный разработчиками avconv, и это сообщение вызвало много путаницы. Смотрите «Кто может подсказать разницу между ffmpeg, libav и avconv?» и «Ситуация с FFmpeg / Libav» .
evilsoup

Также обратите внимание, что скрипт здесь не был тщательно протестирован, он может порвать с некоторыми метаданными
evilsoup

2
«Вам придется скомпилировать свой собственный»: поскольку @static упоминал Mac, я подумал, что было бы разумно сказать, что я легко установил ffmpeg с libfdk_aac с помощью homebrew. brew install ffmpeg --with-fdk-aac, Вы можете получить список вариантов с brew info ffmpeg. Но хорошая идея не воровать Mac своей жены :)
Джонатан Комар

@ macmadness86 Это интересно, но я думаю (очевидно, я не юрист), что, поскольку FDK-AAC несовместим с лицензией GPL, которую использует ffmpeg, распространять версию ffmpeg с установленным FDK-AAC незаконно. Кто бы ни делал это по сравнению с домашним пивом, он может оказаться в затруднительном положении.
evilsoup

6

Я предлагаю использовать FFmpeg для преобразования из FLAC в AAC. FFmpeg легко устанавливается на компьютер Mac OS X с помощью brew:

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
Янник Вурм

2

Это мой сценарий обёртывания ffmpeg для преобразования любого поддерживаемого аудиоформата в AAC (с использованием libfdk-aac encoder, который является рекомендуемым aac-кодировщиком для 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

Справочное сообщение командной строки:

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

Дополнительный ответ (на ответ зла)

Обрабатывать

  • Все файлы в подкаталогах
  • Пробелы в именах файлов ( find's -print0+ xarg' s -0)
  • Храните вновь созданные файлы m4a в том же каталоге, что и их исходные файлы flac ( $1из sh -cпозиционного аргумента ', --FILEустановленного в xarg' -I)

Один лайнер

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.