it-swarm-id.com

Bagaimana cara membagi flac dengan isyarat?

Saya punya flac album lengkap dan file isyarat untuknya. Bagaimana saya bisa membagi ini menjadi flac per track?

Saya pengguna KDE, jadi saya lebih suka cara KDE/Qt. Saya ingin melihat baris perintah dan jawaban GUI lainnya juga, tetapi itu bukan metode pilihan saya.

75
xenoterracide

Jika Anda memiliki petunjuk untuk menggunakan k3b dalam pengaturan filetype, k3b akan secara otomatis membagi file jika Anda membuka file cue, dan memungkinkan Anda untuk melakukan rip ulang.

3
xenoterracide

Shnsplit dapat membaca file cue secara langsung, yang juga berarti dapat mengakses data lain dari file cue (bukan hanya breakpoints) dan menghasilkan nama file yang lebih bagus daripada 'split - *. Flac':

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

Memang, ini membuatnya lebih sulit untuk menggunakan cuetag.sh jika file flac asli berada di direktori yang sama.

79
Michael H

Saya hanya tahu cara CLI. Anda membutuhkan cuetools dan shntool.

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

Flacon adalah GUI open-source intuitif yang melakukan hal itu: pisahkan FLAC dengan CUE.

Flacon mengekstrak masing-masing trek dari satu file audio besar yang berisi seluruh album musik dan menyimpannya sebagai file audio terpisah. Untuk melakukan ini, ia menggunakan informasi dari file CUE yang sesuai.

Ini mendukung antara lain:

Format input yang didukung: WAV, FLAC, APE, WavPack, True Audio (TTA).

Format yang didukung: FLAC, WAV, WavPack, AAC, OGG atau MP3.

Deteksi set karakter otomatis untuk file CUE.

Untuk menggunakannya Anda hanya perlu membuka *.cue file dengan Flacon. Maka seharusnya secara otomatis mendeteksi besar *.flac file (jika tidak, Anda dapat menentukan ini secara manual), dan kemudian Anda harus memilih format output Flac (dan secara opsional mengkonfigurasi pembuat enkode), dan memulai proses konversi.

Flacon v5.4.0

20
Yaze

jika file berkualitas tinggi sedang digunakan, shnsplit dengan senang hati tidak melakukan kesalahan

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

untungnya binari flac mendukung --skip = mm: ss.ss dan --until = mm: ss.ss sehingga skrip dapat menggunakan cuebreakpoints seperti ini:

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

Saya menemukan mac (yang merupakan perintah yang shntool digunakan untuk mendekode file APE) jauh lebih toleran daripada ffmpeg jika file sumber mengandung kesalahan kecil.

Biasanya ffmpeg masih akan mengkonversi file sepenuhnya sementara mac sangat mungkin menimbulkan kesalahan selama pemrosesan.

Jadi saya akhirnya menulis skrip untuk memisahkan file APE dengan mem-parsing file CUE dan mengonversi file APE ke file FLAC yang dipisahkan oleh judul menggunakan 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

Ada proyek yang berfungsi untuk beberapa file input: split2flac

Dari deskripsi proyek:

split2flac membagi satu gambar audio besar APE/FLAC/TTA/WV/WAV (atau koleksi file tersebut, secara rekursif) dengan lembar CUE menjadi FLAC/M4A/MP3/OGG_VORBIS/WAV trek dengan penandaan, penggantian nama, konversi charset sheet cue, gambar sampul album. Ini juga menggunakan file konfigurasi, jadi tidak perlu melewati banyak argumen setiap kali, hanya file input. Harus bekerja di Shell yang sesuai dengan POSIX.

1
Paulo Fidalgo

shntool di Ubuntu 14.04

snhtool tidak memiliki dependensi yang dapat dieksekusi mac (Konsol Monyet), dan satu-satunya paket yang saya temukan adalah dalam 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 adalah GUI untuk shntool, tetapi ia datang dengan semua codec yang dibutuhkan ... kalau tidak saya mendapat kesalahan:

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