모든 음악 컬렉션을 무손실이지만 압축 된 파일 형식으로 추출 / 보관하고 싶습니다. 즉, 파일이 모두 완벽해야합니다. , 원본 데이터의 무손실 표현이지만 압축되지 않은 WAV (E)보다 적은 공간을 소비해야합니다.

WAV (E)는 무료가 아닙니다 (Microsoft 독점 제품), 플랫폼 간 압축이 번거 롭거나 불가능하며 파일 크기가 크기 때문에 이동하지 않습니다. 4GB로 제한됩니다. 따라서 FLAC (Free Lossless Audio Codec)를 선택합니다.

전체 컬렉션을 디지털화하는 것은 엄청난 작업이고 FLAC는 9 가지 압축 수준 (0 ~ 8)을 제공하므로 황금 질문이 있습니다. :

어떤 압축 수준을 현명하게 선택해야합니까?

설명

h3>

  • 이 질문은 ‘ 사운드 디자인을 전혀 다루지 않지만 일부 사운드 디자이너가 직면하는 선택에 영향을줍니다. 계속 늘어나는 녹음 라이브러리를 가장 잘 처리하는 방법입니다. 개인적으로 ‘ 스토리지 문제로 인해 WAVE를 통해 FLAC을 사용하지만 ‘ 안타깝게도 ‘ 압축 수준에 대한 통찰력이 없습니다.
  • 흥미롭게 게시했습니다. 먼저 음악 에 있지만 그곳 사람들은 사운드 디자인으로 옮기는 것이 좋습니다.

답변

FLAC 압축 수준은 인코딩 시간 파일 크기 . 디코딩 시간은 압축률과 거의 무관합니다. 다음에서는 압축 수준 0, …, 8을 FLAC-0, …, FLAC-8이라고합니다.

간단히 : FLAC-4 !


쉬운 솔루션

분명히 :

  • 인코딩 시간에 신경 쓰지 않고 공간이 돈이므로 가장 높은 압축 수준을 사용합니다. FLAC-8 .

  • 공간에 대해 신경 쓰지 않고 가능한 한 빨리 뒤로 가고 싶다면 가장 낮은 압축 수준을 사용합니다. FLAC-0 .


어려운 솔루션

파일 크기와 인코딩 시간 사이의 중간입니까? 이 질문에 대한 Nathan Zachary의 기사 를 우연히 발견했지만 그는 두 파일을 비교하고 한 번만 인코딩합니다 (인코딩 시간은 컴퓨터의 사이드로드에 따라 크게 다릅니다. ) 및 표는 그래프에 비해 읽기 어렵습니다.

그래서 영감을 받아 5 개의 완전한 앨범 각기 다른 장르로 각 파일 / 트랙을 10 번 인코딩했습니다.

절차 :

  • abcde 및 적절한 cdparanoia 설정을 압축되지 않은 WAV로 설정합니다.
  • 각 압축 수준 (FLAC-0에서 FLAC-8로)에 대해 모든 파일을 10 번 변환하고 FLAC-0에 상대적인 평균 인코딩 시간을 취합니다. F에 상대적인 파일 크기 LAC-0 .
    • 이를 위해 인터넷 연결, 모든 주기적 작업 (cronjobs) 및 기타 거의 모든 작업을 비활성화하여 실제로 대부분 압축이 실행되고 가능한 한 간섭을 최소화했습니다.

li>

이 측정은 사용 된 하드웨어와 거의 독립적이어야합니다. flac <infile> --compression-level-X -f -o flacX.flac를 사용하여 Arch Linux에서 flac 버전 1.3.2를 사용했습니다.

효율성

상대 크기 ( 상대 인코딩 / 압축 시간 포함) , 불량 에 대한 값을 얻습니다. 그러나 이러한 단점은 대부분 상대적인 시간에 의해 좌우되기 때문에 그래프가 크게 겹칠 것입니다. 그래서 그래프를 정리하기 위해 방금 나쁜 좋은 으로 미러링했습니다. 여기서는 효율성 이라고 부릅니다.

발견 사항

