Comment diviser un flac avec une queue?

71

J'ai un album complet flac et un fichier cue pour cela. Comment puis-je diviser cela en un flac par piste?

Je suis un utilisateur KDE, je préférerais donc utiliser KDE / Qt. J'aimerais voir les réponses en ligne de commande et autres interfaces graphiques également, mais elles ne sont pas ma méthode préférée.

xénoterracide
la source
superuser.com/questions/251362/…
Ciro Santilli a annoncé le

Réponses:

72

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

Cela rend d'autant plus difficile l'utilisation de cuetag.sh si le fichier flac d'origine se trouve dans le même répertoire.

Michael H
la source
17
Les autres utilisateurs de Debian:sudo apt-get install cuetools shntool
jwbensley
13
Vous voudrez probablement aussi baliser les fichiers aveccuetag file.cue [0-9]*.flac
August Karlstrom
6
J'avais aussi besoin de:sudo apt-get install flac
becko
22

Je ne connais qu'un moyen de la CLI. Vous aurez besoin de cuetools et shntool.

cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Kambus
la source
2
Merci pour ce Kambus. Je l'utilise cuebreakpoints file.cue | shnsplit -o flac file.flacdepuis longtemps. La deuxième partie va beaucoup aider!
boehj
1
cuetagsemble se casser sur les noms de fichiers contenant des espaces mais après les avoir supprimés, cela a fonctionné.
scai
20

Flacon est une interface graphique open-source intuitive 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 distincts. Pour ce faire, il utilise les informations du fichier CUE approprié.

Il supporte 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 *.cuefichier avec Flacon. Il devrait ensuite détecter automatiquement le gros *.flacfichier (sinon, vous pouvez le spécifier manuellement), sélectionner le format de sortie Flac (et éventuellement configurer le codeur), puis lancer le processus de conversion.

Flacon v5.4.0

Yaze
la source
1
Bienvenue dans Unix & Linux Stack Exchange! Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
slm
toujours mis à jour en 2017
6

Si des fichiers de haute qualité sont utilisés, shnsplit se trompe heureusement 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 afin qu'un script puisse utiliser des points de rupture comme ci-dessous:

[..]
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
peter_tux
la source
C'est la seule méthode qui a fonctionné pour moi.
Coffekid
3

Si vous avez des paramètres de mémoire à utiliser k3bdans les paramètres de type de k3bfichier, le fichier sera automatiquement divisé si vous ouvrez le fichier de mémoire, et vous autoriserez une nouvelle extraction.

xénoterracide
la source
1

Il y a un projet qui fonctionne pour plusieurs fichiers d'entrée: split2flac

De la description du projet:

split2flac divise une grande image audio APE / FLAC / TTA / WV / WAV (ou une collection de tels fichiers, de manière récursive) avec une feuille CUE en FLAC / M4A / MP3 / OGG_VORBIS / WAV avec marquage, changement de nom, conversion de la feuille de repère, images de couverture d'album. Il utilise également le 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.

Paulo Fidalgo
la source
1

J'ai trouvé mac(qui est la commande shntoolutilisée pour décoder les fichiers APE) est beaucoup moins tolérant que ffmpegsi le fichier source contient des erreurs mineures.

Normalement ffmpeg, le fichier sera toujours converti complètement, mais macune erreur sera probablement générée pendant le traitement.

J'ai donc fini par écrire un script pour diviser un 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)
Miaou
la source
Vous voudrez peut-être changer if os.path.isfile(tmpfile)pour if tmpfile != filename and os.path.isfile(tmpfile)éviter de supprimer le fichier d'origine en cas d'erreur.
Wolfmanx
La condition pour définir l'artiste de piste doit être si len(records)>0.
Wolfmanx
1

shntool sur Ubuntu 14.04

snhtoolIl manque la macdépendance de l'exécutable (Monkey's Audio Console), et le seul paquet que j'ai pu trouver était dans le flaconPPA:

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

flaconest une interface graphique pour shntool, mais il est livré avec tous les codecs dont il a besoin ... sinon, j'ai 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
Ciro Santilli 改造 中心 六四 事件
la source