Jeg har en full albumflac og en cue-fil for det. Hvordan kan jeg dele dette opp i et flac per spor?
Jeg er KDE-bruker, så jeg foretrekker en KDE / Qt-måte. Jeg vil også se kommandolinjen og andre GUI-svar, men de er ikke den foretrukne metoden min.
Kommentarer
- superbruker.com/questions/251362/…
Svar
Shnsplit kan lese en cue-fil direkte, noe som også betyr at den kan få tilgang til andre data fra cue-filen (ikke bare brytpunktene) og generere bedre filnavn enn split-*.flac
:
shnsplit -f file.cue -t %n-%t -o flac file.flac
Gitt, dette gjør det vanskeligere å bruke cuetag.sh hvis den opprinnelige flac-filen er i samme katalog.
Kommentarer
- Meddebianere:
sudo apt-get install cuetools shntool
- Du vil sannsynligvis også tagg filene med
cuetag file.cue [0-9]*.flac
- Jeg trengte også:
sudo apt-get install flac
- cuetools er allerede avhengig av flac, så…
- På Debian 10 er det en feil med 24 bits flacs. Den vant ikke ‘. Det fungerer fint på 16-bits filer skjønt.
Svar
Jeg vet bare en CLI-måte. Du trenger cuetools og shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac
Kommentarer
- Takk for denne Kambus. Jeg ‘ har brukt
cuebreakpoints file.cue | shnsplit -o flac file.flac
i lang tid. Den andre biten kommer til å hjelpe mye! -
cuetag
ser ut til å bryte på filnavn som inneholder mellomrom, men etter å ha fjernet dem fungerte det.
Svar
Flacon er en intuitiv GUI for åpen kildekode som gjør akkurat det: del en FLAC med en CUE.
Flacon trekker ut individuelle spor fra en stor lydfil som inneholder hele musikkalbumet og lagrer dem som separat lyd filer. For å gjøre dette bruker den informasjon fra den aktuelle CUE-filen.
Den støtter blant annet:
Støttede inngangsformater: WAV, FLAC, APE, WavPack, True Audio (TTA).
Støttede formater: FLAC, WAV, WavPack, AAC, OGG eller MP3.
Automatisk deteksjon av tegnsett for CUE-filer.
For å bruke den trenger du bare å åpne *.cue
fil med Flacon. Den skal da automatisk oppdage den store *.flac
-filen (hvis ikke, kan du spesifisere dette manuelt), og deretter bør du velge Flac-utdataformat (og eventuelt konfigurere koderen), og starte konverteringsprosess.
Kommentarer
- Velkommen til Unix & Linux Stack Exchange! Selv om dette teoretisk kan svare på spørsmålet, ville være å foretrekke å inkludere de viktigste delene av svaret her, og gi lenken for referanse.
- fremdeles oppdatert i 2017
- Jeg liker ikke ‘ jeg bruker UI til ting jeg kan gjøre på terminalen, men jeg slet med et album, og dette var den eneste måten å dele filene på. Du fortjener en øl nå mann
Svar
hvis filer av høy kvalitet blir brukt, feiler shnsplit gjerne ute med
shnsplit: error: m:ss.ff format can only be used with CD-quality files
Heldigvis støtter flac binær –skip = mm: ss.ss og –until = mm: ss.ss slik at et skript kan bruke cuebreakpoints like this:
[..] 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
Kommentarer
- Dette er den eneste metoden som fungerte for meg.
Svar
Hvis du har kø satt til å bruke k3b
i i filtypeinnstillingene vil k3b
automatisk dele filen hvis du åpner cue-filen, og lar deg re-rippe.
Svar
Det er et prosjekt som fungerer for flere inndatafiler: split2flac
Fra prosjektbeskrivelsen:
split2flac deler et stort lydbilde av APE / FLAC / TTA / WV / WAV (eller en samling av slike filer , rekursivt) med CUE-ark i FLAC / M4A / MP3 / OGG_VORBIS / WAV-spor med merking, omdøping, charset-konvertering av køark, albumomslag. Den bruker også konfigurasjonsfil, så det er ikke nødvendig å sende mange argumenter hver gang, bare en inndatafil. Bør fungere i et POSIX-kompatibelt skall.
Svar
jeg fant mac
(som er kommandoen som shntool
som brukes til å dekode APE-filer) er mye mindre tolerant enn ffmpeg
hvis kildefilen inneholder mindre feil.
Normalt vil ffmpeg
fortsatt konvertere filen fullstendig mens mac
sannsynligvis kaster en feil under behandlingen.
Så jeg endte opp med å skrive et skript for å dele APE-filen ved å analysere CUE-filen og konvertere APE-filen til FLAC-filer atskilt med titler ved hjelp av 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)
Kommentarer
- Det kan være lurt å endre
if os.path.isfile(tmpfile)
tilif tmpfile != filename and os.path.isfile(tmpfile)
for å unngå å slette den opprinnelige filen ved en feil. - Forutsetningen for å sette sporartisten må være hvis
len(records)>0
.
Svar
shntool
på Ubuntu 14.04
snhtool
mangler mac
(Monkeys Audio Console) kjørbar avhengighet, og den eneste pakken jeg kunne finne den var i 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
er et brukergrensesnitt for shntool
, men det følger med alle kodeker det trenger … ellers fikk jeg feilen:
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
Svar
Her er et 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); }