¿Cómo divido un flac con una señal?

71

Tengo un álbum completo flac y un archivo de referencia para ello. ¿Cómo puedo dividir esto en un flac por pista?

Soy un usuario de KDE, por lo que preferiría una forma KDE / Qt. Me gustaría ver también la línea de comandos y otras respuestas de la GUI, pero no son mi método preferido.

xenoterracida
fuente
superuser.com/questions/251362/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

72

Shnsplit puede leer un archivo cue directamente, lo que también significa que puede acceder a otros datos del archivo cue (no solo los puntos de interrupción) y generar nombres de archivo más agradables que 'split - *. Flac':

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

Por supuesto, esto hace que sea más difícil usar cuetag.sh si el archivo flac original está en el mismo directorio.

Michael H
fuente
17
Compañeros usuarios de Debian:sudo apt-get install cuetools shntool
jwbensley
13
Probablemente también desee etiquetar los archivos concuetag file.cue [0-9]*.flac
August Karlstrom
66
También necesitaba:sudo apt-get install flac
Becko
22

Solo conozco un camino CLI. Necesitarás cuetools y shntool.

cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Kambus
fuente
2
Gracias por esto Kambus. Lo he estado usando cuebreakpoints file.cue | shnsplit -o flac file.flacdurante mucho tiempo. ¡La segunda parte va a ayudar mucho!
boehj
1
cuetagparece romperse en los nombres de archivo que contienen espacios pero después de eliminarlos funcionó.
scai
20

Flacon es una GUI intuitiva de código abierto que hace exactamente eso: dividir un FLAC con un CUE.

Flacon extrae pistas individuales de un gran archivo de audio que contiene el álbum completo de música y las guarda como archivos de audio separados. Para hacer esto, utiliza información del archivo CUE apropiado.

Es compatible entre otras cosas:

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

Formatos compatibles: FLAC, WAV, WavPack, AAC, OGG o MP3.

Detección automática de juegos de caracteres para archivos CUE.

Para usarlo solo necesita abrir el *.cuearchivo con Flacon. Luego debería detectar automáticamente el *.flacarchivo grande (si no, puede especificarlo manualmente), y luego debe seleccionar el formato de salida Flac (y, opcionalmente, configurar el codificador), e iniciar el proceso de conversión.

Flacon v5.4.0

Yaze
fuente
1
¡Bienvenido a Unix & Linux Stack Exchange! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
slm
todavía actualizado en 2017
6

si se utilizan archivos de alta calidad, shnsplit está felizmente dando errores

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

afortunadamente, el binario flac admite --skip = mm: ss.ss y --until = mm: ss.ss para que un script pueda usar puntos de referencia 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
fuente
Este es el único método que funcionó para mí.
coffekid
3

Si tiene un cue establecido para usar k3ben la configuración de tipo de archivo, k3bdividirá automáticamente el archivo si abre el archivo cue y le permitirá volver a extraerlo.

xenoterracida
fuente
1

Hay un proyecto que funciona para varios archivos de entrada: split2flac

De la descripción del proyecto:

split2flac divide una gran imagen de audio APE / FLAC / TTA / WV / WAV (o una colección de dichos archivos, recursivamente) con hoja CUE en FLAC / M4A / MP3 / OGG_VORBIS / WAV pistas con etiquetado, cambio de nombre, conversión de charset de hoja de referencia, Imágenes de la portada del álbum. También utiliza un archivo de configuración, por lo que no es necesario pasar muchos argumentos cada vez, solo un archivo de entrada. Debería funcionar en cualquier shell compatible con POSIX.

Paulo Fidalgo
fuente
1

Descubrí macque (que es el comando que se shntoolusa para decodificar archivos APE) es mucho menos tolerante que ffmpegsi el archivo fuente contiene errores menores.

Normalmente ffmpegtodavía convertiría el archivo por completo mientras que macmuy probablemente arroje un error durante el procesamiento.

Así que terminé escribiendo un script para dividir el archivo APE analizando el archivo CUE y convirtiendo el archivo APE en archivos 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)
maullar
fuente
Es posible que desee cambiar if os.path.isfile(tmpfile)a if tmpfile != filename and os.path.isfile(tmpfile)para evitar eliminar el archivo original por error.
wolfmanx
La condición para configurar el artista de la pista debe ser si len(records)>0.
wolfmanx
1

shntool en Ubuntu 14.04

snhtoolle falta la macdependencia ejecutable (Monkey's Audio Console), y el único paquete que pude encontrar estaba en el 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

flacones una GUI para shntool, pero viene con todos los códecs que necesita ... de lo contrario recibí el error:

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 新疆 改造 中心 法轮功 六四 事件
fuente