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.

Flacon v5.4.0

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) in if 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); }  

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.