Come faccio a dividere un flac con una stecca?


Risposte:


72

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.


17
Compagni di debian:sudo apt-get install cuetools shntool
jwbensley,

13
Probabilmente vuoi anche taggare i file concuetag file.cue [0-9]*.flac
August Karlstrom,

6
Avevo anche bisogno di:sudo apt-get install flac
becko,

22

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

2
Grazie per questo Kambus. Sto usando cuebreakpoints file.cue | shnsplit -o flac file.flacda molto tempo. Il secondo bit aiuterà molto!
Boehj,

1
cuetagsembra spezzarsi di nomi di file contenenti spazi ma dopo averli rimossi ha funzionato.
scai,

20

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 *.cuefile con Flacon. Dovrebbe quindi rilevare automaticamente il *.flacfile di grandi dimensioni (in caso contrario, è possibile specificarlo manualmente), quindi selezionare il formato di output Flac (e facoltativamente configurare il codificatore) e avviare il processo di conversione.

Flacon v5.4.0


1
Benvenuti in Unix & Linux Stack Exchange! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
slm

ancora aggiornato nel 2017

6

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

Questo è l'unico metodo che ha funzionato per me.
coffekid,

3

Se hai impostato cue da utilizzare k3bnelle impostazioni del tipo di file, k3bdividerà automaticamente il file se apri il file cue e ti consentirà di ri-rippare.


1

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

Ho trovato mac(che è il comando shntoolutilizzato per la decodifica dei file APE) è molto meno tollerante rispetto a ffmpegse il file di origine contiene errori minori.

Normalmente ffmpegdovrebbe comunque convertire completamente il file mentre macmolto 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)

È possibile che si desideri modificare if os.path.isfile(tmpfile)per if tmpfile != filename and os.path.isfile(tmpfile)evitare di eliminare il file originale in caso di errore.
Wolfmanx,

La condizione per impostare l'artista della traccia deve essere if len(records)>0.
Wolfmanx,

1

shntool su Ubuntu 14.04

snhtoolmanca la macdipendenza eseguibile (Monkey's Audio Console) e l'unico pacchetto che ho trovato era nel 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

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.