Ich möchte meine gesamte Musiksammlung in ein verlustfreies, aber komprimiertes Dateiformat rippen / archivieren, dh die Dateien sollten alle perfekt sein , verlustfreie Darstellungen der Originaldaten, sollten jedoch weniger Speicherplatz beanspruchen als unkomprimiertes WAV (E).

WAV (E) ist ein No-Go, da es nicht frei (proprietäres Microsoft-Material) ist, plattformübergreifende Komprimierung umständlich oder nicht möglich ist und die Dateigröße ist auf 4 GB begrenzt. Deshalb wähle ich FLAC (Free Lossless Audio Codec).

Da das Digitalisieren einer gesamten Sammlung eine Mammutaufgabe ist und FLAC 9 Komprimierungsstufen (0 bis 8) bietet, stellt sich die goldene Frage :

Welche Komprimierungsstufe sollte ich mit Bedacht wählen?

Kommentare

  • Diese Frage ‚ befasst sich überhaupt nicht mit Sounddesign, berührt jedoch eine Entscheidung, vor der einige Sounddesigner stehen. Wie ich mit unseren ständig wachsenden Bibliotheken von Aufzeichnungen am besten umgehen kann. Persönlich ‚ gehe ich einfach wegen des Speicherproblems über WAVE FLAC, aber ich ‚ Ich fürchte, ich habe ‚ keinen Einblick in die Komprimierungsstufe.
  • Interessanterweise habe ich gepostet Dies gilt zuerst für Musik , aber die Leute dort haben empfohlen, sie auf Sound Design zu verschieben.

Antwort

FLAC-Komprimierungsstufen sind (nur) ein Handel zwischen Codierungszeit und Dateigröße . Die Decodierungszeit ist weitgehend unabhängig von der Komprimierungsrate. Im Folgenden werde ich die Komprimierungsstufen 0, …, 8 als FLAC-0, …, FLAC-8 bezeichnen.

Kurz : Ich empfehle FLAC-4 !


Die einfachen Lösungen

Offensichtlich:

  • Wenn mir das Codieren von Zeit egal ist und Speicherplatz Geld ist, nehme ich die höchste Komprimierungsstufe FLAC-8 .

  • Wenn mir der Speicherplatz egal ist, ich aber so schnell wie möglich dahinter kommen möchte, nehme ich die niedrigste Komprimierungsstufe FLAC-0 .


Die schwierige Lösung

Wo ist die Richtige Mitte zwischen Dateigröße und Codierungszeit? Ich bin auf Nathan Zacharys Artikel zu dieser Frage gestoßen, aber er vergleicht nur zwei Dateien und codiert sie nur einmal (die Codierungszeit variiert stark je nach Seitenlast des Computers ) und Tabellen sind im Vergleich zu Grafiken schwer zu lesen.

Aus diesem Grund habe ich seine Messungen mit fünf vollständigen Alben jeweils in einem anderen Genre und codiert jede Datei / Spur 10 mal .

Vorgehensweise:

  • Album mit abcde und richtig cdparanoia Einstellungen für unkomprimiertes WAV.
  • Konvertieren Sie jede Datei 10 Mal für jede Komprimierungsstufe (FLAC-0 in FLAC-8) und nehmen Sie die mittlere Codierungszeit relativ zu FLAC-0 und die Dateigröße relativ zu F. LAC-0 .
    • Dafür habe ich die Internetverbindung deaktiviert, alle periodischen Jobs (cronjobs) und fast alles andere, so dass wirklich hauptsächlich die Komprimierung ausgeführt wird und so wenig wie möglich unterbrochen wird.

Diese Maßnahme sollte weitgehend unabhängig von der verwendeten Hardware sein. Ich habe flac Version 1.3.2 unter Arch Linux mit flac <infile> --compression-level-X -f -o flacX.flac verwendet.

Effizienz

Wenn Sie die relative Größe mit der relative Codierungs- / Komprimierungszeit erhalten Sie einen Wert für die Schlechtigkeit . Da diese Schlechtigkeit jedoch hauptsächlich von der relativen Zeit abhängt, würden sich die Graphen stark überlappen. Um das Diagramm zu klären, habe ich die Schlechtigkeit in eine Güte gespiegelt, die ich hier Effizienz nenne.

Ergebnisse

Ab FLAC-4 explodiert die Komprimierungszeit, ABER es gibt zwei Überraschungen:

  1. Die Dateigröße zwischen FLAC-3 und FLAC-3 und FLAC-4 je nach Musikgenre: Klassische Musik hat mit FLAC-4 eine deutlich geringere Komprimierung. Ich gehe davon aus, dass dies daran liegt, dass FLAC ein lineares Vorhersagemodell für die Komprimierung verwendet, das bei komplexerer (weniger linearer) Musik weniger gut funktioniert.

  2. Für nicht klassische Musik FLAC-3 ist in Bezug auf die Dateigröße sogar deutlich schlechter als FLAC-2.

flac_rank

