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

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.

Flacon v5.4.0

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) a if 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); }  

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *