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

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.

Flacon v5.4.0

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *