플랩을 큐로 어떻게 분할합니까?


71

나는 완전한 앨범 flac와 그것을위한 큐 파일을 가지고있다. 이것을 트랙마다 플랙으로 나누려면 어떻게해야합니까?

저는 KDE 사용자이므로 KDE / Qt 방식을 선호합니다. 커맨드 라인과 다른 GUI 답변도보고 싶지만 선호하는 방법은 아닙니다.


답변:


72

Shnsplit은 큐 파일을 직접 읽을 수 있습니다. 이는 또한 중단 점뿐만 아니라 큐 파일에서 다른 데이터에 액세스하여 'split-*. flac'보다 멋진 파일 이름을 생성 할 수 있음을 의미합니다.

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

원래 flac 파일이 같은 디렉토리에 있으면 cuetag.sh를 사용하기가 더 어려워집니다.


17
동료 데비안 사용자 :sudo apt-get install cuetools shntool
jwbensley

13
당신은 아마 또한으로 파일을 태그 할cuetag file.cue [0-9]*.flac
8월 Karlstrom에게

6
sudo apt-get install flac
becko

22

나는 CLI 방식 만 알고 있습니다. cuetools와 shntool이 필요합니다.

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

2
이 Kambus에 감사드립니다. cuebreakpoints file.cue | shnsplit -o flac file.flac오랫동안 사용해 왔습니다 . 두 번째 비트는 많은 도움이 될 것입니다!
boehj

1
cuetag공백이 포함 된 파일 이름을 깰 것으로 보이지만 제거 한 후에 효과가 있습니다.
scai

20

Flacon 은 직관적 인 오픈 소스 GUI로서 FLAC를 CUE로 분할합니다.

Flacon은 전체 음악 앨범을 포함하는 하나의 큰 오디오 파일에서 개별 트랙을 추출하여 별도의 오디오 파일로 저장합니다. 이를 위해 적절한 CUE 파일의 정보를 사용합니다.

그것은 무엇보다도 지원합니다 :

지원되는 입력 형식 : WAV, FLAC, APE, WavPack, True Audio (TTA).

지원되는 형식 : FLAC, WAV, WavPack, AAC, OGG 또는 MP3.

CUE 파일에 대한 자동 문자 세트 감지.

사용하려면 *.cueFlacon으로 파일을 열면됩니다. 그런 다음 큰 *.flac파일 을 자동으로 감지하고 (그렇지 않은 경우 수동으로 지정할 수 있음) Flac 출력 형식을 선택하고 (선택적으로 인코더를 구성) 변환 프로세스를 시작해야합니다.

Flacon v5.4.0


1
유닉스 및 리눅스 스택 교환에 오신 것을 환영합니다! 이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
slm

여전히 2017 년에 업데이트

6

고품질 파일을 사용하는 경우 shnsplit이

shnsplit: error: m:ss.ff format can only be used with CD-quality files

다행스럽게도 flac 바이너리는 --skip = mm : ss.ss 및 --until = mm : ss.ss를 지원하므로 스크립트는 다음과 같은 큐브 레이크 포인트를 사용할 수 있습니다.

[..]
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

이것은 나를 위해 일한 유일한 방법입니다.
coffekid

3

k3b파일 유형 설정에서 사용하도록 큐를 설정 한 k3b경우 큐 파일을 열면 파일이 자동으로 분할되어 다시 리핑 할 수 있습니다.


1

여러 입력 파일에 대해 작동하는 프로젝트가 있습니다. split2flac

프로젝트 설명에서 :

split2flac는 CUE 시트와 함께 하나의 큰 APE / FLAC / TTA / WV / WAV 오디오 이미지 (또는 이러한 파일 모음을 재귀 적으로)를 FLAC / M4A / MP3 / OGG_VORBIS / WAV 트랙으로 태깅, 이름 변경, 큐 시트의 문자 세트 변환, 앨범 표지 이미지. 또한 구성 파일을 사용하므로 매번 많은 인수를 전달할 필요없이 입력 파일 만 전달하십시오. POSIX 호환 쉘에서 작동해야합니다.


1

내가 발견 mac(명령 인 shntool보다 훨씬 덜 관대 APE 파일을 디코딩에 사용) ffmpeg소스 파일이 사소한 오류가 포함되어있는 경우.

일반적으로 ffmpeg여전히 파일을 완전히 변환하지만 mac처리 중에 오류가 발생할 가능성이 큽니다.

그래서 CUE 파일을 구문 분석하고 APE 파일을 ffmpeg를 사용하여 제목으로 구분 된 FLAC 파일로 변환하여 APE 파일을 분할하는 스크립트를 작성했습니다.

#!/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)

당신은 변경할 수 있습니다 if os.path.isfile(tmpfile)하는 if tmpfile != filename and os.path.isfile(tmpfile)오류에 대한 원본 파일을 삭제하지 않도록.
wolfmanx

트랙 아티스트를 설정하기위한 조건은 if이어야합니다 len(records)>0.
wolfmanx

1

shntool 우분투 14.04에서

snhtoolmac(Monkey 's Audio Console) 실행 파일 종속성 이 누락 되었으며 flaconPPA 에서 찾을 수있는 유일한 패키지는 다음과 같습니다.

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에 대한 GUI shntool이지만 필요한 모든 코덱과 함께 제공됩니다. 그렇지 않으면 오류가 발생했습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.