Bagaimana cara mengonversi file FLAC ke AAC (lebih disukai VBR 320k +)?

12

Saya mengembalikan CD saya ke FLAC dan kemudian transcode ke file AAC (.m4a) untuk portabilitas di ponsel android saya dan iPhone milik istri. Saya telah menggunakan XLD di Mac dan itu bekerja dengan baik, tetapi saya lebih suka tidak mencuri Mac-nya untuk melakukan ini dan dapat melakukannya pada kotak Debian saya sendiri. Karya-karya berikut:

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

Tetapi hal-hal berikut tidak (ya, tetapi mengabaikan 320 untuk kualitas audio dan hasil yang sama seperti di atas):

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

Saya telah menemukan perintah lain secara daring seperti "ffmpeg" tetapi tampaknya sebagian besar atau semuanya didepresiasi untuk metode avconv di atas. Bantuan apa pun akan sangat dihargai! Saya bisa hidup dengan 320 Kbps jika VBR tidak benar, tetapi LC VBR setidaknya 320 akan menjadi yang terbaik.

statis
sumber
Saya harus menunjukkan bahwa tanpa menentukan saya mendapatkan file sekitar 192K dalam kualitas, dan meskipun halaman manual untuk avconv mengatakan Anda dapat menentukan kualitas audio dengan -aq, tidak ada perbedaan dalam file yang dihasilkan. Saya mendapatkan kesalahan segmentasi jika saya menambahkan 'k' ke 320.
statis
Jika 320k + OK untuk Anda, Anda mungkin sebenarnya lebih aman menggunakan WavPack (mode hybrid) (ini dapat dimainkan di Android dalam perangkat lunak pihak ketiga, misalnya dalam deadbeef). Ini menggunakan metode yang sama sekali berbeda untuk kompresi, yang tidak memiliki transformasi lossy wajib, dan satu-satunya trade-off adalah jumlah kebisingan kuantisasi vs bitrate, artefak lucu tidak mungkin. Saya sarankan setidaknya mencoba. IPhone mungkin menjadi masalah di sini, meskipun: /
Nama Tampilan

Jawaban:

16

Pertama-tama, -aqtetapkan bit rate variabel berbasis kualitas - Saya pikir Anda sedang mencari -ab(perhatikan bahwa saya adalah pengguna ffmpeg, jadi pengetahuan saya tentang sintaks avconv terbatas - Saya tidak tahu seberapa jauh itu telah melayang sejak garpu).

Apapun, enkoder AAC avconv / ffmpeg bawaan cukup buruk.

fdk_aac

Satu-satunya encoder AAC yang sangat bagus untuk avconv / ffmpeg adalah libfdk_aac - tetapi lisensi untuk itu tidak kompatibel dengan GPL, jadi untuk mendapatkan akses ke sana Anda harus mengkompilasi sendiri (itu adalah panduan kompilasi ffmpeg, karena saya tidak tahu satu untuk avconv - panduan Ubuntu harus baik untuk Debian, karena saya tidak berpikir ada sesuatu yang spesifik Ubuntu di sana).

Setelah Anda mendapatkannya, ikuti panduan pengkodean AAC ; Saya sangat merekomendasikan mencoba -vbropsi fdk_aac - pengaturan 3 suara transparan untuk saya pada semua file yang saya coba, jika Anda ingin plasebo bit rate yang lebih tinggi, atau Anda seorang insinyur suara, Anda dapat mencoba pengaturan 5.

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

Tidak perlu -map_metadata, karena ffmpeg akan secara otomatis mentransfer metadata (dan saya cukup yakin bahwa avconv juga akan).

Untuk bit rate tetap 320 kbit / s (serius, ini tidak sepadan, AAC mencapai transparansi audio vs audio CD asli di sekitar tetap 128 kbit / s):

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

neroAacEnc

Encoder Aero Nero harus dianggap setara dengan fdk_aac dan qaac (Quicktime AAC). Orang yang berbeda akan memberikan pendapat berbeda tentang yang mana yang lebih baik, tetapi Anda hanya akan melihat perbedaan pada tingkat bit yang sangat rendah, dan semua orang setuju bahwa mereka semua berkualitas sangat tinggi.

neroAacEnctersedia dari situs web Nero . Buka zip dan letakkan di suatu tempat di $ PATH Anda.

Sayangnya neroAacEnchanya dapat mengambil audio WAV sebagai input; Anda dapat menyiasatinya dengan menggunakan avconv atau ffmpeg sebagai dekoder:

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

