Ik “heb een volledige albumflac en een cuebestand ervoor. Hoe kan ik dit opsplitsen in een flac per track?

Ik ben een KDE-gebruiker, dus ik zou liever een KDE / Qt-manier gebruiken. Ik zou ook graag de commandoregel en andere GUI-antwoorden willen zien, maar die hebben niet mijn voorkeur.

Opmerkingen

Antwoord

Shnsplit kan een cue-bestand rechtstreeks lezen, wat ook betekent dat het toegang heeft tot de andere gegevens van het cue-bestand (niet alleen de breakpoints) en mooiere bestandsnamen kan genereren dan split-*.flac:

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

Toegegeven, dit maakt het moeilijker om cuetag.sh te gebruiken als het originele flac-bestand zich in dezelfde map bevindt.

Reacties

  • Mede debian-gebruikers: sudo apt-get install cuetools shntool
  • Waarschijnlijk wil je ook tag de bestanden met cuetag file.cue [0-9]*.flac
  • Ik had ook nodig: sudo apt-get install flac
  • cuetools is al afhankelijk van flac, dus …
  • Op Debian 10 is er een bug met 24 bits flacs. Het heeft ‘ t gesplitst. Het werkt echter prima op 16-bits bestanden.

Antwoord

Ik ken alleen een CLI-manier. Je hebt cuetools en shntool nodig.

cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac 

Reacties

  • Bedankt voor deze Kambus. Ik ‘ gebruik cuebreakpoints file.cue | shnsplit -o flac file.flac al een hele tijd. Het tweede bit zal veel helpen!
  • cuetag lijkt te breken op bestandsnamen die spaties bevatten, maar na het verwijderen ervan werkte het.

Answer

Flacon is een intuïtieve open-source GUI die doet precies dat: splits een FLAC met een CUE.

Flacon extraheert individuele tracks uit één groot audiobestand dat het hele muziekalbum bevat en slaat ze op als aparte audio bestanden. Om dit te doen, gebruikt het informatie uit het juiste CUE-bestand.

Het ondersteunt onder andere:

Ondersteunde invoerformaten: WAV, FLAC, APE, WavPack, True Audio (TTA).

Ondersteunde formaten: FLAC, WAV, WavPack, AAC, OGG of MP3.

Automatische tekensetdetectie voor CUE-bestanden.

Om het te gebruiken hoeft u alleen de *.cue bestand met Flacon. Het zou dan automatisch het grote *.flac -bestand moeten detecteren (zo niet, dan kunt u dit handmatig specificeren), en dan moet u het Flac-uitvoerformaat selecteren (en optioneel de encoder configureren), en de conversieproces.

Flacon v5.4.0

Reacties

  • Welkom naar Unix & Linux Stack Exchange! Hoewel dit de vraag theoretisch kan beantwoorden, zou het de voorkeur hebben om de essentiële delen van het antwoord hier op te nemen, en de link als referentie te geven.
  • nog steeds bijgewerkt in 2017
  • Ik ‘ vind het niet leuk om UI te gebruiken voor dingen die ik op de terminal kan doen, maar ik worstelde met een album, en dit was de enige manier om de bestanden te splitsen. Je verdient nu een biertje man

Antwoord

als bestanden van hoge kwaliteit worden gebruikt, maakt shnsplit gelukkig een fout uit met

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

Gelukkig ondersteunt de binaire flac –skip = mm: ss.ss en –until = mm: ss.ss zodat een script kan gebruiken cuebreakpoints zoals deze:

[..] 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 

Reacties

  • Dit is de enige methode die voor mij werkte.

Answer

Als je een cue hebt ingesteld om k3b te gebruiken in in de filetype-instellingen, k3b zal het bestand automatisch splitsen als je het cue-bestand opent, en je opnieuw laten rippen.

Antwoord

Er is een project dat werkt voor verschillende invoerbestanden: split2flac

Van de projectbeschrijving:

split2flac splitst een groot APE / FLAC / TTA / WV / WAV-audiobeeld (of een verzameling van dergelijke bestanden , recursief) met CUE-sheet in FLAC / M4A / MP3 / OGG_VORBIS / WAV-tracks met tagging, hernoemen, karakterset-conversie van cue-sheet, albumomslagafbeeldingen. Het gebruikt ook een configuratiebestand, dus het is niet nodig om elke keer veel argumenten door te geven, alleen een invoerbestand. Zou moeten werken in elke POSIX-compatibele shell.

Antwoord

Ik vond mac (dit is het commando dat shntool gebruikt voor het decoderen van APE-bestanden) is veel minder tolerant dan ffmpeg als het bronbestand kleine fouten bevat.

Normaal gesproken zou ffmpeg het bestand nog steeds volledig converteren terwijl mac zeer waarschijnlijk een fout veroorzaakt tijdens de verwerking.

Dus uiteindelijk heb ik een script geschreven voor het splitsen van het APE-bestand door het CUE-bestand te parseren en het APE-bestand te converteren naar FLAC-bestanden, gescheiden door titels met 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) 

Reacties

  • Misschien wil je if os.path.isfile(tmpfile) veranderen in if tmpfile != filename and os.path.isfile(tmpfile) om te voorkomen dat het originele bestand bij een fout wordt verwijderd.
  • De voorwaarde voor het instellen van de trackartiest moet zijn als len(records)>0.

Antwoord

shntool op Ubuntu 14.04

snhtool mist de mac (Monkeys Audio Console) uitvoerbare afhankelijkheid, en het enige pakket dat ik kon vinden was in de 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 is een GUI voor shntool, maar wordt geleverd met alle codecs behoeften … anders kreeg ik de foutmelding:

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 

Antwoord

Hier is een PHP-script:

 <?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); }  

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *