ฉันจะแปลงไฟล์ 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 Kbps ถ้าไม่ใช่ VBR จริง แต่ LC VBR อย่างน้อย 320 จะดีที่สุด


ฉันควรชี้ให้เห็นว่าโดยไม่ระบุว่าฉันได้รับไฟล์คุณภาพประมาณ 192K และแม้ว่า man page ของ avconv จะบอกว่าคุณสามารถระบุคุณภาพเสียงด้วย -aq ได้ แต่ก็ไม่มีความแตกต่างในไฟล์ผลลัพธ์ ฉันได้รับข้อผิดพลาดการแบ่งกลุ่มถ้าฉันเพิ่ม 'k' ลงใน 320
คงที่

หาก 320k + ตกลงสำหรับคุณคุณอาจปลอดภัยกว่าการใช้ WavPack (โหมดไฮบริด) (สามารถเล่นได้บน Android ในซอฟต์แวร์ของบุคคลที่สามเช่นใน deadbeef) มันใช้วิธีการบีบอัดที่แตกต่างไปจากเดิมอย่างสิ้นเชิงซึ่งไม่มีการแปลงแบบ lossy บังคับและการแลกเปลี่ยนเพียงอย่างเดียวคือปริมาณของเสียงควอนติเซชั่นเทียบกับบิตเรต ฉันขอแนะนำให้ลองอย่างน้อย แม้ว่า iPhone อาจเป็นปัญหาที่นี่ แต่: /
ชื่อที่แสดง

คำตอบ:


16

ก่อนอื่นให้-aqตั้งค่าอัตราบิตตัวแปรตามคุณภาพ - ฉันคิดว่าคุณกำลังมองหา-ab(โปรดทราบว่าฉันเป็นผู้ใช้ ffmpeg ดังนั้นความรู้เกี่ยวกับไวยากรณ์ avconv ของฉันจึง จำกัด - ฉันไม่รู้เลยว่ามันลอยไปนานเท่าไหร่ ส้อม).

ไม่ว่าตัวเข้ารหัส AAC avconv / ffmpeg ในตัวจะค่อนข้างแย่

fdk_aac

ตัวเข้ารหัส AAC ที่ดีเพียงอย่างเดียวสำหรับ avconv / ffmpeg คือ libfdk_aac - แต่ใบอนุญาตสำหรับที่ไม่เข้ากับ GPL ดังนั้นเพื่อที่จะเข้าถึงมันคุณจะต้องรวบรวมมันเอง (นั่นคือคู่มือการรวบรวม ffmpeg เพราะฉันไม่ ไม่รู้จักหนึ่งสำหรับ avconv - คู่มือ Ubuntu ควรจะดีสำหรับ Debian เนื่องจากฉันไม่คิดว่ามีเฉพาะ Ubuntu ในนั้น)

เมื่อคุณได้มันทำตามคู่มือการเข้ารหัส AAC ; ฉันขอแนะนำอย่างยิ่งให้ลองใช้-vbrตัวเลือกของ fdk_aac - การตั้งค่า 3 เสียงโปร่งใสสำหรับฉันในไฟล์ทั้งหมดที่ฉันได้ลองถ้าคุณต้องการหลอกด้วยอัตราบิตที่สูงขึ้นหรือคุณเป็นวิศวกรเสียงคุณสามารถลองตั้งค่าของ 5

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

ไม่ต้องการ-map_metadataเนื่องจาก ffmpeg จะถ่ายโอนข้อมูลเมตาโดยอัตโนมัติ (และฉันค่อนข้างแน่ใจว่า avconv ก็เช่นกัน)

สำหรับอัตราบิตคงที่ 320 kbit / s (อย่างจริงจังนี่ไม่คุ้มค่าเลย AAC ให้ความโปร่งใสของเสียงเมื่อเทียบกับซีดีเพลงดั้งเดิมที่ความเร็วคงที่ 128 kbit / s):

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 เพื่อแทรก สคริปต์ทุบตีอาจเป็นไปตามลำดับ

ดูหน้า HydrogenAudio ใน neroAacEnc : จากหน่วยความจำการ-qตั้งค่า 0.4 ให้เสียงที่ยอดเยี่ยมสำหรับฉัน คุณสามารถกำหนดเป้าหมายอัตราบิตที่มี-br(อีกครั้งผมคิดว่านี่จะเป็นวิธีที่ overkill):

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 ของภรรยาของคุณ :)
Jonathan Komar

@ 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
Yannick Wurm

2

นี่คือการห่อสคริปต์ของฉัน ffmpeg สำหรับการแปลงรูปแบบเสียงที่รองรับเป็นAAC (โดยใช้ตัวเข้ารหัส libfdk-aac ซึ่งเป็นตัวเข้ารหัส 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

คำตอบเพิ่มเติม (เพื่อคำตอบของการระเหย)

เพื่อจัดการ

  • ไฟล์ทั้งหมดในไดเรกทอรีย่อย
  • ช่องว่างในชื่อไฟล์ ( finds -print0+ xargของ-0)
  • เก็บไฟล์ m4a ที่สร้างขึ้นใหม่ในไดเรกทอรีเดียวกันกับไฟล์ flac ต้นทาง ( $1จากsh -cอาร์กิวเมนต์ตำแหน่ง--FILEตามที่กำหนดโดยxarg's -I)

หนึ่งในสายการบิน

find . -name '*.flac' -print0 | xargs -0 -I FILE sh -c 'ffmpeg -i "$1" -c:a libfdk_aac -vbr 3 "${1%.flac}.m4a"' -- FILE
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.