Làm cách nào để chuyển đổi các tệp FLAC sang AAC (tốt nhất là VBR 320k +)?


12

Tôi sao lưu các đĩa CD của mình lên FLAC và sau đó chuyển mã sang các tệp AAC (.m4a) để có thể di chuyển trên điện thoại Android và iPhone của vợ. Tôi đã sử dụng XLD trên Mac và nó hoạt động rất tốt nhưng tôi không muốn đánh cắp máy Mac của cô ấy để làm điều này và có thể làm điều đó trên hộp Debian của riêng tôi. Các công việc sau đây:

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

Nhưng những điều sau đây không (cũng vậy, nhưng bỏ qua 320 cho chất lượng âm thanh và kết quả giống như trên):

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

Tôi đã tìm thấy các lệnh khác trực tuyến như "ffmpeg" nhưng dường như hầu hết hoặc tất cả chúng đều bị phản đối vì phương pháp avconv ở trên. Mọi sự trợ giúp sẽ rất được trân trọng! Tôi có thể sống với 320 Kb / giây nếu không phải VBR thật, nhưng LC VBR ít nhất 320 sẽ là tốt nhất.


Tôi nên chỉ ra rằng không chỉ định tôi nhận được một tệp có chất lượng khoảng 192K và mặc dù trang man cho avconv nói rằng bạn có thể chỉ định chất lượng âm thanh với -aq, không có sự khác biệt nào trong tệp kết quả. Tôi gặp lỗi phân đoạn nếu tôi thêm 'k' vào 320.
tĩnh

Nếu 320k + phù hợp với bạn, bạn có thể thực sự an toàn hơn khi sử dụng WavPack (chế độ kết hợp) (có thể phát trên Android trong phần mềm của bên thứ ba, ví dụ như trong deadbeef). Nó sử dụng phương pháp hoàn toàn khác nhau để nén, không có bất kỳ biến đổi tổn thất bắt buộc nào và sự đánh đổi duy nhất là lượng nhiễu lượng tử hóa so với bitrate, các tạo tác vui nhộn là không thể. Tôi muốn đề nghị ít nhất là cố gắng. IPhone có thể là vấn đề ở đây, mặc dù: /
Tên hiển thị

Câu trả lời:


16

Trước hết, hãy -aqđặt tốc độ bit biến dựa trên chất lượng - Tôi nghĩ rằng bạn đang tìm kiếm -ab(lưu ý rằng tôi là người dùng ffmpeg, vì vậy kiến ​​thức về cú pháp avconv của tôi bị hạn chế - Tôi không biết nó đã trôi bao xa kể từ khi cái nĩa).

Bất kể, bộ mã hóa AAC avconv / ffmpeg tích hợp là khá tệ.

fdk_aac

Bộ mã hóa AAC thực sự tốt duy nhất cho avconv / ffmpeg là libfdk_aac - nhưng giấy phép cho nó không tương thích với GPL, vì vậy để có quyền truy cập vào nó, bạn sẽ phải tự biên dịch (đó là hướng dẫn biên dịch ffmpeg, vì tôi không Tôi không biết một cái cho avconv - hướng dẫn Ubuntu sẽ tốt cho Debian, vì tôi không nghĩ có gì cụ thể về Ubuntu trong đó).

Khi bạn đã có nó, hãy làm theo hướng dẫn mã hóa AAC ; Tôi thực sự khuyên bạn nên thử -vbrtùy chọn của fdk_aac - cài đặt 3 âm thanh trong suốt đối với tất cả các tệp tôi đã thử, nếu bạn muốn giả dược có tốc độ bit cao hơn hoặc bạn là kỹ sư âm thanh, bạn có thể thử cài đặt 5.

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

Không cần -map_metadata, vì ffmpeg sẽ tự động chuyển siêu dữ liệu (và tôi khá chắc chắn rằng avconv cũng sẽ như vậy).

Đối với tốc độ bit cố định 320 kbit / s (nghiêm túc, điều này không đáng, AAC đạt được độ trong suốt của âm thanh so với âm thanh CD gốc ở khoảng 128 kbit / s cố định):

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

neroAacEnc

Bộ mã hóa AAC của Nero nên được xem là ngang bằng với fdk_aac và qaac (Quicktime AAC). Những người khác nhau sẽ đưa ra những ý kiến ​​khác nhau về cái nào tốt hơn, nhưng bạn sẽ chỉ nhận thấy bất kỳ sự khác biệt nào ở tốc độ bit rất thấp và mọi người đều đồng ý rằng tất cả đều có chất lượng rất cao.

neroAacEnccó sẵn từ trang web Nero . Giải nén nó và đặt nó ở đâu đó trong $ PATH của bạn.

