web-dev-qa-db-fra.com

Comment diviser un flac avec une queue?

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.

75
xenoterracide

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.

3
xenoterracide

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.

79
Michael H

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
22
Kambus

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.

Flacon v5.4.0

20
Yaze

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
6
peter_tux

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)
1
Meow

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.

1
Paulo Fidalgo

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