Am un album complet flac și un fișier cue pentru el. Cum pot împărți acest lucru într-un flac pe piesă?
Sunt un utilizator KDE, așa că aș prefera un mod KDE / Qt. Aș dori să văd și linia de comandă și alte răspunsuri GUI, dar nu sunt metoda mea preferată.
Comentarii
- superuser.com/questions/251362/…
Răspuns
Shnsplit poate citi direct un fișier cue, ceea ce înseamnă, de asemenea, că poate accesa celelalte date din fișierul cue (nu doar punctele de întrerupere) și poate genera nume de fișiere mai frumoase decât split-*.flac
:
shnsplit -f file.cue -t %n-%t -o flac file.flac
Acordat, acest lucru face mai dificilă utilizarea cuetag.sh dacă fișierul FLAC original se află în același director.
Comentarii
- Utilizatori debian colegi:
sudo apt-get install cuetools shntool
- Probabil doriți și să etichetați fișierele cu
cuetag file.cue [0-9]*.flac
- De asemenea, aveam nevoie:
sudo apt-get install flac
- cuetools depinde deja de flac, deci …
- Pe Debian 10 există un bug cu flac-uri de 24 de biți. A câștigat ‘ t split. Funcționează bine pe fișiere pe 16 biți.
Răspuns
Știu doar un mod CLI. Veți avea nevoie de cuetools și shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac
Comentarii
- Vă mulțumim pentru acest Kambus. ‘ folosesc
cuebreakpoints file.cue | shnsplit -o flac file.flac
de mult timp. Al doilea bit va ajuta mult! -
cuetag
pare să se rupă pe numele de fișiere care conțin spații, dar după ce le-ați eliminat, a funcționat.
Răspuns
Flacon este un GUI intuitiv cu sursă deschisă care face exact asta: împărțiți un FLAC cu un CUE.
Flacon extrage piese individuale dintr-un fișier audio mare care conține întreg albumul de muzică și le salvează ca audio separat fișiere. Pentru a face acest lucru, folosește informații din fișierul CUE corespunzător.
Acceptă printre altele:
Formate de intrare acceptate: WAV, FLAC, APE, WavPack, True Audio (TTA).
Formate acceptate: FLAC, WAV, WavPack, AAC, OGG sau MP3.
Detectarea automată a setului de caractere pentru fișierele CUE.
Pentru a-l utiliza trebuie doar să deschideți *.cue
fișier cu Flacon. Ar trebui să detecteze automat fișierul mare *.flac
(dacă nu, puteți specifica acest lucru manual), apoi ar trebui să selectați formatul de ieșire Flac (și să configurați opțional codificatorul) și să porniți proces de conversie.
Comentarii
- Bun venit la Unix & Linux Stack Exchange! Deși acest lucru poate răspunde teoretic la întrebare, ar fi de preferat să includeți părțile esențiale ale răspunsului aici și să furnizați linkul de referință.
- încă actualizat în 2017
- Nu ‘ îmi place să folosesc interfața de utilizare pentru lucrurile pe care le pot face pe terminal, dar mă luptam cu un album și acesta a fost singurul mod de a împărți fișierele. Meriți o bere acum omule
Răspunde
dacă se utilizează fișiere de înaltă calitate, shnsplit greșește din fericire afară cu
shnsplit: error: m:ss.ff format can only be used with CD-quality files
din fericire suportul binar flac –skip = mm: ss.ss și –until = mm: ss.ss, astfel încât un script să poată utiliza 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
Comentarii
- Aceasta este singura metodă care a funcționat pentru mine.
Răspuns
Dacă ați setat cue pentru a utiliza k3b
în în setările tipului de fișier, k3b
va împărți automat fișierul dacă deschideți fișierul cue și vă permite să repetați.
Răspundeți
Există un proiect care funcționează pentru mai multe fișiere de intrare: split2flac
De la descrierea proiectului:
split2flac împarte o imagine audio APE / FLAC / TTA / WV / WAV mare (sau o colecție de astfel de fișiere) , recursiv) cu foaie CUE în piese FLAC / M4A / MP3 / OGG_VORBIS / WAV cu etichetare, redenumire, conversie set de caractere a foii cue, imagini de copertă de album. De asemenea, folosește fișierul de configurare, deci nu este nevoie să transmiteți multe argumente de fiecare dată, ci doar un fișier de intrare. Ar trebui să funcționeze în orice shell compatibil POSIX.
Răspuns
Am găsit mac
(care este comanda utilizată de shntool
pentru decodarea fișierelor APE) este mult mai puțin tolerantă decât ffmpeg
dacă fișierul sursă conține erori minore.
În mod normal, ffmpeg
ar converti în continuare fișierul complet, în timp ce mac
aruncă foarte probabil o eroare în timpul procesării.
Așa că am ajuns să scriu un script pentru divizarea fișierului APE analizând fișierul CUE și convertind fișierul APE în fișiere FLAC separate prin titluri folosind 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)
Comentarii
- S-ar putea să doriți să schimbați
if os.path.isfile(tmpfile)
înif tmpfile != filename and os.path.isfile(tmpfile)
pentru a evita ștergerea fișierului original în urma unei erori. - Condiția pentru setarea artistului piesei trebuie să fie dacă
len(records)>0
.
Răspuns
shntool
pe Ubuntu 14.04
snhtool
lipsește mac
(Consola audio a maimuței) dependență executabilă și singurul pachet pe care l-am putut găsi a fost în 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
este un GUI pentru shntool
, dar vine cu toate codecurile pe care le are nevoie … altfel am primit eroarea:
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
Răspuns
Aici este un script PHP:
<?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); }