it-swarm-vi.com

Làm thế nào để tôi chia một flac với một gợi ý?

Tôi đã có một album đầy đủ flac và một tập tin cue cho nó. Làm thế nào tôi có thể chia cái này thành một flac trên mỗi track?

Tôi là người dùng KDE, vì vậy tôi thích cách KDE/Qt hơn. Tôi cũng muốn xem dòng lệnh và các câu trả lời GUI khác, nhưng chúng không phải là phương pháp ưa thích của tôi.

75
xenoterracide

Nếu bạn đã đặt cue để sử dụng k3b trong cài đặt filetype, k3b sẽ tự động phân tách tệp nếu bạn mở tệp cue và cho phép bạn trích xuất lại.

3
xenoterracide

Shnsplit có thể đọc tệp cue trực tiếp, điều đó cũng có nghĩa là nó có thể truy cập dữ liệu khác từ tệp cue (không chỉ các điểm dừng) và tạo tên tệp đẹp hơn 'split - *. Flac':

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

Cấp, điều này làm cho việc sử dụng cuetag.sh trở nên khó khăn hơn nếu tệp flac gốc nằm trong cùng thư mục.

79
Michael H

Tôi chỉ biết một cách CLI. Bạn sẽ cần cuetools và shntool.

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

Flacon là một GUI nguồn mở trực quan thực hiện chính xác điều đó: tách FLAC với CUE.

Flacon trích xuất các bản nhạc riêng lẻ từ một tệp âm thanh lớn chứa toàn bộ album nhạc và lưu chúng dưới dạng các tệp âm thanh riêng biệt. Để làm điều này, nó sử dụng thông tin từ tệp CUE thích hợp.

Nó hỗ trợ trong số những thứ khác:

Các định dạng đầu vào được hỗ trợ: WAV, FLAC, APE, WavPack, True Audio (TTA).

Các định dạng được hỗ trợ: FLAC, WAV, WavPack, AAC, OGG hoặc MP3.

Tự động phát hiện bộ ký tự cho các tệp CUE.

Để sử dụng, bạn chỉ cần mở *.cue tập tin với Flacon. Sau đó, nó sẽ tự động phát hiện lớn *.flac file (nếu không, bạn có thể chỉ định thủ công điều này), sau đó bạn nên chọn định dạng đầu ra Flac (và tùy chọn cấu hình bộ mã hóa) và bắt đầu quá trình chuyển đổi.

Flacon v5.4.0

20
Yaze

nếu các tệp chất lượng cao đang được sử dụng, shnsplit rất vui khi gặp lỗi

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

may mắn thay, nhị phân flac hỗ trợ --skip = mm: ss.ss và --until = mm: ss.ss để tập lệnh có thể sử dụng cuebreakpoint như thế này:

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

Tôi thấy mac (là lệnh mà shntool được sử dụng để giải mã các tệp APE) ít dung sai hơn ffmpeg nếu tệp nguồn chứa lỗi nhỏ.

Thông thường ffmpeg vẫn sẽ chuyển đổi hoàn toàn tệp trong khi mac rất có thể gây ra lỗi trong quá trình xử lý.

Vì vậy, tôi đã kết thúc việc viết một tập lệnh để tách tệp APE bằng cách phân tích tệp CUE và chuyển đổi tệp APE thành các tệp FLAC được phân tách bằng các tiêu đề bằng 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)
1
Meow

Có một dự án hoạt động cho một số tệp đầu vào: split2flac

Từ mô tả dự án:

tách hình ảnh bìa album. Nó cũng sử dụng tệp cấu hình, do đó không cần phải truyền nhiều đối số mỗi lần, chỉ cần một tệp đầu vào. Nên hoạt động trong mọi Shell tuân thủ POSIX.

1
Paulo Fidalgo

shntool trên Ubuntu 14.04

snhtool đang thiếu phụ thuộc thực thi mac (Bảng điều khiển âm thanh của Khỉ) và gói duy nhất tôi có thể tìm thấy là trong 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 là GUI cho shntool, nhưng nó đi kèm với tất cả các codec cần thiết ... nếu không tôi đã gặp lỗi:

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