ฉันมีอัลบั้มเต็มรูปแบบและไฟล์คิวสำหรับมัน ฉันจะแยกสิ่งนี้เป็น flac ต่อเพลงได้อย่างไร
ฉันเป็นผู้ใช้ KDE ดังนั้นฉันจึงชอบวิธี KDE / Qt ฉันต้องการดูบรรทัดคำสั่งและคำตอบ GUI อื่น ๆ ด้วย แต่พวกเขาไม่ใช่วิธีที่ฉันต้องการ
ฉันมีอัลบั้มเต็มรูปแบบและไฟล์คิวสำหรับมัน ฉันจะแยกสิ่งนี้เป็น flac ต่อเพลงได้อย่างไร
ฉันเป็นผู้ใช้ KDE ดังนั้นฉันจึงชอบวิธี KDE / Qt ฉันต้องการดูบรรทัดคำสั่งและคำตอบ GUI อื่น ๆ ด้วย แต่พวกเขาไม่ใช่วิธีที่ฉันต้องการ
คำตอบ:
Shnsplit สามารถอ่านไฟล์คิวได้โดยตรงซึ่งหมายความว่ามันสามารถเข้าถึงข้อมูลอื่น ๆ จากไฟล์คิว (ไม่ใช่แค่จุดพัก) และสร้างชื่อไฟล์ที่ดีกว่า 'split - *. flac':
shnsplit -f file.cue -t %n-%t -o flac file.flac
ได้รับสิ่งนี้ทำให้การใช้ cuetag.sh นั้นยากขึ้นหากไฟล์ flac ดั้งเดิมอยู่ในไดเรกทอรีเดียวกัน
sudo apt-get install cuetools shntool
cuetag file.cue [0-9]*.flac
sudo apt-get install flac
ฉันรู้วิธี CLI เท่านั้น คุณจะต้อง cuetools และ shntool
cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
cuebreakpoints file.cue | shnsplit -o flac file.flac
มานานแล้ว บิตที่สองจะช่วยได้มาก!
cuetag
ดูเหมือนว่าจะใช้ชื่อไฟล์ที่มีช่องว่าง แต่หลังจากลบมันแล้วมันก็ใช้ได้
Flaconเป็น GUI โอเพ่นซอร์สที่ใช้งานง่ายซึ่งทำอย่างนั้น: แบ่ง FLAC ด้วย CUE
Flacon แยกแต่ละแทร็กจากไฟล์เสียงขนาดใหญ่หนึ่งไฟล์ที่มีทั้งอัลบั้มเพลงและบันทึกเป็นไฟล์เสียงแยกต่างหาก โดยใช้ข้อมูลจากไฟล์ CUE ที่เหมาะสม
มันสนับสนุนเหนือสิ่งอื่นใด:
รูปแบบอินพุตที่รองรับ: WAV, FLAC, APE, WavPack, True Audio (TTA)
รองรับรูปแบบ: FLAC, WAV, WavPack, AAC, OGG หรือ MP3
การตรวจหาชุดอักขระอัตโนมัติสำหรับไฟล์ CUE
ในการใช้งานคุณจะต้องเปิด*.cue
ไฟล์ด้วย Flacon เท่านั้น จากนั้นควรตรวจจับ*.flac
ไฟล์ขนาดใหญ่โดยอัตโนมัติ(หากไม่มีคุณสามารถระบุได้ด้วยตนเอง) จากนั้นคุณควรเลือกรูปแบบเอาต์พุตของ Flac (และกำหนดค่าตัวเข้ารหัส) และเริ่มกระบวนการแปลง
หากมีการใช้ไฟล์คุณภาพสูง shnsplit ก็มีข้อผิดพลาดเกิดขึ้นอย่างมีความสุข
shnsplit: error: m:ss.ff format can only be used with CD-quality files
โชคดีที่ flac binary รองรับ --skip = mm: ss.ss และ --until = mm: ss.ss ดังนั้นสคริปต์สามารถใช้ cuebreakpoints เช่นนี้:
[..]
time[0]="00:00.00"
c=1
for ts in $(cuebreakpoints "${cue_file}"); do
time[${c}]=${ts}
c=$((c+1))
done
time[${c}]='-0'
for ((i=0;i<$((${#time[@]}-1));i++)); do
trackno=$(($i+1))
TRACKNUMBER="$(printf %02d ${trackno})"
title="$(cueprint --track-number ${trackno} -t '%t' "${cue_file}")"
flac --silent --exhaustive-model-search --skip=${time[$i]} --until=${time[$(($i+1))]} --tag=ARTIST="${ARTIST}" --tag=ALBUM="${ALBUM}" --tag=DATE="${DATE}" --tag=TITLE="${title}" --tag=TRACKNUMBER="${TRACKNUMBER}" "${aud_file}" --output-name="${TRACKNUMBER}-${title}.flac"
done
หากคุณตั้งค่าคิวเพื่อใช้k3b
ในการตั้งค่าประเภทไฟล์k3b
จะแยกไฟล์โดยอัตโนมัติหากคุณเปิดไฟล์คิวและอนุญาตให้คุณคัดลอกอีกครั้ง
มีโครงการที่ใช้งานได้กับไฟล์อินพุตหลายไฟล์: split2flac
จากคำอธิบายโครงการ:
split2flac แยกภาพเสียงขนาดใหญ่ APE / FLAC / TTA / WV / WAV ขนาดใหญ่ (หรือชุดของไฟล์ดังกล่าวซ้ำ) ด้วยแผ่น CUE ลงในแผ่นเพลง FLAC / M4A / MP3 / OGG_VORBIS / WAV ที่มีการติดแท็กเปลี่ยนชื่อแปลงแผ่นชุด ภาพปกอัลบั้ม นอกจากนี้ยังใช้ไฟล์การกำหนดค่าดังนั้นจึงไม่จำเป็นต้องผ่านการขัดแย้งหลายครั้งทุกครั้งเพียงแค่ใส่ไฟล์ ควรทำงานในเชลล์ที่สอดคล้องกับ POSIX ใด ๆ
ฉันพบmac
(ซึ่งเป็นคำสั่งที่shntool
ใช้สำหรับการถอดรหัสไฟล์ APE) เป็นวิธีที่ทนน้อยกว่าffmpeg
ถ้าไฟล์ต้นฉบับมีข้อผิดพลาดเล็กน้อย
โดยทั่วไปffmpeg
จะยังคงแปลงไฟล์อย่างสมบูรณ์ในขณะที่mac
มีโอกาสมากที่จะเกิดข้อผิดพลาดระหว่างการประมวลผล
ดังนั้นฉันจึงสิ้นสุดการเขียนสคริปต์สำหรับการแยกไฟล์ APE โดยการแยกไฟล์ CUE และแปลงไฟล์ APE เป็นไฟล์ FLAC ที่คั่นด้วยชื่อเรื่องโดยใช้ ffmpeg:
#!/usr/bin/env python2.7
import subprocess as subp
import sys
import os
from os.path import splitext, basename
import random
import glob
records = []
filename = ""
album=''
alb_artist=''
codec = 'flac'
ffmpeg_exec = 'ffmpeg'
encodingList = ('utf-8','euc-kr', 'shift-jis', 'cp936', 'big5')
filecontent = open(sys.argv[1]).read()
for enc in encodingList:
try:
lines = filecontent.decode(enc).split('\n')
encoding = enc
break
except UnicodeDecodeError as e:
if enc == encodingList[-1]:
raise e
else:
pass
for l in lines:
a = l.split()
if not a:
continue
if a[0] == "FILE":
filename = ' '.join(a[1:-1]).strip('\'"')
elif a[0]=='TRACK':
records.append({})
records[-1]['index'] = a[1]
elif a[0]=='TITLE':
if len(records)>0:
records[-1]['title'] = ' '.join(a[1:]).strip('\'"')
else:
album = ' '.join(a[1:]).strip('\'"')
elif a[0]=='INDEX' and a[1]=='01':
timea = a[2].split(':')
if len(timea) == 3 and int(timea[0]) >= 60:
timea.insert(0, str(int(timea[0])/60))
timea[1] = str(int(timea[1])%60)
times = '{0}.{1}'.format(':'.join(timea[:-1]), timea[-1])
records[-1]['start'] = times
elif a[0]=='PERFORMER':
if len(records)>1:
records[-1]['artist'] = ' '.join(a[1:]).strip('\'"')
else:
alb_artist = ' '.join(a[1:]).strip('\'"')
for i, j in enumerate(records):
try:
j['stop'] = records[i+1]['start']
except IndexError:
pass
if not os.path.isfile(filename):
tmpname = splitext(basename(sys.argv[1]))[0]+splitext(filename)[1]
if os.path.exists(tmpname):
filename = tmpname
del tmpname
else:
for ext in ('.ape', '.flac', '.wav', '.mp3'):
tmpname = splitext(filename)[0] + ext
if os.path.exists(tmpname):
filename = tmpname
break
if not os.path.isfile(filename):
raise IOError("Can't not find file: {0}".format(filename))
fstat = os.stat(filename)
atime = fstat.st_atime
mtime = fstat.st_mtime
records[-1]['stop'] = '99:59:59'
if filename.lower().endswith('.flac'):
tmpfile = filename
else:
tmpfile = splitext(filename)[0] + str(random.randint(10000,90000)) + '.flac'
try:
if filename != tmpfile:
ret = subp.call([ffmpeg_exec, '-hide_banner', '-y', '-i', filename,
'-c:a', codec,'-compression_level','12','-f','flac',tmpfile])
if ret != 0:
raise SystemExit('Converting failed.')
for i in records:
output = i['index'] +' - '+ i['title']+'.flac'
commandline = [ffmpeg_exec, '-hide_banner',
'-y', '-i', tmpfile,
'-c', 'copy',
'-ss', i['start'], '-to', i['stop'],
'-metadata', u'title={0}'.format(i['title']),
'-metadata', u'artist={0}'.format(i.get('artist', '')),
'-metadata', u'performer={0}'.format(i.get('artist', '')),
'-metadata', u'album={0}'.format(album),
'-metadata', 'track={0}/{1}'.format(i['index'], len(records)),
'-metadata', u'album_artist={0}'.format(alb_artist),
'-metadata', u'composer={0}'.format(alb_artist),
'-metadata', 'encoder=Meow',
'-write_id3v1', '1',
output]
ret = subp.call(commandline)
if ret == 0:
os.utime(output, (atime, mtime))
finally:
if os.path.isfile(tmpfile):
os.remove(tmpfile)
if os.path.isfile(tmpfile)
เป็นif tmpfile != filename and os.path.isfile(tmpfile)
เพื่อหลีกเลี่ยงการลบไฟล์ต้นฉบับเมื่อเกิดข้อผิดพลาด
len(records)>0
นั้น
shntool
บน Ubuntu 14.04
snhtool
ไม่มีการmac
พึ่งพาการดำเนินการ(Monkey's Audio Console) และแพคเกจเดียวที่ฉันพบได้ในflacon
PPA:
sudo add-apt-repository -y ppa:flacon
sudo apt-get update
sudo apt-get install -y flacon shntool
shntool split -f *.cue -o flac -t '%n - %p - %t' *.ape
flacon
เป็น GUI สำหรับshntool
แต่มันมาพร้อมกับตัวแปลงสัญญาณทั้งหมดที่ต้องการ ... มิฉะนั้นฉันได้รับข้อผิดพลาด:
shnsplit: warning: failed to read data from input file using format: [ape]
shnsplit: + you may not have permission to read file: [example.ape]
shnsplit: + arguments may be incorrect for decoder: [mac]
shnsplit: + verify that the decoder is installed and in your PATH
shnsplit: + this file may be unsupported, truncated or corrupt
shnsplit: error: cannot continue due to error(s) shown above