Bagaimana cara membagi flac dengan isyarat?

71

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.

xenoterracide
sumber
superuser.com/questions/251362/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

72

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.

Michael H
sumber
17
Rekan pengguna debian:sudo apt-get install cuetools shntool
jwbensley
13
Anda mungkin juga ingin memberi tag file dengancuetag file.cue [0-9]*.flac
Agustus Karlstrom
6
Saya juga membutuhkan:sudo apt-get install flac
becko
22

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

cuebreakpoints file.cue | shnsplit -o flac file.flac
cuetag.sh file.cue "split-*".flac
Kambus
sumber
2
Terima kasih untuk Kambus ini. Saya telah menggunakan cuebreakpoints file.cue | shnsplit -o flac file.flacuntuk waktu yang lama. Bit ke-2 akan banyak membantu!
boehj
1
cuetagtampaknya merusak nama file yang mengandung spasi tetapi setelah menghapusnya itu berhasil.
scai
20

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 *.cuefile dengan Flacon. Seharusnya kemudian secara otomatis mendeteksi *.flacfile besar (jika tidak, Anda dapat menentukan ini secara manual), dan kemudian Anda harus memilih format output Flac (dan secara opsional mengkonfigurasi encoder), dan memulai proses konversi.

Flacon v5.4.0

Yaze
sumber
1
Selamat datang di Unix & Linux Stack Exchange! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
slm
masih diperbarui pada 2017
6

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
peter_tux
sumber
Ini adalah satu-satunya metode yang bekerja untuk saya.
coffekid
3

Jika Anda memiliki set isyarat untuk digunakan k3bdalam pengaturan tipe file, k3bakan secara otomatis membagi file jika Anda membuka file isyarat, dan memungkinkan Anda untuk meretas ulang.

xenoterracide
sumber
1

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, penamaan, konversi charset lembar isyarat, 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.

Paulo Fidalgo
sumber
1

Saya menemukan mac(yang merupakan perintah yang shntooldigunakan untuk decoding file APE) jauh lebih toleran daripada ffmpegjika file sumber mengandung kesalahan kecil.

Biasanya ffmpegmasih akan mengkonversi file sepenuhnya sementara macsangat 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 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)
meong
sumber
Anda mungkin ingin mengubah if os.path.isfile(tmpfile)untuk if tmpfile != filename and os.path.isfile(tmpfile)menghindari menghapus file asli pada kesalahan.
wolfmanx
Kondisi untuk menetapkan artis trek harus jika len(records)>0.
wolfmanx
1

shntool di Ubuntu 14.04

snhtooltidak memiliki macdependensi yang dapat dieksekusi (Monkey's Audio Console), dan satu-satunya paket yang saya temukan adalah dalam 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

flaconadalah GUI untuk shntool, tetapi ia datang dengan semua codec yang dibutuhkan ... kalau tidak saya punya 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
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber