it-swarm.it

Come faccio a dividere un flac con una stecca?

Ho un album completo e un file cue per questo. Come posso dividerlo in un flac per traccia?

Sono un utente KDE, quindi preferirei un modo KDE/Qt. Vorrei vedere anche la riga di comando e altre risposte della GUI, ma non sono il mio metodo preferito.

75
xenoterracide

Se hai impostato cue per usare k3b nelle impostazioni del tipo di file, k3b dividerà automaticamente il file se apri il file cue e ti consentirà di ri-rippare.

3
xenoterracide

Shnsplit può leggere direttamente un file cue, il che significa anche che può accedere agli altri dati dal file cue (non solo i punti di interruzione) e generare nomi di file più belli di 'split - *. Flac':

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

Concesso, ciò rende più difficile l'uso di cuetag.sh se il file flac originale si trova nella stessa directory.

79
Michael H

Conosco solo un modo CLI. Avrai bisogno di cuetools e shntool.

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

Flacon è una GUI open source intuitiva che fa esattamente questo: dividere un FLAC con un CUE.

Flacon estrae singole tracce da un grande file audio contenente l'intero album di musica e le salva come file audio separati. Per fare ciò, utilizza le informazioni dal file CUE appropriato.

Supporta tra l'altro:

Formati di input supportati: WAV, FLAC, APE, WavPack, True Audio (TTA).

Formati supportati: FLAC, WAV, WavPack, AAC, OGG o MP3.

Rilevamento automatico di set di caratteri per file CUE.

Per usarlo devi solo aprire il *.cue file con Flacon. Dovrebbe quindi rilevare automaticamente il grande *.flac file (in caso contrario, è possibile specificarlo manualmente), quindi selezionare il formato di output Flac (e facoltativamente configurare l'encoder) e avviare il processo di conversione.

Flacon v5.4.0

20
Yaze

se si utilizzano file di alta qualità, shnsplit si sbaglia felicemente

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

fortunatamente il binario flac supporta --skip = mm: ss.ss e --until = mm: ss.ss in modo che uno script possa usare punti cuebreak come questo:

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

Ho trovato mac (che è il comando che shntool utilizzato per decodificare i file APE) è molto meno tollerante di ffmpeg se il file di origine contiene errori minori.

Normalmente ffmpeg converte comunque completamente il file mentre mac molto probabilmente genera un errore durante l'elaborazione.

Così ho finito per scrivere uno script per dividere il file APE analizzando il file CUE e convertendo il file APE in file FLAC separati da titoli usando 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

Esiste un progetto che funziona per diversi file di input: split2flac

Dalla descrizione del progetto:

split2flac divide una grande immagine audio APE/FLAC/TTA/WV/WAV (o una raccolta di tali file, in modo ricorsivo) con foglio CUE in tracce FLAC/M4A/MP3/OGG_VORBIS/WAV con tag, rinominazione, conversione dei set di caratteri del foglio di cue, immagini di copertina dell'album. Utilizza anche il file di configurazione, quindi non è necessario passare molti argomenti ogni volta, solo un file di input. Dovrebbe funzionare in qualsiasi Shell conforme a POSIX.

1
Paulo Fidalgo

shntool su Ubuntu 14.04

snhtool manca la dipendenza eseguibile mac (Monkey's Audio Console) e l'unico pacchetto che ho trovato era nel PPA flacon:

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 è una GUI per shntool, ma viene fornito con tutti i codec necessari ... altrimenti ho ricevuto l'errore:

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