it-swarm-eu.dev

Jak mohu rozdělit flak s narážkou?

Mám pro to kompletní albu a soubor cue. Jak to mohu rozdělit na jednu stopu na stopu?

Jsem uživatel KDE, takže bych raději používal KDE/Qt. Chtěl bych vidět také příkazový řádek a další odpovědi na GUI, ale nejsou to moje preferovaná metoda.

75
xenoterracide

Pokud máte nastaveno, že chcete použít k3b v nastavení typu souboru, k3b automaticky otevře soubor, pokud otevřete soubor cue, a umožní vám jej znovu roztrhnout.

3
xenoterracide

Shnsplit umí číst soubor cue přímo, což také znamená, že může přistupovat k ostatním datům ze souboru cue (nejen k bodům zlomu) a vytvářet hezčí názvy souborů než 'split - *. Flac':

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

Je pravda, že je obtížnější používat cuetag.sh, pokud je původní soubor flac ve stejném adresáři.

79
Michael H

Znám jen způsob CLI. Budete potřebovat ketooly a shntool.

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

Flacon je intuitivní open-source GUI, které dělá přesně to: rozdělit FLAC s CUE.

Flacon extrahuje jednotlivé skladby z jednoho velkého zvukového souboru obsahujícího celé album hudby a uloží je jako samostatné zvukové soubory. K tomu používá informace z příslušného souboru CUE.

Podporuje mimo jiné:

Podporované vstupní formáty: WAV, FLAC, APE, WavPack, True Audio (TTA).

Podporované formáty: FLAC, WAV, WavPack, AAC, OGG nebo MP3.

Automatická detekce znakové sady pro soubory CUE.

Chcete-li jej použít, stačí otevřít *.cue soubor s Flacon. To by pak mělo automaticky detekovat velké *.flac file (pokud ne, můžete to zadat ručně), pak byste měli vybrat výstupní formát Flac (a volitelně nakonfigurovat kodér) a zahájit proces převodu.

Flacon v5.4.0

20
Yaze

pokud jsou používány vysoce kvalitní soubory, shnsplit s radostí chybuje

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

naštěstí flac binární podporuje --skip = mm: ss.ss a --until = mm: ss.ss, takže skript může používat cuebreakpoints jako je tento:

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

Našel jsem mac (což je příkaz, který shntool používaný pro dekódování souborů APE) je mnohem méně tolerantní než ffmpeg, pokud zdrojový soubor obsahuje drobné chyby.

Normálně ffmpeg by stále převáděl soubor úplně, zatímco mac velmi pravděpodobně vyvolá chybu během zpracování.

Nakonec jsem napsal skript pro rozdělení souboru APE analyzováním souboru CUE a převodem souboru APE na soubory FLAC oddělené tituly pomocí 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

Existuje projekt, který pracuje pro několik vstupních souborů: split2flac

Z popisu projektu:

split2flac rozdělí jeden velký zvukový obraz APE/FLAC/TTA/WV/WAV (nebo sbírku takových souborů rekurzivně) pomocí listu CUE na stopy FLAC/M4A/MP3/OGG_VORBIS/WAV s označováním, přejmenováním, převodem znakové sady do znakové sady, obrázky na obalu alba. Používá také konfigurační soubor, takže není třeba pokaždé předávat mnoho argumentů, pouze vstupní soubor. Měl by fungovat v jakémkoli prostředí kompatibilním s POSIX.

1
Paulo Fidalgo

shntool na Ubuntu 14.04

snhtool chybí spustitelná závislost mac (Monkey's Audio Console) a jediný balíček, který jsem mohl najít, byl v PPA flacon:

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 je GUI pro shntool, ale přichází se všemi kodeky, které potřebuje ... jinak jsem dostal chybu:

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