J'ai un album complet flac et un fichier cue pour ça. Comment puis-je diviser cela en un flac par piste?
Je suis un utilisateur de KDE, donc je préférerais une méthode KDE/Qt. Je voudrais voir la ligne de commande et d'autres réponses GUI également, mais ce n'est pas ma méthode préférée.
Si vous avez défini un repère pour utiliser k3b
dans les paramètres de type de fichier, k3b
divisera automatiquement le fichier si vous ouvrez le fichier cue et vous permettra de ré-extraire.
Shnsplit peut lire un fichier cue directement, ce qui signifie également qu'il peut accéder aux autres données du fichier cue (pas seulement les points d'arrêt) et générer des noms de fichiers plus agréables que 'split - *. Flac':
shnsplit -f file.cue -t %n-%t -o flac file.flac
Certes, cela rend plus difficile l'utilisation de cuetag.sh si le fichier flac d'origine se trouve dans le même répertoire.
Je ne connais qu'une manière CLI. Vous aurez besoin de cuetools et shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Flacon est une interface graphique intuitive open-source qui fait exactement cela: diviser un FLAC avec un CUE.
Flacon extrait des pistes individuelles d'un gros fichier audio contenant tout l'album de musique et les enregistre en tant que fichiers audio séparés. Pour ce faire, il utilise les informations du fichier CUE approprié.
Il prend en charge entre autres:
Formats d'entré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 l'utiliser, il vous suffit d'ouvrir le *.cue
fichier avec Flacon. Il devrait alors détecter automatiquement le gros *.flac
fichier (sinon, vous pouvez le spécifier manuellement), puis vous devez sélectionner le format de sortie Flac (et éventuellement configurer l'encodeur) et démarrer le processus de conversion.
si des fichiers de haute qualité sont utilisés, shnsplit commet une erreur 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 pour qu'un script puisse utiliser des points de repère 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
J'ai trouvé que mac
(qui est la commande que shntool
utilisait pour décoder les fichiers APE) est beaucoup moins tolérante que ffmpeg
si le fichier source contient des erreurs mineures.
Normalement, ffmpeg
convertira toujours le fichier complètement tandis que mac
générera très probablement une erreur pendant le traitement.
J'ai 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 à l'aide de 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)
Il existe un projet qui fonctionne pour plusieurs fichiers d'entrée: split2flac
D'après la description du projet:
split2flac divise une grande image audio APE/FLAC/TTA/WV/WAV (ou une collection de tels fichiers, récursivement) avec la feuille CUE en pistes FLAC/M4A/MP3/OGG_VORBIS/WAV avec marquage, renommage, conversion de charset de la feuille de repère, images de couverture d'album. Il utilise également un fichier de configuration, donc pas besoin de passer beaucoup d'arguments à chaque fois, seulement un fichier d'entrée. Devrait fonctionner dans n'importe quel shell compatible POSIX.
shntool
sur Ubuntu 14.04
snhtool
n'a pas la dépendance exécutable mac
(Monkey's Audio Console), et le seul package que j'ai 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 livrée avec tous les codecs dont elle a besoin ... sinon j'ai eu l'erreur:
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