Mám pro to kompletní albu a soubor cue. Jak to mohu rozdělit na jednu stopu na stopu?
Jsem uživatel KDE, takže bych raději používal KDE/Qt. Chtěl bych vidět také příkazový řádek a další odpovědi na GUI, ale nejsou to moje preferovaná metoda.
Pokud máte nastaveno, že chcete použít k3b
v nastavení typu souboru, k3b
automaticky otevře soubor, pokud otevřete soubor cue, a umožní vám jej znovu roztrhnout.
Shnsplit umí číst soubor cue přímo, což také znamená, že může přistupovat k ostatním datům ze souboru cue (nejen k bodům zlomu) a vytvářet hezčí názvy souborů než 'split - *. Flac':
shnsplit -f file.cue -t %n-%t -o flac file.flac
Je pravda, že je obtížnější používat cuetag.sh, pokud je původní soubor flac ve stejném adresáři.
Znám jen způsob CLI. Budete potřebovat ketooly a shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Flacon je intuitivní open-source GUI, které dělá přesně to: rozdělit FLAC s CUE.
Flacon extrahuje jednotlivé skladby z jednoho velkého zvukového souboru obsahujícího celé album hudby a uloží je jako samostatné zvukové soubory. K tomu používá informace z příslušného souboru CUE.
Podporuje mimo jiné:
Podporované vstupní formáty: WAV, FLAC, APE, WavPack, True Audio (TTA).
Podporované formáty: FLAC, WAV, WavPack, AAC, OGG nebo MP3.
Automatická detekce znakové sady pro soubory CUE.
Chcete-li jej použít, stačí otevřít *.cue
soubor s Flacon. To by pak mělo automaticky detekovat velké *.flac
file (pokud ne, můžete to zadat ručně), pak byste měli vybrat výstupní formát Flac (a volitelně nakonfigurovat kodér) a zahájit proces převodu.
pokud jsou používány vysoce kvalitní soubory, shnsplit s radostí chybuje
shnsplit: error: m:ss.ff format can only be used with CD-quality files
naštěstí flac binární podporuje --skip = mm: ss.ss a --until = mm: ss.ss, takže skript může používat cuebreakpoints jako je tento:
[..]
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
Našel jsem mac
(což je příkaz, který shntool
používaný pro dekódování souborů APE) je mnohem méně tolerantní než ffmpeg
, pokud zdrojový soubor obsahuje drobné chyby.
Normálně ffmpeg
by stále převáděl soubor úplně, zatímco mac
velmi pravděpodobně vyvolá chybu během zpracování.
Nakonec jsem napsal skript pro rozdělení souboru APE analyzováním souboru CUE a převodem souboru APE na soubory FLAC oddělené tituly pomocí 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)
Existuje projekt, který pracuje pro několik vstupních souborů: split2flac
Z popisu projektu:
split2flac rozdělí jeden velký zvukový obraz APE/FLAC/TTA/WV/WAV (nebo sbírku takových souborů rekurzivně) pomocí listu CUE na stopy FLAC/M4A/MP3/OGG_VORBIS/WAV s označováním, přejmenováním, převodem znakové sady do znakové sady, obrázky na obalu alba. Používá také konfigurační soubor, takže není třeba pokaždé předávat mnoho argumentů, pouze vstupní soubor. Měl by fungovat v jakémkoli prostředí kompatibilním s POSIX.
shntool
na Ubuntu 14.04
snhtool
chybí spustitelná závislost mac
(Monkey's Audio Console) a jediný balíček, který jsem mohl najít, byl v PPA flacon
:
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
je GUI pro shntool
, ale přichází se všemi kodeky, které potřebuje ... jinak jsem dostal chybu:
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