Empfehlungen

Ich empfehle die Verwendung der Komprimierungsstufe FLAC-4 .

Wenn Sie höher gehen, erhöht sich die Codierungszeit erheblich, wobei die Reduzierung der Dateigröße geringfügig verbessert wird (mittlere Reduzierung von FLAC-4 auf FLAC-8 in diesem Test) ist 1,2% mit einem 182% Erhöhung der mittleren Komprimierungszeit).


Anhang

Alben

Ich habe gerade die ersten fünf zufälligen CDs genommen (siehe unten). dass ich daran dachte, verschiedene Bereiche der Musik zu repräsentieren. Die Links gehen absichtlich zu Amazon, um eine einfache Möglichkeit zu bieten, einen Blick in die Musik zu werfen / sich ein Bild von der Musik zu machen, da dies einen signifikanten Unterschied in der Komprimierung bewirkt.

Programm

Für diese Aufgabe habe ich eine python Programm, das alle Unterordner (die Alben) in einem bestimmten Ordner durchläuft (), um alle WAV-Dateien zu testen und sie nach ihrem Unterordnernamen zu gruppieren / plotten.

<folder> Album 1 Album 2 ... 

Die Analyse wird gespeichert in einer Datei --outfile <file1>. Verwenden Sie zum Plotten --infile <file1> und --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) 

Kommentare

  • Whoa … das ist eine großartige quantitative Analyse, die Sie dort durchgeführt haben! Ich weiß es wirklich zu schätzen, dass Sie sich die Zeit genommen haben, dies alles zu tun. ‚ konnte nicht schnell sein, aber wirklich großartige Ergebnisse. Danke!

Antwort

Flac 0. Die Lagerung ist heutzutage so billig, scheint mir ein Kinderspiel zu sein … auch Flac 0 kann auf einem langsameren System weniger Schluckauf bekommen, da das Dekodieren weniger anspruchsvoll ist.

Antwort

Als Folge von Suuuehgis Antwort möchte ich das auch hinzufügen, wenn Sie von a ausgehen Wenn Sie die CD direkt auf FLAC kopieren, spielt die Codierungszeit möglicherweise keine Rolle, da Sie zuerst die Musik rippen müssen, was einige Zeit in Anspruch nimmt.

Folgendes habe ich versucht:

Mit dbPowerAmp CD Ripper habe ich meine Kopie von Mariah Careys “ Merry gerippt Weihnachtsalbum „. Ich habe es einmal auf FLAC-Komprimierungsstufe 8, einmal auf Stufe 5 (Standard dbPowerAmps) und einmal auf Stufe 0 gerippt.

Hier ist die total Mal für jeden Rip, vom Klicken auf Start bis zum Ende aller FLAC-Dateien:

Level 0 = 6:19

Level 5 = 6:18

Level 8 = 6:23

Wie Sie sehen können, ist die Varianz zwischen allen 3 minimal, innerhalb < 5 Sekunden voneinander entfernt. Als ich sah, wie es rippte und codierte, war der Codierungsstatus kaum ein blinkender Blitz auf dem Bildschirm Wenn Sie das Dateisystem beim Rippen beobachten, scheint es während des Rippens im laufenden Betrieb zu codieren. YMMV auf langsameren Systemen.

Bei den Dateigrößen werden die folgenden Dateigrößen angezeigt:

Ebene 0 = 278 MB

Ebene 5 = 257 MB

Ebene 8 = 256 MB

Geben Sie hier die Bildbeschreibung ein.

Während der gesamte Rip und die Enc Die Odezeiten waren im Grunde die gleichen, die Dateigrößen waren jedoch nicht, es gibt jedoch definitiv abnehmende Renditen in den späteren Komprimierungsstufen (wie Suuuehgis Antwort anspielt).

Für mich scheint es so, als ob Sie Wenn Sie von CDs ausgehen und einen anständigen PC haben, wird sich die Zeit, die zum Rippen und Codieren benötigt wird, je nach FLAC-Komprimierungsstufe nicht wesentlich ändern. Die Dateigröße ändert sich jedoch. Ich denke, der Vorschlag von dbPowerAmps, FLAC Level 5 als Standard zu verwenden, ist gut. Nur 1 MB Unterschied zwischen FLAC 5 und FLAC 8. Wenn Sie FLAC 0 wählen, zeigt mein Beispiel 21 MB überschüssigen Speicherplatz, der gespeichert werden könnte. Das scheint nicht viel zu sein, aber wenn Sie große Sammlungen rippen, summiert sich das schnell (ein einzelner FLAC-Song kann ungefähr so groß sein).

Dies wurde auf einem Desktop mit einem USB 2-DVD-Laufwerk durchgeführt , Rippen im Durchschnitt mit 7x Geschwindigkeit. Meine Desktop-PC-Spezifikationen sind eine Intel Core i5-6500-CPU mit 3,2 GHz, 16 GB RAM und ein Samsung 860 EVO Sata SSD-Laufwerk.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.