FLAC-4부터 압축 시간이 폭발하지만 두 가지 놀라운 점이 있습니다.

  1. FLAC-3과 FLAC-3 사이의 파일 크기가 크게 감소했습니다. 음악 장르에 따른 FLAC-4 : 클래식 음악은 FLAC-4를 사용하여 압축률이 훨씬 낮습니다. 이는 FLAC가 더 복잡한 (덜 선형적인) 음악에서는 덜 잘 수행되는 압축에 선형 예측 모델을 사용하기 때문이라고 가정합니다.

  2. 비 클래식 음악의 경우 FLAC-3 파일 크기 측면에서 FLAC-2보다 훨씬 더 나쁩니다.

flac_rank

권장 사항

압축 수준을 사용하는 것이 좋습니다. FLAC-4 .

높을수록 인코딩 시간이 크게 증가하고 파일 크기 감소가 약간 향상됩니다 (이 테스트에서 FLAC-4에서 FLAC-8로 감소). 1.2 % , 182 % 평균 압축 시간 증가).


부록

앨범

처음 5 장의 무작위 CD를 가져 왔습니다 (아래에 나열 됨). 다른 음악 분야를 대표한다고 생각했습니다. 링크는 압축에 큰 차이를 가져 오기 때문에 음악을 살짝 엿보거나 음악에 대한 아이디어를 얻을 수있는 쉬운 가능성을 제공하기 위해 의도적으로 Amazon으로 이동합니다.

프로그램

이 작업을 위해 python 주어진 폴더 () 모든 .wav 파일을 테스트하고 하위 폴더 이름으로 그룹화 / 플롯합니다.

<folder> Album 1 Album 2 ... 

분석이 저장됩니다. 파일 --outfile <file1>. 플로팅하려면 --infile <file1>--outfile <file2>를 사용하세요.

#!/usr/bin/python3 #encoding=utf8 import os, sys, subprocess, argparse from datetime import datetime, timedelta from os.path import isfile, isdir, join import numpy as np import matplotlib.pyplot as plt import pickle as pkl parser = argparse.ArgumentParser(description="Analyse flac compression and conversion time") group = parser.add_mutually_exclusive_group() group.add_argument("-d", "--directory", help="Input folder", type=str) group.add_argument("-if", "--infile", help="Plot saved stats (pickle file)", type=str) parser.add_argument("-of", "--outfile", help="Output file", type=str, required=True) parser.add_argument("-c", "--cycles", help="Number of cycles for each file", type=int, default=5) parser.add_argument("-C", "--maxcompression", help="Max compression level", type=int, default=8) args = parser.parse_args() args.maxcompression += 1 ############################################################ xlabel = "FLAC Compression Factor" ylabel_size = "Size Relative to FLAC-0" ylabel_time = "Mean Compression Time\nOver {} Cycles Relative to FLAC-0 [s]".format(args.cycles) ylabel_efficiency = r"Efficiency: $(-1)\cdot$ Fraction Time $\cdot$ Fraction Size $+ 2$" ############################################################ # Analyse and write mode if not args.infile: if isdir(args.directory): mypath = args.directory else: raise ValueError("Folder {} does not exist!".format(args.directory)) folders = [f for f in os.listdir(mypath) if isdir(join(mypath, f))] print("Found folders: {}".format(folders)) # Create temporary working folder temp_folder = "temp_{}".format(os.getpid()) if not os.path.exists(temp_folder): os.makedirs(temp_folder) # Every analysis will be storen in stats stats = {} remove = [] for folder in folders: stats[folder] = {} stats[folder]["files"] = [f for f in os.listdir(mypath+folder) if isfile(join(mypath+folder, f)) and f.endswith(".wav")] if len(stats[folder]["files"]) == 0: print("No .wav files found in {}. Skipping.".format(folder)) remove.append(folder) stats.pop(folder, None) else: stats[folder]["stats"] = np.empty([len(stats[folder]["files"]),args.maxcompression], dtype=object) # Remove empty (no .wav) folders from list for folder in remove: folders.remove(folder) totalfiles = [] for folder in folders: totalfiles += stats[folder]["files"] totalfiles = len(totalfiles) if totalfiles == 0: raise RuntimeError("No .wav files found!") totalcycles = totalfiles * args.cycles * args.maxcompression counter_cycles = 0 time_start = datetime.strptime(str(datetime.now()), "%Y-%m-%d %H:%M:%S.%f") for folder in folders: # i: 0..Nfiles # n: 0..8 files = stats[folder]["files"] for i in range(len(files)): infile = "{}/{}".format(mypath+folder,files[i]) for n in range(args.maxcompression): Dtime = [] for j in range(args.cycles): time1 = datetime.strptime(str(datetime.now()), "%Y-%m-%d %H:%M:%S.%f") subprocess.run(["flac", infile, "--compression-level-{}".format(n), "-f", "-o", "{}/flac{}.flac".format(temp_folder,n)]) time2 = datetime.strptime(str(datetime.now()), "%Y-%m-%d %H:%M:%S.%f") Dtime.append((time2-time1).total_seconds()) counter_cycles += 1 # Percentage of totalcycles status = counter_cycles/totalcycles remain_factor = (1 - status)/status time_current = datetime.strptime(str(datetime.now()), "%Y-%m-%d %H:%M:%S.%f") time_elapsed = (time_current - time_start).total_seconds() print("========================================") print("Status: {} %".format(int(100*status))) print("Estimated remaining time: {}".format(str(timedelta(seconds=int(remain_factor * time_elapsed))))) print("========================================") Dtime = np.mean(Dtime) size = os.path.getsize("{}/flac{}.flac".format(temp_folder,n)) # Array if size (regarded as constat) and mean compression time # (file1, FLAC0)(file1, FLAC1)...(file1, FLACmaxcompression) # (file2, FLAC0)(file2, FLAC1)...(file2, FLACmaxcompression) # ... stats[folder]["stats"][i,n] = (size, Dtime) for folder in folders: # Taking columnwise (for each compression level) means of size... stats[folder]["ploty_size"] = [np.mean([e[0] for e in stats[folder]["stats"][:,col]]) for col in range(np.shape(stats[folder]["stats"])[1])] # (relative to FLAC-0) stats[folder]["ploty_size"] = [i/stats[folder]["ploty_size"][0] for i in stats[folder]["ploty_size"]] # ... and mean time. stats[folder]["ploty_time"] = [np.mean([e[1] for e in stats[folder]["stats"][:,col]]) for col in range(np.shape(stats[folder]["stats"])[1])] # (relative to FLAC-0) stats[folder]["ploty_time"] = [i/stats[folder]["ploty_time"][0] for i in stats[folder]["ploty_time"]] # Rough "effectivity" estimation -size*time + 2 # Expl.: Starts at (0,1), therefore flipping with (-1) requires # + 2. Without (-1) would be "badness" stats[folder]["ploty_eff"] = [ 2 + (-1) * stats[folder]["ploty_size"][i] * stats[folder]["ploty_time"][i] for i in range(len(stats[folder]["ploty_size"]))] with open(args.outfile, "wb") as of: data = {} data["stats"] = stats data["folders"] = folders data["cycles"] = args.cycles data["maxcompression"] = args.maxcompression pkl.dump(data, of, protocol=pkl.HIGHEST_PROTOCOL) if os.path.isdir(temp_folder): subprocess.run(["rm", "-r", temp_folder]) else: with open(args.infile, "rb") as f: data = pkl.load(f) stats = data["stats"] folders = data["folders"] args.maxcompression = data["maxcompression"] args.cycles = data["cycles"] fig = plt.figure() plotx = range(args.maxcompression) pos = range(len(plotx)) ax_size = fig.add_subplot(111) ax_size.set_xticks(pos) ax_size.set_xticklabels(plotx) ax_size.set_title("FLAC compression comparison") ax_time = ax_size.twinx() ax_efficiency = ax_size.twinx() colorfracs = [i / (len(folders)-0.9) if i > 0 else 0 for i in range(len(folders))] # Actual plotting lns = [] for cfrac, folder in zip(colorfracs, folders): color = plt.cm.viridis(cfrac) l_size, = ax_size.plot(plotx, stats[folder]["ploty_size"], color=color, linestyle=":", label="Size Ratio: {}".format(folder)) l_time, = ax_time.plot(plotx, stats[folder]["ploty_time"], color=color, linestyle="--", label="Time Ratio: {}".format(folder)) l_eff, = ax_efficiency.plot(plotx, stats[folder]["ploty_eff"], color=color, linestyle="-", label="Efficiency: {}".format(folder)) lns.append(l_size) lns.append(l_time) lns.append(l_eff) ax_efficiency.spines["right"].set_position(("outward", 60)) ax_size.xaxis.grid(color=".85", linestyle="-", linewidth=.5) ax_size.set_xlabel(xlabel) ax_size.set_ylabel(ylabel_size) ax_efficiency.set_ylabel(ylabel_efficiency) ax_time.set_ylabel(ylabel_time) lgd = ax_time.legend(handles=lns, loc="upper center", bbox_to_anchor=(0.5, -.15), facecolor="#FFFFFF", prop={"family": "monospace","size": "small"}) fig.savefig(args.outfile, bbox_inches="tight", dpi=300) 

댓글

  • 우와 … 이건 정말 멋진 정량적 분석입니다! 시간을내어이 모든 일을 해주셔서 정말 감사합니다. 빠르지는 않았지만 ‘ 정말 좋은 결과입니다. 감사합니다!

답변

Flac 0. 요즘 저장 용량이 너무 싸고 생각할 필요가없는 것 같습니다. … 또한 Flac 0은 디코딩이 덜 요구되기 때문에 느린 시스템에서 문제를 일으킬 가능성이 적습니다.

답변

Suuuehgi의 답변에 대한 후속 조치로 다음에서 시작하는 경우 추가하고 싶습니다. CD를 만들고 FLAC로 직접 리핑하는 경우 먼저 음악을 리핑해야하므로 인코딩 시간이 전혀 중요하지 않을 수 있습니다. 이는 시간이 걸립니다.

내가 시도한 작업은 다음과 같습니다.

dbPowerAmp CD 리퍼를 사용하여 Mariah Carey의 ” Merry를 리핑했습니다. 크리스마스 ” 앨범. FLAC 압축 수준 8에서 한 번, 수준 5 (dbPowerAmps 기본값)에서 한 번, 그리고 수준 0에서 한 번 리핑했습니다.

여기에서 전체 각 립에 대해 시작을 클릭하고 모든 FLAC 파일이 완료된 상태로 끝날 때까지 :

레벨 0 = 6:19

레벨 5 = 6:18

레벨 8 = 6:23

보시다시피, 3 개 모두의 차이는 미미합니다. < 5 초 간격입니다. 리핑 및 인코딩을 보면서 인코딩 상태는 화면에서 깜짝 놀랐습니다. 파일 시스템이 리핑되는 것을보고, 리핑하는 동안 즉석에서 인코딩하는 것처럼 보였습니다. 그러나 느린 시스템에서는 YMMV입니다.

파일 크기와 관련하여 생성 된 파일 크기는 다음과 같습니다.

레벨 0 = 278MB

레벨 5 = 257MB

레벨 8 = 256MB

여기에 이미지 설명 입력

전체 립 및 엔코딩 ode 시간은 기본적으로 같았지만 파일 크기는 같지 않았습니다. 그러나 나중에 압축 수준에서 확실히 감소하는 결과가 있습니다 (Suuuehgi의 답변에서 알 수 있듯이).

CD에서 시작하고 괜찮은 PC를 가지고 있다면 추출 및 인코딩에 걸리는 시간은 FLAC 압축 수준에 따라 크게 변하지 않습니다. 그러나 파일 크기는 변경됩니다. 기본적으로 FLAC 레벨 5의 dbPowerAmps 제안이 좋은 것이라고 생각합니다. FLAC 5와 FLAC 8 사이의 차이는 1MB 밖에되지 않습니다. FLAC 0을 사용하는 것처럼 제 예에서는 저장할 수있는 초과 저장 공간이 21MB임을 보여줍니다. 그다지 많지 않은 것 같지만 방대한 컬렉션을 리핑하면 빠르게 합산됩니다 (하나의 FLAC 노래는 그 정도 크기가 될 수 있습니다.)

이 작업은 USB 2 DVD 드라이브가있는 데스크톱에서 수행되었습니다. , 평균 7 배 속도로 추출됩니다. 내 데스크탑 PC 사양은 Intel Core i5-6500 CPU @ 3.2Ghz, 16GB RAM 및 Samsung 860 EVO Sata SSD 드라이브입니다.

답글 남기기

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