Sayangnya, ini akan menghapus metadata; untuk mentransfernya, gunakan avprobe / ffprobe (with -show_format) untuk mengekstrak dan neroAacTag untuk menyisipkan. Skrip bash mungkin akan beres.

Lihat halaman HydrogenAudio di neroAacEnc : dari memori, -qpengaturan 0,4 terdengar bagus untuk saya. Anda dapat menargetkan bit rate dengan -br(sekali lagi, saya pikir ini akan menjadi cara yang berlebihan):

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

EDIT: di sini adalah skrip untuk mengkonversi file audio ke m4a dengan neroAacEnc, kemudian menandai dengan ffprobe dan neroAacTag (mengharuskan mereka semua berada di direktori di $ PATH Anda). Ini dapat mengambil banyak file input, jadi jika Anda menyimpannya convert-to-m4a, Anda dapat mengonversi setiap file FLAC dalam direktori

convert-to-m4a *.flac

Itu tidak terbatas hanya pada file FLAC; format audio apa pun yang dapat didekodekan oleh ffmpeg / avconv Anda akan berfungsi. Anda mungkin ingin mengubah ffprobe dan ffmpeg menjadi avprobe dan 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
sumber
Saya menghargai tanggapan Anda dan akan mencoba sesegera mungkin dan memberi tahu Anda bagaimana hasilnya. Saya lebih suka opsi pertama / ffmpeg, tetapi ffmpeg adalah apa yang saya perintahkan untuk menggunakan avconv karena ini adalah cara baru / pilihan yang saya kira. (FYI)
statis
1
@static sebenarnya, baik ffmpeg dan avconv adalah proyek yang dikembangkan secara aktif; 'ffmpeg' di repositori Debian / Ubuntu bukanlah ffmpeg yang asli, tetapi yang palsu yang disediakan oleh pengembang avconv, dan pesan itu telah menyebabkan banyak kebingungan. Lihat 'Siapa yang bisa memberi tahu saya perbedaan dan hubungan antara ffmpeg, libav, dan avconv?' dan 'Situasi FFmpeg / Libav' .
evilsoup
Perhatikan juga bahwa skrip di sini belum diuji secara luas, mungkin rusak dengan beberapa metadata
evilsoup
2
"Anda harus mengkompilasi sendiri": karena @static menyebutkan Mac, saya pikir lebih baik mengatakan bahwa saya menginstal ffmpeg dengan libfdk_aac dengan mudah menggunakan homebrew. brew install ffmpeg --with-fdk-aac. Anda bisa mendapatkan daftar opsi dengan brew info ffmpeg. Tapi ide bagus untuk tidak mencuri Mac istrimu :)
Jonathan Komar
@ macmadness86 Itu menarik tapi saya pikir (saya bukan pengacara, jelas) bahwa karena FDK-AAC tidak kompatibel dengan lisensi GPL yang digunakan ffmpeg, sebenarnya ilegal untuk mendistribusikan versi ffmpeg dengan FDK-AAC diinstal. Siapa pun yang melakukannya lebih dari homebrew berpotensi dapat menempatkan diri mereka ke tempat yang mengganggu.
evilsoup
6

Saya sarankan menggunakan FFmpeg untuk mengkonversi dari FLAC ke AAC. FFmpeg mudah diinstal pada mesin Mac OS X dengan minuman:

brew install ffmpeg

Kemudian jalankan perintah berikut untuk mengonversi semua file FLAC di direktori saat ini ke 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

Dan untuk mengubahnya menjadi 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
sumber
2
Menggunakan flac 3.1.4 Saya harus menggunakan yang berikut ini untuk konversi 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

Ini adalah skrip pembungkus ffmpeg saya untuk mengonversi format audio apa pun yang didukung ke AAC (menggunakan libfdk-aac encoder yang merupakan enkoder aac yang direkomendasikan oleh 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

Pesan bantuan baris perintah:

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
meong
sumber
1

Jawaban Tambahan (untuk jawaban evilsoup)

Untuk menangani

  • Semua file dalam subdirektori
  • Spasi pada nama file ( find's -print0+ xarg' s -0)
  • Jauhkan baru dibuat file m4a di direktori yang sama dengan file flac sumber mereka ( $1dari sh -c's argumen posisi --FILEset oleh xarg' s -I)

Satu garis

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
sumber