すべての音楽コレクションをロスレスで圧縮されたファイル形式にリッピング/アーカイブしたい、つまりファイルはすべて完璧である必要があります、元のデータのロスレス表現ですが、非圧縮WAV(E)よりも少ないスペースを消費する必要があります。

WAV(E)は、無料ではない(Microsoft独自のもの)ため、クロスプラットフォーム圧縮は煩雑であるか不可能であり、ファイルサイズも問題ありません。は4GBに制限されているため、FLAC(Free Lossless Audio Codec)を選択します。

コレクション全体のデジタル化は非常に困難な作業であり、FLACは9つの圧縮レベル(0〜8)を提供するため、黄金の問題が発生します。 :

どの圧縮レベルを賢く選択する必要がありますか?

コメント

  • この質問は'サウンドデザインにはまったく対応していませんが、一部のサウンドデザイナーが直面する選択に触れています。増え続けるレコーディングのライブラリを最適に処理する方法。個人的には、ストレージの問題のために' FLAC over WAVEを使用していますが、'恐れ入りますが'圧縮レベルについての洞察がありません。
  • 興味深いことに投稿しましたこれは最初に音楽で行われましたが、そこの人々はそれをサウンドデザインに移動することを勧めました。

回答

FLAC圧縮レベルは、(のみ)エンコード時間との間のトレードです。 ファイルサイズ。デコード時間は、圧縮率とはほとんど関係ありません。以下では、圧縮レベル0、…、8をFLAC-0、…、FLAC-8と呼びます。

要するに FLAC-4


簡単なソリューション

明らかに:

  • エンコードの時間を気にせず、スペースがお金であるため、最高の圧縮レベルを使用します FLAC-8

  • スペースを気にしないが、できるだけ早くこれを後回しにしたい場合は、最低の圧縮レベルを使用します FLAC-0


難しい解決策

どこにありますかファイルサイズとエンコード時間のちょうど中間ですか?この質問に関する Nathan Zacharyの記事に出くわしましたが、彼は2つのファイルを比較し、それらを1回だけエンコードします(エンコード時間はコンピューターのサイドロードによって大きく異なります) )と表はグラフに比べて読みにくいです。

そこで、これに触発されて、 5つの完全なアルバムそれぞれ異なるジャンルで、各ファイル/トラックをエンコードしました 10回

手順:

  • abcde と適切 cdparanoia 非圧縮WAVへの設定。
  • 圧縮レベル(FLAC-0からFLAC-8)ごとにすべてのファイルを10回変換し、平均エンコード時間をFLAC-0と比較しますおよびファイルサイズ(Fを基準) LAC-0
    • このため、インターネット接続、すべての定期的なジョブ(cronjobs)、およびその他のほぼすべてを無効にして、実際にはほとんどの場合圧縮が実行され、干渉ができるだけ少なくなりました。

この測定値は、使用するハードウェアとはほとんど関係ありません。 flac <infile> --compression-level-X -f -o flacX.flacを使用してArchLinuxでflacバージョン1.3.2を使用しました。

効率

相対サイズと相対エンコード/圧縮時間 badness の値を取得します。しかし、この悪さは主に相対的な時間によって支配されるため、グラフは大幅に重複します。したがって、グラフを明確にするために、悪い良いにミラーリングしました。ここでは効率と呼びます。

調査結果

FLAC-4以降、圧縮時間は爆発的に増加しますが、2つの驚きがあります。

  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(以下にリスト)を取得しました。私が考えたのは、音楽のさまざまな分野を表すことです。リンクは意図的にアマゾンに行き、音楽を垣間見る/音楽のアイデアを得る簡単な可能性を提供します。それは圧縮に大きな違いをもたらすからです。

プログラム

このタスクのために、 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) 

コメント

  • おっと…これはあなたがそこで行った素晴らしい定量的分析です!時間を割いていただき、誠にありがとうございました。 'は高速ではありませんでしたが、本当に素晴らしい結果が得られました。ありがとう!

回答

Flac0。最近のストレージはとても安いので、私には簡単に思えます。 …また、Flac 0は、デコードの要求が少ないため、低速のシステムで問題が発生する可能性が低くなります。

回答

Suuuehgiの回答のフォローアップとして、次のことから始めている場合は、それも追加したいと思います。 CDを直接FLACにリッピングする場合、最初に音楽をリッピングする必要があるため、エンコード時間はまったく問題にならない場合があります。これには時間がかかります。

これが私が試したことです:

dbPowerAmp CDリッパーを使用して、マライアキャリーの"メリーのコピーをリッピングしましたクリスマス"アルバム。 FLAC圧縮レベル8で1回、レベル5(dbPowerAmpsのデフォルト)で1回、レベル0で1回リッピングしました。

ここに合計開始をクリックしてから、すべてのFLACファイルが完了するまでの各リッピングの回数:

レベル0 = 6:19

レベル5 = 6:18

レベル8 = 6:23

ご覧のとおり、3つすべての差異は最小です。 <互いに5秒。リッピングしてエンコードするのを見ると、エンコードステータスは画面上の単なるフラッシュでした。登録されました。リッピング中のファイルシステムを見ると、リッピング中のファイルシステムがオンザフライでエンコードされているように見えました。ただし、低速のシステムではYMMVです。

ファイルサイズについては、次のファイルサイズが生成されます。

レベル0 = 278 MB

レベル5 = 257 MB

レベル8 = 256 MB

ここに画像の説明を入力

リッピングとencの合計ode時間は基本的に同じで、ファイルサイズは同じではありませんでしたが、後の圧縮レベルでは確実に収穫逓減が見られます(Suuuehgiの回答がほのめかしているように)。

私には、 CDから始めて、まともなPCを持っているので、リッピングとエンコードにかかる時間は、FLAC圧縮レベルに基づいてあまり変わりません。ただし、ファイルサイズは変わります。デフォルトとしてFLACレベル5のdbPowerAmps提案は良いものだと思います。 FLAC5とFLAC8の違いはわずか1MBですが、FLAC 0を使用する場合と同様に、私の例では、21MBの余分なストレージを節約できます。それほど多くはないように思われるかもしれませんが、膨大なコレクションをリッピングすると、すぐに合計されます(1つのFLAC曲はそのサイズ程度になる可能性があります)。

これは、USB 2DVDドライブを備えたデスクトップで行われました。 、平均して7倍の速度でリッピングします。私のデスクトップPCの仕様は、Intel Core i5-6500 CPU @ 3.2Ghz、16GBのRAM、およびSamsung 860 EVO SataSSDドライブです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です