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

Sou um usuário do KDE, então prefiro usar o KDE / Qt. Eu gostaria de ver a linha de comando e outras respostas da GUI também, mas eles não são meu método preferido.

Comentários

Resposta

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

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

Concedido, isso torna mais difícil usar cuetag.sh se o arquivo flac original estiver no mesmo diretório.

Comentários

  • Outros usuários do debian: sudo apt-get install cuetools shntool
  • Você provavelmente também deseja marcar os arquivos com cuetag file.cue [0-9]*.flac
  • Eu também precisava: sudo apt-get install flac
  • cuetools já depende de flac, então…
  • No Debian 10, há um bug com flacs de 24 bits. Ele ganhou ‘ t dividido. Ele funciona bem em arquivos de 16 bits.

Resposta

Eu só conheço um método CLI. Você precisará de cuetools e shntool.

cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac 

Comentários

  • Obrigado por este Kambus. Eu ‘ uso cuebreakpoints file.cue | shnsplit -o flac file.flac há muito tempo. O segundo bit vai ajudar muito!
  • cuetag parece quebrar em nomes de arquivos contendo espaços, mas depois de removê-los, funcionou.

Resposta

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

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

Ele oferece suporte, entre outras coisas:

Formatos de entrada compatíveis: WAV, FLAC, APE, WavPack, True Audio (TTA).

Formatos de saída compatíveis: 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 *.cue arquivo com Flacon. Ele deve então detectar automaticamente o grande arquivo *.flac (se não, você pode especificar isso manualmente), e então você deve selecionar o formato de saída Flac (e opcionalmente configurar o codificador) e iniciar o processo de conversão.

Flacon v5.4.0

Comentários

  • Bem-vindo para Unix & Linux Stack Exchange! Embora isso possa teoricamente responder à pergunta, seria preferível incluir as partes essenciais da resposta aqui e fornecer o link para referência.
  • ainda atualizado em 2017
  • Eu não ‘ não gosto de usar a IU para coisas que posso fazer no terminal, mas estava lutando com um álbum, e essa era a única maneira de dividir os arquivos. Você merece uma cerveja agora, cara

Resposta

se arquivos de alta qualidade estão sendo usados, shnsplit está 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 cuebreakpoints 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 

Comentários

  • Este é o único método que funcionou para mim. / li>

Resposta

Se você configurou o cue para usar k3b em nas configurações de tipo de arquivo, k3b dividirá automaticamente o arquivo se você abrir o arquivo cue e permitirá que você o copie novamente.

Resposta

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

De a descrição do projeto:

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

Resposta

Eu encontrei mac (que é o comando que shntool usado para decodificar arquivos APE) é muito menos tolerante do que ffmpeg se o arquivo de origem contiver pequenos erros.

Normalmente ffmpeg ainda converteria o arquivo completamente enquanto mac muito provavelmente geraria 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) 

Comentários

  • Você pode querer alterar if os.path.isfile(tmpfile) para if tmpfile != filename and os.path.isfile(tmpfile) para evitar a exclusão do arquivo original por engano.
  • A condição para definir o artista da faixa deve ser len(records)>0.

Resposta

shntool no Ubuntu 14.04

snhtool está faltando o mac (console de áudio do Monkey) dependência executável, e o único pacote que consegui encontrar foi no 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 é uma GUI para shntool, mas vem com todos os codecs que precisa … caso contrário, recebo 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 

Resposta

Aqui é um 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); }  

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *