Jag har en fullständig albumflac och en cue-fil för det. Hur kan jag dela upp det i en flac per spår?

Jag är KDE-användare, så jag föredrar ett KDE / Qt-sätt. Jag skulle också vilja se kommandoraden och andra GUI-svar, men de är inte min föredragna metod.

Kommentarer

Svar

Shnsplit kan läsa en cue-fil direkt, vilket också betyder att den kan komma åt andra data från cue-filen (inte bara brytpunkter) och generera trevligare filnamn än split-*.flac:

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

Beviljas, det gör det svårare att använda cuetag.sh om den ursprungliga flac-filen finns i samma katalog.

Kommentarer

  • Meddebiananvändare: sudo apt-get install cuetools shntool
  • Du vill antagligen också tagga filerna med cuetag file.cue [0-9]*.flac
  • Jag behövde också: sudo apt-get install flac
  • cuetools beror redan på flac, så …
  • På Debian 10 finns ett fel med 24 bitar flacs. Det vann ’ t split. Det fungerar dock bra på 16 bitars filer.

Svar

Jag vet bara ett CLI-sätt. Du behöver cuetools och shntool.

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

Kommentarer

  • Tack för den här Kambus. Jag ’ har använt cuebreakpoints file.cue | shnsplit -o flac file.flac under lång tid. Den andra biten kommer att hjälpa mycket!
  • cuetag verkar gå sönder på filnamn som innehåller mellanslag men efter att ha tagit bort dem fungerade det.

Svar

Flacon är ett intuitivt GUI med öppen källkod som gör exakt det: dela en FLAC med en CUE.

Flacon extraherar enskilda spår från en stor ljudfil som innehåller hela musikalbumet och sparar dem som separat ljud filer. För att göra detta använder den information från lämplig CUE-fil.

Den stöder bland annat:

Ingångsformat som stöds: WAV, FLAC, APE, WavPack, True Audio (TTA).

Format som stöds: FLAC, WAV, WavPack, AAC, OGG eller MP3.

Automatisk detektering av teckenuppsättning för CUE-filer.

För att använda den behöver du bara öppna *.cue fil med Flacon. Den ska sedan automatiskt upptäcka den stora *.flac -filen (om inte, kan du ange detta manuellt), och sedan ska du välja Flac-utdataformat (och eventuellt konfigurera kodaren) och starta omvandlingsprocess.

Flacon v5.4.0

Kommentarer

  • Välkommen till Unix & Linux Stack Exchange! Även om detta teoretiskt kan svara på frågan, skulle det vara att föredra att inkludera de väsentliga delarna av svaret här och tillhandahålla länken för referens.
  • uppdaterades fortfarande 2017
  • Jag gillar ’ vill inte använda gränssnittet för saker jag kan göra på terminalen, men jag kämpade med ett album och detta var det enda sättet att dela upp filerna. Du förtjänar en öl nu man

Svar

om högkvalitativa filer används, shnsplit felar gärna ut med

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

lyckligtvis stöder flac binärt –skip = mm: ss.ss och –until = mm: ss.ss så att ett skript kan använda cuebreakpoints så här:

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

  • Det här är den enda metoden som fungerade för mig.

Svar

Om du har kö inställt på att använda k3b i i filtypinställningarna delar k3b filen automatiskt om du öppnar köfilen och låter dig rippa om den igen.

Svara

Det finns ett projekt som fungerar för flera inmatningsfiler: split2flac

Från projektbeskrivningen:

split2flac delar upp en stor ljudbild av APE / FLAC / TTA / WV / WAV (eller en samling av sådana filer , rekursivt) med CUE-ark i FLAC / M4A / MP3 / OGG_VORBIS / WAV-spår med taggning, byte av namn, charset-konvertering av köark, albumomslag. Det använder också konfigurationsfil, så du behöver inte skicka många argument varje gång, bara en inmatningsfil. Bör fungera i något POSIX-kompatibelt skal.

Svar

Jag hittade mac (vilket är kommandot som shntool används för avkodning av APE-filer) är mycket mindre tolerant än ffmpeg om källfilen innehåller mindre fel.

Normalt skulle ffmpeg fortfarande konvertera filen helt medan mac mycket sannolikt kastar ett fel under bearbetningen.

Så jag slutade skriva ett skript för att dela upp APE-filen genom att analysera CUE-filen och konvertera APE-filen till FLAC-filer åtskilda av titlar med 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

  • Du kanske vill ändra if os.path.isfile(tmpfile) till if tmpfile != filename and os.path.isfile(tmpfile) för att undvika att radera originalfilen vid fel.
  • Villkoret för att ställa in spårartisten måste vara om len(records)>0.

Svar

shntool på Ubuntu 14.04

snhtool saknas mac (Monkeys Audio Console) körbart beroende, och det enda paketet jag kunde hitta 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 är ett GUI för shntool, men det kommer med alla codecs behöver … annars fick jag felet:

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

Här är ett 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); }  

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *