Wie teile ich einen Flac mit einem Cue?


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.


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

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


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

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.


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.


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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.