как мне расколоть флак с помощью кия?

<p>у меня есть полный альбом flac и файл для него. как я могу разделить это на один трек?</p><p>я пользователь kde, поэтому я бы предпочел способ kde/qt. я хотел бы видеть командную строку и другие ответы gui, но они не мой предпочтительный метод.</p>

<p>если у вас есть настройка на использование <code>k3b</code> в настройках типов файлов, <code>k3b</code> автоматически разделит файл, если вы откроете файл cue, и позволит вам повторно скопировать его.</p>

<p>shnsplit может читать файл cue напрямую, что также означает, что он может обращаться к другим данным из файла cue (не только к точкам останова) и генерировать более подходящие имена файлов, чем 'split - *. flac':</p><pre><code>shnsplit -f file.cue -t %n-%t -o flac file.flac </code></pre><p>конечно, это затрудняет использование cuetag.sh, если исходный файл flac находится в том же каталоге.</p>

<p>я знаю только способ cli. вам понадобятся cuetools и shntool.</p><pre><code>cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac </code></pre>

<p> <a href="http://flacon.github.io/">flacon</a> - это интуитивно понятный графический интерфейс с открытым исходным кодом, который делает именно это: разделить flac с помощью cue.</p><blockquote> <p>flacon извлекает отдельные дорожки из одного большого аудиофайла, содержащего весь музыкальный альбом, и сохраняет их в виде отдельных аудиофайлов. для этого он использует информацию из соответствующего файла cue.</p> </blockquote><p>поддерживает среди прочего:</p><blockquote> <p>поддерживаемые форматы ввода: wav, flac, ape, wavpack, true audio (tta).</p> <p>поддерживаемые форматы: flac, wav, wavpack, aac, ogg или mp3.</p> <p>автоматическое определение набора символов для файлов cue.</p> </blockquote><p>чтобы использовать его, вам нужно всего лишь открыть <code>*.cue</code> файл с flacon. затем он должен автоматически обнаружить большой <code>*.flac</code> файл (если нет, вы можете указать это вручную), а затем вы должны выбрать выходной формат flac (и при необходимости настроить кодировщик) и запустить процесс преобразования.</p><p><img src="https://i.stack.imgur.com/tbjkg.png" alt="flacon v5.4.0"></p>

<p>если используются высококачественные файлы, shnsplit с удовольствием выдает ошибку</p><pre><code>shnsplit: error: m:ss.ff format can only be used with cd-quality files </code></pre><p>к счастью, бинарный файл flac поддерживает --skip = mm: ss.ss и --until = mm: ss.ss, поэтому скрипт может использовать точки разметки, например:</p><pre><code>[..] 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 </code></pre>

<p>я обнаружил, что <code>mac</code> (это команда, которую <code>shntool</code> используется для декодирования файлов ape) гораздо менее терпимо, чем <code>ffmpeg</code>, если исходный файл содержит незначительные ошибки.</p><p>обычно <code>ffmpeg</code> по-прежнему полностью конвертирует файл, в то время как <code>mac</code> очень вероятно выдает ошибку во время обработки.</p><p>в итоге я написал скрипт для разделения файла ape путем анализа файла cue и преобразования файла ape в файлы flac, разделенные заголовками, с помощью ffmpeg:</p><pre><code>#!/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) </code></pre>

<p>есть проект, который работает для нескольких входных файлов: <a href="https://github.com/ftrvxmtrx/split2flac">split2flac</a> </p><p>из описания проекта:</p><blockquote> <p>split2flac разбивает одно большое аудиоизображение ape/flac/tta/wv/wav (или коллекцию таких файлов, рекурсивно) с листом cue на дорожки flac/m4a/mp3/ogg\_vorbis/wav с пометкой, переименованием, преобразованием кодировки листа битов, обложки альбомов. он также использует файл конфигурации, поэтому нет необходимости каждый раз передавать множество аргументов, только входной файл. должно работать в любой posix-совместимой оболочке.</p> </blockquote>

<p><strong><code>shntool</code> в ubuntu 14.04</strong></p><p>в <code>snhtool</code> отсутствует исполняемая зависимость <code>mac</code> (monkey's audio console), и единственный пакет, который я смог найти, был в <code>flacon</code> ppa:</p><pre><code>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 </code></pre><p><code>flacon</code> является графическим интерфейсом для <code>shntool</code>, но поставляется со всеми необходимыми кодеками ... в противном случае я получил ошибку:</p><pre><code>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 </code></pre>