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
- superuser.com/questions/251362/…
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.
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 inif 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); }