Tengo un archivo flac de álbum completo y un archivo cue. ¿Cómo puedo dividirlo en un flac por pista?
Soy un usuario de KDE, así que preferiría una forma de KDE / Qt. Me gustaría ver la línea de comandos y otras respuestas de GUI también, pero no son mi método preferido.
Comentarios
- superuser.com/questions/251362/…
Responder
Shnsplit puede leer un archivo cue directamente, lo que también significa que puede acceder a otros datos del archivo cue (no solo a 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.
Comentarios
- Compañeros usuarios de Debian:
sudo apt-get install cuetools shntool
- Probablemente también quieras etiquetar los archivos con
cuetag file.cue [0-9]*.flac
- También necesitaba:
sudo apt-get install flac
- cuetools ya depende de flac, entonces…
- En Debian 10 hay un error con flacs de 24 bits. Ganó ‘ t división. Sin embargo, funciona bien en archivos de 16 bits.
Respuesta
Solo conozco una forma CLI. Necesitarás cuetools y shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac
Comentarios
- Gracias por este Kambus. ‘ he estado usando
cuebreakpoints file.cue | shnsplit -o flac file.flac
durante mucho tiempo. ¡El segundo bit va a ayudar mucho! -
cuetag
parece romperse en nombres de archivos que contienen espacios, pero después de eliminarlos funcionó.
Answer
Flacon es una interfaz gráfica de usuario intuitiva de código abierto que exactamente eso: divide un FLAC con una CUE.
Flacon extrae pistas individuales de un archivo de audio grande que contiene todo el álbum de música y las guarda como audio separado archivos. Para hacer esto, usa información del archivo CUE apropiado.
Admite, entre otras cosas:
Formatos de entrada admitidos: WAV, FLAC, APE, WavPack, True Audio (TTA).
Formatos de salida admitidos: FLAC, WAV, WavPack, AAC, OGG o MP3.
Detección automática de juego de caracteres para archivos CUE.
Para usarlo solo necesita abrir el *.cue
archivo con Flacon. Luego debería detectar automáticamente el archivo grande *.flac
(si no es así, puede especificarlo manualmente), y luego debería seleccionar el formato de salida Flac (y opcionalmente configurar el codificador), e iniciar el proceso de conversión.
Comentarios
- Bienvenido a Unix & Linux Stack Exchange! Si bien, en teoría, esto puede responder la pregunta, sería preferible incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia.
- aún actualizado en 2017
- No ‘ no me gusta usar la interfaz de usuario para las cosas que puedo hacer en la terminal, pero estaba luchando con un álbum y esta era la única forma de dividir los archivos. Te mereces una cerveza ahora hombre
Responde
si se están utilizando archivos de alta calidad, shnsplit felizmente es un error con
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 interrupción 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
Comentarios
- Este es el único método que funcionó para mí.
Responder
Si tiene una señal configurada para usar k3b
en en la configuración del tipo de archivo, k3b
dividirá automáticamente el archivo si abre el archivo de referencia y le permitirá volver a copiar.
Responder
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 pistas FLAC / M4A / MP3 / OGG_VORBIS / WAV con etiquetado, cambio de nombre, conversión de juego de caracteres de hoja de referencia, imágenes de portada de á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.
Respuesta
Encontré mac
(que es el comando que shntool
usó para decodificar archivos APE) es mucho menos tolerante que ffmpeg
si el archivo fuente contiene errores menores.
Normalmente ffmpeg
aún convertiría el archivo por completo, mientras que mac
muy 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)
Comentarios
- Es posible que desee cambiar
if os.path.isfile(tmpfile)
aif tmpfile != filename and os.path.isfile(tmpfile)
para evitar eliminar el archivo original por error. - La condición para configurar el artista de la pista debe ser si
len(records)>0
.
Responder
shntool
en Ubuntu 14.04
snhtool
falta la mac
(consola de audio de Monkey) dependencia ejecutable, y el único paquete que pude encontrar estaba en el flacon
PPA:
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
es una GUI para shntool
, pero viene con todos los códecs que necesidades … de lo contrario, aparece 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
Respuesta
Aquí es un script PHP:
<?php $s_cue = $argv[1]; $a_cue = file($s_cue); $n_row = -1; foreach ($a_cue as $s_row) { $s_trim = trim($s_row); $a_row = str_getcsv($s_trim, " "); if (preg_match("/^FILE\s/", $s_row) == 1) { $s_file = $a_row[1]; } if (preg_match("/^\s+TRACK\s/", $s_row) == 1) { $n_row++; $a_table[$n_row]["track"] = $a_row[1]; } if (preg_match("/^\s+TITLE\s/", $s_row) == 1) { $a_table[$n_row]["title"] = $a_row[1]; } if (preg_match("/^\s+PERFORMER\s/", $s_row) == 1) { $a_table[$n_row]["artist"] = $a_row[1]; } if (preg_match("/^\s+INDEX\s/", $s_row) == 1) { $s_dur = $a_row[2]; $a_frame = sscanf($s_dur, "%d:%d:%d", $n_min, $n_sec, $n_fra); $n_index = $n_min * 60 + $n_sec + $n_fra / 75; $a_table[$n_row]["ss"] = $n_index; if ($n_row > 0) { $a_table[$n_row - 1]["to"] = $n_index; } } } $a_table[$n_row]["to"] = 10 * 60 * 60; foreach ($a_table as $m_row) { $a_cmd = [ "ffmpeg", "-i", $s_file, "-ss", $m_row["ss"], "-to", $m_row["to"], "-metadata", "artist=" . $m_row["artist"], "-metadata", "title=" . $m_row["title"], "-metadata", "track=" . $m_row["track"], $m_row["track"] . " " . $m_row["title"] . ".m4a" ]; $a_esc = array_map("escapeshellarg", $a_cmd); $s_esc = implode(" ", $a_esc); system($s_esc); }