Wie teile ich einen Flac mit einem Cue?

71

Ich habe ein volles Album flac und eine Cue-Datei dafür. Wie kann ich das in einen Flac pro Track aufteilen?

Ich bin ein KDE-Benutzer, daher würde ich einen KDE / Qt-Weg bevorzugen. Ich würde gerne auch die Befehlszeile und andere GUI-Antworten sehen, aber sie sind nicht meine bevorzugte Methode.

Xenoterracid
quelle

Antworten:

72

Shnsplit kann eine Cue-Datei direkt lesen, was auch bedeutet, dass es auf die anderen Daten aus der Cue-Datei (nicht nur auf die Haltepunkte) zugreifen und schönere Dateinamen als 'split - *. Flac' generieren kann:

shnsplit -f file.cue -t %n-%t -o flac file.flac

Zugegeben, dies erschwert die Verwendung von cuetag.sh, wenn sich die ursprüngliche flac-Datei im selben Verzeichnis befindet.

Michael H
quelle
17
Mitbenutzer von sudo apt-get install cuetools shntool
Debian
13
Sie möchten wahrscheinlich auch die Dateien mitcuetag file.cue [0-9]*.flac
August Karlstrom
6
Ich brauchte auch:sudo apt-get install flac
Becko
22

Ich kenne nur einen CLI-Weg. Sie benötigen Cuetools und Shntool.

cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Kambus
quelle
2
Danke für diesen Kambus. Ich benutze cuebreakpoints file.cue | shnsplit -o flac file.flacseit langer Zeit. Das 2. Bit wird viel helfen!
Boehj
1
cuetagscheint bei Dateinamen mit Leerzeichen zu brechen, aber nach dem Entfernen hat es funktioniert.
scai
20

Flacon ist eine intuitive Open-Source-GUI, die genau das tut: Teilen Sie einen FLAC mit einem CUE.

Flacon extrahiert einzelne Titel aus einer großen Audiodatei, die das gesamte Musikalbum enthält, und speichert sie als separate Audiodateien. Zu diesem Zweck werden Informationen aus der entsprechenden CUE-Datei verwendet.

Es unterstützt unter anderem:

Unterstützte Eingabeformate: WAV, FLAC, APE, WavPack, True Audio (TTA).

Unterstützte Formate: FLAC, WAV, WavPack, AAC, OGG oder MP3.

Automatische Zeichensatzerkennung für CUE-Dateien.

Um es zu benutzen, müssen Sie nur die *.cueDatei mit Flacon öffnen . Es sollte dann automatisch die große *.flacDatei erkennen (falls nicht, können Sie dies manuell festlegen), und Sie sollten dann das Flac-Ausgabeformat auswählen (und optional den Encoder konfigurieren) und den Konvertierungsprozess starten.

Flacon v5.4.0

Yaze
quelle
1
Willkommen bei Unix & Linux Stack Exchange! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
slm
noch in 2017 aktualisiert
6

Wenn Dateien mit hoher Qualität verwendet werden, ist shnsplit mit Fehlern zufrieden

shnsplit: error: m:ss.ff format can only be used with CD-quality files

Glücklicherweise unterstützt die flac-Binärdatei --skip = mm: ss.ss und --until = mm: ss.ss, so dass ein Skript so viele cuebreakpoints verwenden kann:

[..]
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
peter_tux
quelle
Dies ist die einzige Methode, die bei mir funktioniert hat.
Kaffee
3

Wenn Sie k3bin den Dateitypeinstellungen einen Cue festgelegt haben , k3bwird die Datei automatisch aufgeteilt, wenn Sie die Cue-Datei öffnen, und Sie können sie erneut rippen.

Xenoterracid
quelle
1

Es gibt ein Projekt, das für mehrere Eingabedateien funktioniert: split2flac

Aus der Projektbeschreibung:

split2flac teilt ein großes APE / FLAC / TTA / WV / WAV-Audiobild (oder eine Sammlung solcher Dateien, rekursiv) mit CUE-Sheet in FLAC / M4A / MP3 / OGG_VORBIS / WAV-Tracks mit Tagging, Umbenennung, Zeichensatzkonvertierung von Cue-Sheet, Album-Cover-Bilder. Es wird auch eine Konfigurationsdatei verwendet, sodass nicht jedes Mal viele Argumente übergeben werden müssen, sondern nur eine Eingabedatei. Sollte in jeder POSIX-kompatiblen Shell funktionieren.

Paulo Fidalgo
quelle
1

Ich fand mac(das ist der Befehl, shntoolder zum Dekodieren von APE-Dateien verwendet wird) ist weit weniger tolerant als ffmpegwenn die Quelldatei kleinere Fehler enthält.

Normalerweise ffmpegwürde die Datei trotzdem vollständig konvertiert, während macsehr wahrscheinlich ein Fehler während der Verarbeitung auftritt.

Also habe ich ein Skript zum Teilen der APE-Datei geschrieben, indem ich die CUE-Datei analysiert und die APE-Datei mit ffmpeg in FLAC-Dateien konvertiert habe, die durch Titel getrennt sind:

#!/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)
Miau
quelle
Möglicherweise möchten Sie ändern, if os.path.isfile(tmpfile)um if tmpfile != filename and os.path.isfile(tmpfile)zu vermeiden, dass die ursprüngliche Datei bei einem Fehler gelöscht wird.
Wolfmanx
Die Bedingung für die Einstellung des Interpreten muss sein, wenn len(records)>0.
Wolfmanx
1

shntool auf Ubuntu 14.04

snhtoolfehlt die macausführbare Abhängigkeit (Monkeys Audio Console) und das einzige Paket, das ich finden konnte, war in der flaconPPA:

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

flaconist ein GUI für shntool, aber es kommt mit allen benötigten Codecs ... ansonsten habe ich den Fehler bekommen:

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
Ciro Santilli ist ein Schauspieler
quelle