Mam do tego pełny flac albumu i plik cue. Jak mogę podzielić to na flac na ścieżkę?
Jestem użytkownikiem KDE, więc wolałbym sposób KDE / Qt. Chciałbym zobaczyć również wiersze poleceń i inne odpowiedzi GUI, ale nie są one moją preferowaną metodą.
Mam do tego pełny flac albumu i plik cue. Jak mogę podzielić to na flac na ścieżkę?
Jestem użytkownikiem KDE, więc wolałbym sposób KDE / Qt. Chciałbym zobaczyć również wiersze poleceń i inne odpowiedzi GUI, ale nie są one moją preferowaną metodą.
Odpowiedzi:
Shnsplit może odczytać plik cue bezpośrednio, co oznacza również, że może uzyskać dostęp do innych danych z pliku cue (nie tylko punktów przerwania) i generować ładniejsze nazwy plików niż „split - *. Flac”:
shnsplit -f file.cue -t %n-%t -o flac file.flac
To prawda, że utrudnia to użycie pliku cuetag.sh, jeśli oryginalny plik flac znajduje się w tym samym katalogu.
sudo apt-get install cuetools shntool
cuetag file.cue [0-9]*.flac
sudo apt-get install flac
Znam tylko sposób CLI. Będziesz potrzebował cuetools i shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
cuebreakpoints file.cue | shnsplit -o flac file.flac
dłuższego czasu. Drugi bit bardzo pomoże!
cuetag
zdaje się łamać nazwy plików zawierające spacje, ale po ich usunięciu zadziałało.
Flacon to intuicyjny graficzny interfejs użytkownika typu open source, który dokładnie to robi: dzieli FLAC za pomocą CUE.
Flacon wyodrębnia pojedyncze ścieżki z jednego dużego pliku audio zawierającego cały album z muzyką i zapisuje je jako osobne pliki audio. W tym celu wykorzystuje informacje z odpowiedniego pliku CUE.
Obsługuje między innymi:
Obsługiwane formaty wejściowe: WAV, FLAC, APE, WavPack, True Audio (TTA).
Obsługiwane formaty: FLAC, WAV, WavPack, AAC, OGG lub MP3.
Automatyczne wykrywanie zestawu znaków dla plików CUE.
Aby go użyć, wystarczy otworzyć *.cue
plik za pomocą Flacon. Następnie powinien automatycznie wykryć duży *.flac
plik (jeśli nie, możesz to określić ręcznie), a następnie powinieneś wybrać format wyjściowy Flac (i opcjonalnie skonfigurować enkoder) i rozpocząć proces konwersji.
jeśli używane są pliki wysokiej jakości, shnsplit chętnie się pomylił
shnsplit: error: m:ss.ff format can only be used with CD-quality files
na szczęście plik binarny flac obsługuje --skip = mm: ss.ss i --until = mm: ss.ss, dzięki czemu skrypt może używać punktów cuebreak:
[..]
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
Jeśli masz ustawione cue do użycia k3b
w ustawieniach typu pliku, k3b
automatycznie podzieli plik, jeśli otworzysz plik cue, i pozwoli ci na ponowne zgrywanie.
Istnieje projekt, który działa dla kilku plików wejściowych: split2flac
Z opisu projektu:
split2flac dzieli jeden duży obraz audio APE / FLAC / TTA / WV / WAV (lub zbiór takich plików, rekurencyjnie) za pomocą arkusza CUE na ścieżki FLAC / M4A / MP3 / OGG_VORBIS / WAV z tagowaniem, zmianą nazwy, konwersją zestawu znaków cue, obrazy okładek albumów. Wykorzystuje również plik konfiguracyjny, więc nie trzeba za każdym razem przekazywać wielu argumentów, tylko plik wejściowy. Powinien działać w dowolnej powłoce zgodnej z POSIX.
Odkryłem mac
(które to polecenie shntool
służy do dekodowania plików APE) jest znacznie mniej tolerancyjne niż w ffmpeg
przypadku, gdy plik źródłowy zawiera drobne błędy.
Zwykle ffmpeg
nadal całkowicie przekonwertowałby plik, a mac
najprawdopodobniej zgłasza błąd podczas przetwarzania.
Skończyło się więc pisaniem skryptu do dzielenia pliku APE przez parsowanie pliku CUE i konwersję pliku APE do plików FLAC oddzielonych tytułami za 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)
if os.path.isfile(tmpfile)
, aby if tmpfile != filename and os.path.isfile(tmpfile)
uniknąć usuwania oryginalnego pliku w przypadku błędu.
len(records)>0
.
shntool
na Ubuntu 14.04
snhtool
brakuje mac
zależności wykonywalnej (Monkey's Audio Console), a jedynym pakietem, jaki mogłem znaleźć, była 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
jest graficznym interfejsem użytkownika shntool
, ale zawiera wszystkie potrzebne kodeki ... w przeciwnym razie wystąpił błąd:
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