Ich habe einen vollständigen Album-Flac und eine Cue-Datei dafür. Wie kann ich diesen in einen Flac pro Track aufteilen?
Ich bin ein KDE-Benutzer, daher würde ich einen KDE / Qt-Weg bevorzugen. Ich möchte auch Befehlszeilen- und andere GUI-Antworten sehen, aber diese sind nicht meine bevorzugte Methode.
Kommentare
Antwort
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 :
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.
Kommentare
- Debian-Mitbenutzer:
sudo apt-get install cuetools shntool
- Sie möchten wahrscheinlich auch Kennzeichnen Sie die Dateien mit
cuetag file.cue [0-9]*.flac
- Ich brauchte auch:
sudo apt-get install flac
- cuetools hängt bereits von ab flac, also …
- Auf Debian 10 gibt es einen Fehler mit 24-Bit-Flacs. ‚ wird nicht aufgeteilt. Es funktioniert jedoch einwandfrei mit 16-Bit-Dateien.
Antwort
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
Kommentare
- Vielen Dank für diesen Kambus. Ich ‚ verwende
cuebreakpoints file.cue | shnsplit -o flac file.flac
seit langer Zeit. Das 2. Bit wird viel helfen! -
cuetag
scheint bei Dateinamen mit Leerzeichen zu brechen, aber nach dem Entfernen hat es funktioniert.
Antwort
Flacon ist eine intuitive Open-Source-Benutzeroberfläche Genau das: 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 separates Audio Dateien. Zu diesem Zweck werden Informationen aus der entsprechenden CUE-Datei verwendet.
Es werden unter anderem unterstützt:
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 verwenden, müssen Sie nur die *.cue
Datei mit Flacon. Es sollte dann automatisch die große *.flac
-Datei erkennen (falls nicht, können Sie dies manuell angeben), und dann sollten Sie das Flac-Ausgabeformat auswählen (und optional den Encoder konfigurieren) und die starten Konvertierungsprozess.
Kommentare
- Willkommen unter Unix & Linux Stack Exchange! Während dies theoretisch die Frage beantworten kann, , wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
- noch aktualisiert im Jahr 2017
- Ich ‚ verwende die Benutzeroberfläche nicht gerne für Dinge, die ich auf dem Terminal tun kann, aber ich hatte Probleme mit einem Album und Dies war die einzige Möglichkeit, die Dateien aufzuteilen. Sie verdienen jetzt ein Bier Mann
Antwort
Wenn hochwertige Dateien verwendet werden, ist shnsplit glücklich fehlerhaft out with
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, sodass ein Skript sie verwenden kann Cuebreakpoints wie folgt:
[..] 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
Kommentare
- Dies ist die einzige Methode, die für mich funktioniert hat.
Antwort
Wenn Sie den Cue so eingestellt haben, dass k3b
in verwendet wird In den Dateitypeinstellungen teilt k3b
die Datei automatisch, wenn Sie die Cue-Datei öffnen, und ermöglicht Ihnen das erneute Rippen.
Antwort
Es gibt ein Projekt, das für mehrere Eingabedateien funktioniert: split2flac
From Die 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-Bildern. 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.
Antwort
Ich habe gefunden mac
(dies ist der Befehl, den shntool
zum Dekodieren von APE-Dateien verwendet) ist weitaus weniger tolerant als ffmpeg
wenn die Quelldatei kleinere Fehler enthält.
Normalerweise konvertiert ffmpeg
die Datei immer noch vollständig, während mac
sehr wahrscheinlich einen Fehler während der Verarbeitung auslöst.
Also schrieb ich ein Skript zum Teilen der APE-Datei, indem ich die CUE-Datei analysierte und die APE-Datei mit ffmpeg in FLAC-Dateien konvertierte, die durch Titel getrennt waren:
#!/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)
Kommentare
- Möglicherweise möchten Sie
if os.path.isfile(tmpfile)
inif tmpfile != filename and os.path.isfile(tmpfile)
ändern Um zu vermeiden, dass die Originaldatei bei einem Fehler gelöscht wird. - Die Bedingung für die Einstellung des Titelkünstlers muss sein, wenn
len(records)>0
.
Antwort
shntool
unter Ubuntu 14.04
snhtool
fehlt die mac
(Monkeys Audio Console) ausführbare Abhängigkeit, und das einzige Paket, das ich finden konnte, war in der 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
ist eine GUI für shntool
, enthält jedoch alle Codecs braucht … sonst 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
Antwort
Hier ist ein PHP-Skript:
<?php $s_cue = $argv[1]; $a_cue = file($s_cue); $n_row = -1; foreach ($a_cue as $s_row) { $s_trim = trim($s_row); $a_row = str_getcsv($s_trim, " "); if (preg_match("/^FILE\s/", $s_row) == 1) { $s_file = $a_row[1]; } if (preg_match("/^\s+TRACK\s/", $s_row) == 1) { $n_row++; $a_table[$n_row]["track"] = $a_row[1]; } if (preg_match("/^\s+TITLE\s/", $s_row) == 1) { $a_table[$n_row]["title"] = $a_row[1]; } if (preg_match("/^\s+PERFORMER\s/", $s_row) == 1) { $a_table[$n_row]["artist"] = $a_row[1]; } if (preg_match("/^\s+INDEX\s/", $s_row) == 1) { $s_dur = $a_row[2]; $a_frame = sscanf($s_dur, "%d:%d:%d", $n_min, $n_sec, $n_fra); $n_index = $n_min * 60 + $n_sec + $n_fra / 75; $a_table[$n_row]["ss"] = $n_index; if ($n_row > 0) { $a_table[$n_row - 1]["to"] = $n_index; } } } $a_table[$n_row]["to"] = 10 * 60 * 60; foreach ($a_table as $m_row) { $a_cmd = [ "ffmpeg", "-i", $s_file, "-ss", $m_row["ss"], "-to", $m_row["to"], "-metadata", "artist=" . $m_row["artist"], "-metadata", "title=" . $m_row["title"], "-metadata", "track=" . $m_row["track"], $m_row["track"] . " " . $m_row["title"] . ".m4a" ]; $a_esc = array_map("escapeshellarg", $a_cmd); $s_esc = implode(" ", $a_esc); system($s_esc); }