Thật không may, neroAacEncchỉ có thể lấy âm thanh WAV làm đầu vào; bạn có thể khắc phục điều này bằng cách sử dụng avconv hoặc ffmpeg làm bộ giải mã:

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

Thật không may, điều này sẽ loại bỏ siêu dữ liệu; để chuyển nó qua, sử dụng avprobe / ffprobe (with -show_format) để giải nén và neroAacTag để chèn. Một kịch bản bash có thể sẽ theo thứ tự.

Xem trang HydrogenAudio trên neroAacEnc : từ bộ nhớ, -qcài đặt 0,4 nghe có vẻ tuyệt vời đối với tôi. Bạn có thể nhắm mục tiêu một tỷ lệ bit với -br(một lần nữa, tôi nghĩ rằng đây sẽ là cách quá mức cần thiết):

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

EDIT: đây là tập lệnh để chuyển đổi tập tin âm thanh thành m4a bằng neroAacEnc, sau đó gắn thẻ với ffprobe và neroAacTag (yêu cầu tất cả chúng phải nằm trong một thư mục trong $ PATH của bạn). Nó có thể mất nhiều tệp đầu vào, vì vậy nếu bạn lưu nó dưới dạng convert-to-m4a, bạn có thể chuyển đổi mọi tệp FLAC trong một thư mục có

convert-to-m4a *.flac

Nó không giới hạn chỉ các tệp FLAC; bất kỳ định dạng âm thanh nào mà ffmpeg / avconv của bạn có thể giải mã sẽ hoạt động. Bạn có thể muốn thay đổi ffprobe và ffmpeg thành avprobe và 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

Tôi đánh giá cao phản hồi của bạn và sẽ cố gắng sớm nhất có thể và cho bạn biết nó diễn ra như thế nào. Tôi thích tùy chọn đầu tiên / ffmpeg, nhưng ffmpeg là thứ đã bảo tôi sử dụng avconv vì đó là cách mới / ưa thích mà tôi đoán. (FYI)
tĩnh

1
@static thực sự, cả ffmpeg và avconv đều là những dự án được phát triển tích cực; 'ffmpeg' trong kho Debian / Ubuntu không phải là ffmpeg thực, mà là giả mạo được cung cấp bởi các nhà phát triển avconv và thông điệp đó đã gây ra nhiều nhầm lẫn. Xem 'Ai có thể cho tôi biết sự khác biệt và mối quan hệ giữa ffmpeg, libav và avconv?' 'Tình huống FFmpeg / Libav' .
evilsoup

Cũng lưu ý rằng tập lệnh ở đây chưa được thử nghiệm rộng rãi, nó có thể bị
hỏng

2
"Bạn sẽ phải tự biên dịch": vì @static đã đề cập đến máy Mac, tôi nghĩ thật thận trọng khi nói rằng tôi đã cài đặt ffmpeg với libfdk_aac một cách dễ dàng với homebrew. brew install ffmpeg --with-fdk-aac. bạn có thể nhận được một danh sách các tùy chọn với brew info ffmpeg. Nhưng ý tưởng tốt nhất là không ăn cắp máy Mac của vợ bạn :)
Jonathan Komar

@ macmadness86 Điều đó thật thú vị nhưng tôi nghĩ (rõ ràng tôi không phải là luật sư) vì FDK-AAC không tương thích với giấy phép GPL mà ffmpeg sử dụng, việc phân phối phiên bản ffmpeg với FDK-AAC thực sự là bất hợp pháp. Bất cứ ai đang làm điều đó trên homebrew đều có khả năng khiến họ rơi vào tình trạng khó chịu.
evilsoup

6

Tôi đề nghị sử dụng FFmpeg để chuyển đổi từ FLAC sang AAC. FFmpeg có thể dễ dàng cài đặt trên máy Mac OS X với brew:

brew install ffmpeg

Sau đó chạy lệnh sau để chuyển đổi tất cả các tệp FLAC trong thư mục hiện tại sang 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

Và để chuyển đổi chúng sang 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
Sử dụng flac 3.1.4 Tôi đã phải sử dụng cách sau để chuyển đổi 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

Đây là tập lệnh gói ffmpeg của tôi để chuyển đổi bất kỳ định dạng âm thanh được hỗ trợ nào sang AAC (sử dụng bộ mã hóa libfdk-aac, bộ mã hóa aac được đề xuất bởi 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

Thông báo trợ giúp dòng lệnh:

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

Câu trả lời bổ sung (câu trả lời của evilsoup)

Giải quyết

  • Tất cả các tệp trong thư mục con
  • Dấu cách trong tên tệp ( find's -print0+ xarg' s -0)
  • Giữ các tệp m4a mới được tạo trong cùng thư mục với các tệp flac nguồn của chúng ( $1từ sh -cđối số vị trí --FILEđược đặt bởi xarg's -I)

Lót

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.