전체 앨범 flac과 큐 파일이 있습니다.이를 트랙별로 flac로 분할하려면 어떻게해야합니까?

저는 KDE 사용자이므로 KDE / Qt 방식을 선호합니다. 명령 줄 및 기타 GUI 답변도보고 싶지만 선호하는 방법이 아닙니다.

코멘트

답변

Shnsplit은 큐 파일을 직접 읽을 수 있습니다. 즉, 중단 점뿐만 아니라 큐 파일에서 다른 데이터에 액세스 할 수 있고 :

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

그렇다면 원래 flac 파일이 같은 디렉토리에있는 경우 cuetag.sh를 사용하기가 더 어려워집니다.

댓글

  • 동료 데비안 사용자 : sudo apt-get install cuetools shntool
  • cuetag file.cue [0-9]*.flac
  • 로 파일에 태그 지정

  • 또한 필요 : sudo apt-get install flac
  • cuetools는 이미 flac, 그래서…
  • Debian 10에는 24 비트 flac에 버그가 있습니다. 분할되지 않았습니다. ‘ 하지만 16 비트 파일에서는 잘 작동합니다.

Answer

CLI 방식 만 알고 있습니다. cuetools와 shntool이 필요합니다.

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

댓글

  • 이 Kambus에 감사드립니다. 저는 ‘ cuebreakpoints file.cue | shnsplit -o flac file.flac를 오랫동안 사용해 왔습니다. 두 번째 비트는 많은 도움이 될 것입니다!
  • cuetag는 공백이 포함 된 파일 이름에서 깨지는 것처럼 보이지만 공백을 제거한 후에는 작동했습니다.

Answer

Flacon 은 직관적 인 오픈 소스 GUI입니다. CUE로 FLAC을 분할합니다.

Flacon은 전체 음악 앨범이 포함 된 하나의 큰 오디오 파일에서 개별 트랙을 추출하여 별도의 오디오로 저장합니다. 파일. 이를 위해 적절한 CUE 파일의 정보를 사용합니다.

다음을 지원합니다.

지원되는 입력 형식 : WAV, FLAC, APE, WavPack, True Audio (TTA).

지원되는 출력 형식 : FLAC, WAV, WavPack, AAC, OGG 또는 MP3.

CUE 파일에 대한 자동 문자 집합 감지.

사용하려면 *.cue 파일을 Flacon으로. 그런 다음 큰 *.flac 파일을 자동으로 감지하고 (아니라면 수동으로 지정할 수 있음) Flac 출력 형식을 선택하고 (선택적으로 인코더를 구성) 시작해야합니다. 변환 프로세스입니다.

Flacon v5.4.0

댓글

  • 환영합니다. Unix & Linux Stack Exchange로! 이론적으로는 질문에 대한 답을 찾을 수 있지만 여기에 답의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다 .
  • 2017 년에도 업데이트 됨
  • 나는 단말기에서 할 수있는 일에 UI를 사용하는 것을 좋아하지 않지만 ‘ 앨범으로 어려움을 겪고있었습니다. 이것이 파일을 분할하는 유일한 방법이었습니다. 당신은 이제 맥주를 마실 자격이 있습니다.

Answer

고품질 파일을 사용하는 경우 shnsplit은 오류가 발생합니다.

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

다행히 flac 바이너리는 –skip = mm : ss.ss 및 –until = mm : ss.ss를 지원하므로 스크립트에서 다음과 같은 큐 브레이크 포인트 :

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

댓글

  • 이 방법이 저에게 효과적이었습니다.

Answer

k3b를 사용하도록 큐를 설정 한 경우 파일 형식 설정에서 k3b는 큐 파일을 열면 파일을 자동으로 분할하고 다시 추출 할 수 있습니다.

Answer

여러 입력 파일에 대해 작동하는 프로젝트가 있습니다. split2flac

From 프로젝트 설명 :

split2flac는 하나의 큰 APE / FLAC / TTA / WV / WAV 오디오 이미지 (또는 이러한 파일 모음 , 재귀 적으로) CUE 시트와 함께 FLAC / M4A / MP3 / OGG_VORBIS / WAV 트랙에 태그 지정, 이름 변경, 큐 시트의 문자 집합 변환, 앨범 표지 이미지를 포함합니다. 또한 구성 파일을 사용하므로 매번 많은 인수를 전달할 필요가없고 입력 파일 만 전달합니다. POSIX 호환 쉘에서 작동합니다.

답변

찾았습니다. mac (APE 파일 디코딩에 사용되는 shntool 명령)은 ffmpeg 소스 파일에 사소한 오류가있는 경우.

일반적으로 ffmpeg는 여전히 파일을 완전히 변환하지만 mac는 처리 중에 오류가 발생할 가능성이 높습니다.

그래서 결국 CUE 파일을 파싱하고 APE 파일을 ffmpeg를 사용하여 제목으로 구분 된 FLAC 파일로 변환하여 APE 파일을 분할하는 스크립트를 작성했습니다.

#!/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) 

댓글

  • if os.path.isfile(tmpfile)if tmpfile != filename and os.path.isfile(tmpfile)로 변경할 수 있습니다. 오류 발생시 원본 파일 삭제를 방지합니다.
  • 트랙 아티스트 설정 조건은 다음과 같아야합니다. len(records)>0.

답변

shntool Ubuntu 14.04

snhtoolmac (Monkey의 오디오 콘솔)가 없습니다. 실행 가능한 종속성, 내가 찾을 수있는 유일한 패키지는 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 

flaconshntool 용 GUI이지만 모든 코덱과 함께 제공됩니다. 필요 … 그렇지 않으면 오류가 발생했습니다.

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 

Answer

여기 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); }  

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다