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
- superuser.com/questions/251362/…
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.
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)
paraif 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); }