Como divido um flac com um taco?

71

Eu tenho um álbum completo flac e um arquivo de sugestão para ele. Como posso dividir isso em um flac por faixa?

Como sou um usuário do KDE, prefiro o KDE / Qt. Gostaria de ver a linha de comando e outras respostas da GUI também, mas elas não são o meu método preferido.

xenoterracida
fonte
superuser.com/questions/251362/…
Ciro Santilli escreveu

Respostas:

72

O Shnsplit pode ler um arquivo cue diretamente, o que também significa que ele pode acessar os outros dados do arquivo cue (não apenas os pontos de interrupção) e gerar nomes de arquivos mais agradáveis ​​que 'split - *. Flac':

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

Concedido, isso dificulta o uso do cuetag.sh se o arquivo flac original estiver no mesmo diretório.

Michael H
fonte
17
Usuários debian:sudo apt-get install cuetools shntool
jwbensley
13
Provavelmente, você também deseja marcar os arquivos comcuetag file.cue [0-9]*.flac
Karlstrom
6
Eu também precisava:sudo apt-get install flac
becko 28/03
22

Eu só conheço uma maneira CLI. Você precisará de cuetools e shntool.

cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Kambus
fonte
2
Obrigado por este Kambus. Eu tenho usado cuebreakpoints file.cue | shnsplit -o flac file.flacpor um longo tempo. O segundo bit vai ajudar muito!
boehj
11
cuetagparece quebrar em nomes de arquivos contendo espaços, mas depois de removê-los, funcionou.
Scal
20

O Flacon é uma GUI de código aberto intuitiva que faz exatamente isso: divida um FLAC com um CUE.

Flacon extrai faixas individuais de um grande arquivo de áudio contendo todo o álbum de músicas e as salva como arquivos de áudio separados. Para fazer isso, ele usa informações do arquivo CUE apropriado.

Ele suporta, entre outras coisas:

Formatos de entrada suportados: WAV, FLAC, APE, WavPack, True Audio (TTA).

Formatos suportados: FLAC, WAV, WavPack, AAC, OGG ou MP3.

Detecção automática de conjunto de caracteres para arquivos CUE.

Para usá-lo, você só precisa abrir o *.cuearquivo com o Flacon. Ele deve detectar automaticamente o *.flacarquivo grande (caso contrário, você pode especificá-lo manualmente) e, em seguida, selecionar o formato de saída Flac (e, opcionalmente, configurar o codificador) e iniciar o processo de conversão.

Flacon v5.4.0

Yaze
fonte
11
Bem-vindo ao Unix e Linux Stack Exchange! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência.
slm
ainda atualizado em 2017
6

Se arquivos de alta qualidade estiverem sendo usados, o shnsplit estará felizmente errando com

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

felizmente, o binário flac suporta --skip = mm: ss.ss e --until = mm: ss.ss, para que um script possa usar pontos de interrupção como este:

[..]
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
fonte
Este é o único método que funcionou para mim.
coffekid
3

Se você tiver definido o cue para usar k3bnas configurações do tipo de arquivo, k3bo arquivo de divisão será dividido automaticamente se você abrir o arquivo de cue e permitirá que você rasgue novamente.

xenoterracida
fonte
1

Há um projeto que funciona para vários arquivos de entrada: split2flac

Na descrição do projeto:

O split2flac divide uma grande imagem de áudio APE / FLAC / TTA / WV / WAV (ou uma coleção desses arquivos, recursivamente) com uma folha CUE em faixas FLAC / M4A / MP3 / OGG_VORBIS / WAV com marcação, renomeação e conversão de charset da folha de sinalização, imagens de capa do álbum. Ele também usa o arquivo de configuração, portanto, não é necessário passar muitos argumentos todas as vezes, apenas um arquivo de entrada. Deve funcionar em qualquer shell compatível com POSIX.

Paulo Fidalgo
fonte
1

Eu descobri mac(que é o comando shntoolusado para decodificar arquivos APE) é muito menos tolerante do que ffmpegse o arquivo de origem contiver erros menores.

Normalmente ffmpeg, o arquivo ainda seria convertido completamente, enquanto macmuito provavelmente gera um erro durante o processamento.

Então, acabei escrevendo um script para dividir o arquivo APE analisando o arquivo CUE e convertendo o arquivo APE em arquivos FLAC separados por títulos 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)
Miau
fonte
Você pode alterar if os.path.isfile(tmpfile)para if tmpfile != filename and os.path.isfile(tmpfile)evitar a exclusão do arquivo original por erro.
wolfmanx
A condição para definir o artista da faixa deve ser if len(records)>0.
wolfmanx
1

shntool no Ubuntu 14.04

snhtoolestá faltando a macdependência executável (Monkey's Audio Console) e o único pacote que eu consegui encontrar foi no 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é uma GUI shntool, mas vem com todos os codecs necessários ... caso contrário, recebi o erro:

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 adicionou uma nova foto
fonte