Jai un album complet et un fichier cue pour celui-ci. Comment puis-je le diviser en un flac par piste?

Je suis un utilisateur de KDE, donc je préférerais une méthode KDE / Qt. Jaimerais également voir la ligne de commande et dautres réponses de linterface graphique, mais ce nest pas ma méthode préférée.

Commentaires

Réponse

Shnsplit peut lire un fichier cue directement, ce qui signifie également quil peut accéder aux autres données du fichier cue (pas seulement les points darrêt) et générer des noms de fichiers plus beaux que split-*.flac:

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

Certes, cela rend plus difficile lutilisation de cuetag.sh si le fichier flac dorigine se trouve dans le même répertoire.

Commentaires

  • Autres utilisateurs Debian: sudo apt-get install cuetools shntool
  • Vous voulez probablement aussi baliser les fichiers avec cuetag file.cue [0-9]*.flac
  • Javais également besoin de: sudo apt-get install flac
  • cuetools dépend déjà de flac, donc…
  • Sur Debian 10, il y a un bogue avec des flacs 24 bits. Il n’a pas été scindé ‘. Cela fonctionne bien sur les fichiers 16 bits.

Réponse

Je ne connais quun moyen CLI. Vous aurez besoin de cuetools et de shntool.

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

Commentaires

  • Merci pour ce Kambus. Je ‘ utilise cuebreakpoints file.cue | shnsplit -o flac file.flac depuis longtemps. Le deuxième bit va beaucoup aider!
  • cuetag semble se briser sur les noms de fichiers contenant des espaces mais après les avoir supprimés, cela a fonctionné.

Answer

Flacon est une interface graphique open source intuitive qui exactement cela: divisez un FLAC avec un CUE.

Flacon extrait des pistes individuelles dun gros fichier audio contenant lintégralité de lalbum de musique et les enregistre en tant quaudio séparé des dossiers. Pour ce faire, il utilise les informations du fichier CUE approprié.

Il prend en charge entre autres:

Formats dentrée pris en charge: WAV, FLAC, APE, WavPack, True Audio (TTA).

Formats pris en charge: FLAC, WAV, WavPack, AAC, OGG ou MP3.

Détection automatique du jeu de caractères pour les fichiers CUE.

Pour lutiliser, il vous suffit douvrir le *.cue avec Flacon. Il devrait alors détecter automatiquement le gros fichier *.flac (sinon, vous pouvez le spécifier manuellement), puis vous devez sélectionner le format de sortie Flac (et éventuellement configurer lencodeur), et démarrer le processus de conversion.

Flacon v5.4.0

Commentaires

  • Bienvenue à Unix & Linux Stack Exchange! Bien que cela puisse théoriquement répondre à la question, il serait préférable dinclure les parties essentielles de la réponse ici et de fournir le lien pour référence.
  • toujours mis à jour en 2017
  • Je ‘ naime pas utiliser linterface utilisateur pour les choses que je peux faire sur le terminal, mais javais du mal avec un album, et cétait le seul moyen de fractionner les fichiers. Vous méritez une bière maintenant mec

Réponse

si des fichiers de haute qualité sont utilisés, shnsplit se trompe volontiers avec

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

heureusement, le binaire flac prend en charge –skip = mm: ss.ss et –until = mm: ss.ss donc un script peut utiliser cuebreakpoints comme celui-ci:

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

Commentaires

  • Cest la seule méthode qui a fonctionné pour moi.

Réponse

Si vous avez réglé le cue pour utiliser k3b dans dans les paramètres de type de fichier, k3b divisera automatiquement le fichier si vous ouvrez le fichier de repère, et vous permettra de le ripper.

Réponse

Il existe un projet qui fonctionne pour plusieurs fichiers dentrée: split2flac

De la description du projet:

split2flac divise une grande image audio APE / FLAC / TTA / WV / WAV (ou une collection de ces fichiers , récursivement) avec feuille CUE en pistes FLAC / M4A / MP3 / OGG_VORBIS / WAV avec étiquetage, changement de nom, conversion de jeu de caractères de feuille de repère, images de couverture dalbum. Il utilise également un fichier de configuration, donc pas besoin de passer beaucoup darguments à chaque fois, seulement un fichier dentrée. Doit fonctionner dans nimporte quel shell compatible POSIX.

Réponse

Jai trouvé mac (qui est la commande que shntool utilisée pour décoder les fichiers APE) est bien moins tolérante que ffmpeg si le fichier source contient des erreurs mineures.

Normalement ffmpeg convertirait toujours le fichier complètement tandis que mac lèverait très probablement une erreur pendant le traitement.

Jai donc fini par écrire un script pour fractionner le fichier APE en analysant le fichier CUE et en convertissant le fichier APE en fichiers FLAC séparés par des titres en utilisant 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) 

Commentaires

  • Vous voudrez peut-être remplacer if os.path.isfile(tmpfile) par if tmpfile != filename and os.path.isfile(tmpfile) pour éviter de supprimer le fichier dorigine en cas derreur.
  • La condition pour définir lartiste de la piste doit être if len(records)>0.

Réponse

shntool sur Ubuntu 14.04

snhtool manque le mac (console audio de Monkey) dépendance exécutable, et le seul package que jai pu trouver était dans le 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 est une interface graphique pour shntool, mais elle est fournie avec tous les codecs besoins … sinon jai eu lerreur:

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éponse

Ici est 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); }  

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *