Mam pełny album flac i plik cue. Jak mogę podzielić to na plik flac na ścieżkę?
Jestem użytkownikiem KDE, więc wolałbym sposób KDE / Qt. Chciałbym również zobaczyć odpowiedzi z wiersza poleceń i innych GUI, ale nie są one moją preferowaną metodą.
Komentarze
- superuser.com/questions/251362/…
Odpowiedź
Shnsplit może bezpośrednio czytać plik cue, co oznacza również, że może uzyskać dostęp do innych danych z pliku cue (nie tylko punktów przerwania) i generować ładniejsze nazwy plików niż split-*.flac
:
shnsplit -f file.cue -t %n-%t -o flac file.flac
Oczywiście, utrudnia to korzystanie z cuetag.sh, jeśli oryginalny plik flac znajduje się w tym samym katalogu.
Komentarze
- Inni użytkownicy Debiana:
sudo apt-get install cuetools shntool
- Prawdopodobnie również chcesz oznacz pliki tagiem
cuetag file.cue [0-9]*.flac
- Potrzebowałem też:
sudo apt-get install flac
- cuetools już zależy od flac, więc…
- W Debianie 10 jest błąd z 24-bitowymi flacami. Wygrał ' t split. Działa jednak dobrze na plikach 16-bitowych.
Odpowiedź
Znam tylko sposób CLI. Będziesz potrzebował cuetools i shntool.
cuebreakpoints file.cue | shnsplit -o flac file.flac cuetag.sh file.cue "split-*".flac
Komentarze
- Dzięki za ten Kambus. ' Używam
cuebreakpoints file.cue | shnsplit -o flac file.flac
przez długi czas. Drugi bit będzie bardzo pomocny! -
cuetag
wydaje się zepsuć nazwy plików zawierające spacje, ale po ich usunięciu zadziałało.
Odpowiedź
Flacon to intuicyjny graficzny interfejs użytkownika typu open source, dokładnie to: podziel FLAC za pomocą CUE.
Flacon wyodrębnia poszczególne ścieżki z jednego dużego pliku audio zawierającego cały album z muzyką i zapisuje je jako oddzielne audio akta. W tym celu wykorzystuje informacje z odpowiedniego pliku CUE.
Obsługuje między innymi:
Obsługiwane formaty wejściowe: WAV, FLAC, APE, WavPack, True Audio (TTA).
Obsługiwane formaty wyjściowe: FLAC, WAV, WavPack, AAC, OGG lub MP3.
Automatyczne wykrywanie zestawu znaków dla plików CUE.
Aby go użyć, wystarczy otworzyć *.cue
z Flacon. Powinien wtedy automatycznie wykryć duży plik *.flac
(jeśli nie, możesz to określić ręcznie), a następnie wybrać format wyjściowy Flac (i opcjonalnie skonfigurować koder) i uruchomić proces konwersji.
Komentarze
- Witamy na Unix & Linux Stack Exchange! Chociaż może to teoretycznie odpowiedzieć na pytanie, byłoby lepiej zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia.
- wciąż aktualizowany w 2017 roku
- Nie ' nie lubię używać interfejsu użytkownika do rzeczy, które mogę robić na terminalu, ale walczyłem z albumem i był to jedyny sposób na podzielenie plików. Zasługujesz teraz na piwo, stary
Odpowiedz
Jeśli używane są pliki wysokiej jakości, shnsplit na szczęście błądzi precz z
shnsplit: error: m:ss.ff format can only be used with CD-quality files
na szczęście plik binarny flac obsługuje opcje –skip = mm: ss.ss i –until = mm: ss.ss, więc skrypt może używać cuebreakpoints, takie jak ta:
[..] 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
Komentarze
- To jedyna metoda, która działała w moim przypadku.
Odpowiedź
Jeśli masz ustawioną cue na używanie k3b
w w ustawieniach typu pliku k3b
automatycznie podzieli plik, jeśli otworzysz plik cue, i umożliwi ponowne zgranie.
Odpowiedź
Istnieje projekt, który działa dla kilku plików wejściowych: split2flac
Od opis projektu:
split2flac dzieli jeden duży obraz audio APE / FLAC / TTA / WV / WAV (lub zbiór takich plików , rekurencyjnie) z arkuszem CUE na ścieżki FLAC / M4A / MP3 / OGG_VORBIS / WAV z tagowaniem, zmianą nazwy, konwersją zestawu znaków cue Sheet, obrazami okładek albumów. Używa również pliku konfiguracyjnego, więc nie trzeba za każdym razem przekazywać wielu argumentów, tylko plik wejściowy. Powinien działać w dowolnej powłoce zgodnej z POSIX.
Odpowiedź
Znalazłem mac
(czyli polecenie shntool
używane do dekodowania plików APE) jest znacznie mniej tolerancyjne niż ffmpeg
, jeśli plik źródłowy zawiera drobne błędy.
Zwykle ffmpeg
nadal całkowicie konwertuje plik, podczas gdy mac
najprawdopodobniej zgłasza błąd podczas przetwarzania.
Skończyło się na napisaniu skryptu do dzielenia pliku APE, analizując plik CUE i konwertując plik APE na pliki FLAC oddzielone tytułami za 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)
Komentarze
- Możesz zmienić
if os.path.isfile(tmpfile)
naif tmpfile != filename and os.path.isfile(tmpfile)
aby uniknąć usunięcia oryginalnego pliku w przypadku błędu. - Warunkiem ustawienia wykonawcy utworu musi być
len(records)>0
.
Odpowiedź
shntool
na Ubuntu 14.04
W snhtool
brakuje elementu mac
(konsola audio Monkey „) wykonywalna zależność, a jedyny pakiet, jaki udało mi się znaleźć, to 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
to GUI dla shntool
, ale zawiera wszystkie kodeki potrzebuje … w przeciwnym razie wystąpił błąd:
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
Odpowiedź
Tutaj to skrypt PHP:
<?php $s_cue = $argv[1]; $a_cue = file($s_cue); $n_row = -1; foreach ($a_cue as $s_row) { $s_trim = trim($s_row); $a_row = str_getcsv($s_trim, " "); if (preg_match("/^FILE\s/", $s_row) == 1) { $s_file = $a_row[1]; } if (preg_match("/^\s+TRACK\s/", $s_row) == 1) { $n_row++; $a_table[$n_row]["track"] = $a_row[1]; } if (preg_match("/^\s+TITLE\s/", $s_row) == 1) { $a_table[$n_row]["title"] = $a_row[1]; } if (preg_match("/^\s+PERFORMER\s/", $s_row) == 1) { $a_table[$n_row]["artist"] = $a_row[1]; } if (preg_match("/^\s+INDEX\s/", $s_row) == 1) { $s_dur = $a_row[2]; $a_frame = sscanf($s_dur, "%d:%d:%d", $n_min, $n_sec, $n_fra); $n_index = $n_min * 60 + $n_sec + $n_fra / 75; $a_table[$n_row]["ss"] = $n_index; if ($n_row > 0) { $a_table[$n_row - 1]["to"] = $n_index; } } } $a_table[$n_row]["to"] = 10 * 60 * 60; foreach ($a_table as $m_row) { $a_cmd = [ "ffmpeg", "-i", $s_file, "-ss", $m_row["ss"], "-to", $m_row["to"], "-metadata", "artist=" . $m_row["artist"], "-metadata", "title=" . $m_row["title"], "-metadata", "track=" . $m_row["track"], $m_row["track"] . " " . $m_row["title"] . ".m4a" ]; $a_esc = array_map("escapeshellarg", $a_cmd); $s_esc = implode(" ", $a_esc); system($s_esc); }