Je souhaite extraire / archiver toute ma collection musicale dans un format de fichier sans perte mais compressé, cest-à-dire que les fichiers doivent tous être parfaits , des représentations sans perte des données dorigine mais devraient consommer moins despace que le WAV (E) non compressé.

WAV (E) est interdit, car il est non-libre (produit propriétaire de Microsoft), la compression multiplateforme est lourde ou impossible et la taille du fichier est limité à 4 Go. Je choisis donc FLAC (Free Lossless Audio Codec).

La numérisation dune collection entière étant une tâche gigantesque et que FLAC propose 9 niveaux de compression (0 à 8), la question en or se pose :

Quel niveau de compression dois-je choisir judicieusement?

Commentaires

  • cette question ‘ ne traite pas du tout de la conception sonore, mais elle touche à un choix auquel certains concepteurs sonores sont confrontés, à savoir: comment gérer au mieux nos bibliothèques denregistrements toujours plus nombreuses. Personnellement, je ‘ passe au FLAC sur WAVE simplement à cause du problème de stockage, mais je ‘ Jai peur de ne ‘ avoir aucune idée du niveau de compression.
  • Fait intéressant, jai publié ceci sur Musique en premier, mais les gens ont recommandé de le déplacer vers Sound Design.

Réponse

Les niveaux de compression FLAC sont (uniquement) un échange entre temps dencodage et taille du fichier . Le temps de décodage est à peu près indépendant du taux de compression. Dans ce qui suit, je ferai référence aux niveaux de compression 0, …, 8 comme FLAC-0, …, FLAC-8.

En bref : Je recommande FLAC-4 !


Les solutions faciles

Évidemment:

  • Si je ne me soucie pas du temps dencodage et que lespace cest de largent, je prends le niveau de compression le plus élevé FLAC-8 .

  • Si je ne me soucie pas de l’espace mais que je veux y arriver aussi vite que possible, je prends le niveau de compression le plus bas FLAC-0 .


La solution difficile

Où est la juste au milieu entre la taille du fichier et le temps dencodage? Je suis tombé sur larticle de Nathan Zachary sur cette question mais il ne compare que deux fichiers, ne les encode quune seule fois (le temps dencodage varie énormément en fonction de la charge latérale de lordinateur ) et les tableaux sont difficiles à lire par rapport aux graphiques.

Alors, inspiré par cela, jai refait ses mesures avec cinq albums complets chacun dans un genre différent et encodé chaque fichier / piste 10 fois .

Procédure:

  • Extraire lalbum avec abcde et paramètres appropriés cdparanoia pour WAV non compressé.
  • Convertissez chaque fichier 10 fois pour chaque niveau de compression (FLAC-0 en FLAC-8) et prenez le temps dencodage moyen par rapport à FLAC-0 et la taille du fichier par rapport à F LAC-0 .
    • Pour cela, jai désactivé la connexion Internet, tous les travaux périodiques (cronjobs) et presque tout le reste pour que la compression sexécute vraiment et le moins possible interfère.

Cette mesure devrait être à peu près indépendante du matériel utilisé. Jai utilisé la version flac 1.3.2 sur Arch Linux en utilisant flac <infile> --compression-level-X -f -o flacX.flac.

Efficacité

Si vous multipliez le taille relative avec le temps relatif dencodage / compression , vous obtenez une valeur pour la méchanceté . Mais puisque cette méchanceté est principalement régie par le temps relatif, les graphiques se chevaucheraient largement. Donc, pour clarifier le graphique, je viens de refléter la méchanceté dans une bonté , jappelle efficacité ici.

Résultats

À partir du FLAC-4, le temps de compression explose MAIS il y a deux surprises:

  1. Il y a une réduction significative de la taille du fichier entre FLAC-3 et FLAC-4 selon le genre de musique: La musique classique a une compression beaucoup plus faible en utilisant FLAC-4. Je suppose que cest parce que FLAC utilise un modèle de prédiction linéaire pour la compression qui fonctionne moins bien avec de la musique plus complexe (moins linéaire).

  2. Pour la musique non classique, FLAC-3 est encore bien pire que FLAC-2 en termes de taille de fichier.

flac_rank

Recommandations

Je recommande dutiliser le niveau de compression FLAC-4 .

Augmenter considérablement le temps dencodage avec une amélioration marginale de la réduction de la taille du fichier (réduction moyenne de FLAC-4 à FLAC-8 dans ce test est 1,2% avec un 182% augmentation du temps de compression moyen).


Annexe

Albums

Je viens de prendre les cinq premiers CD au hasard (listés ci-dessous) que jai pensé représenter un domaine différent de la musique. Les liens vont intentionnellement à Amazon pour fournir une possibilité facile de jeter un coup dœil sur la musique / davoir une idée de la musique car cela fait une différence significative dans la compression.

Programme

Pour cette tâche, jai écrit un python programme qui parcourt tous les sous-dossiers (les albums) dun dossier donné () pour tester tous les fichiers .wav et les grouper / les tracer par leur nom de sous-dossier.

<folder> Album 1 Album 2 ... 

Lanalyse sera enregistrée dans un fichier --outfile <file1>. Pour tracer, utilisez --infile <file1> et --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) 

Commentaires

  • Whoa … cest une analyse quantitative impressionnante que vous avez faite là-bas! Japprécie vraiment que vous ayez pris le temps de faire tout cela. ‘ t ont pu être rapides, mais de très bons résultats. Merci!

Réponse

Flac 0. Le stockage est si bon marché ces jours-ci, cela me semble une évidence … aussi Flac 0 est moins susceptible de hocher sur un système plus lent car le décodage est moins exigeant à décoder.

Réponse

Pour faire suite à la réponse de Suuuehgi, jaimerais également ajouter que si vous partez dun CD et lextraction directe vers FLAC, le temps dencodage na peut-être pas dimportance car vous devez dabord extraire la musique, ce qui prend du temps.

Voici ce que jai essayé:

En utilisant dbPowerAmp CD Ripper, jai extrait ma copie de Mariah Carey « s  » Merry Album de Noël « . Je lai déchiré une fois au niveau de compression FLAC 8, une fois au niveau 5 (dbPowerAmps par défaut), et une fois au niveau 0.

Voici le total fois pour chaque extraction, du début à la fin avec tous les fichiers FLAC terminés:

Niveau 0 = 6:19

Niveau 5 = 6:18

Niveau 8 = 6:23

Comme vous pouvez le voir, la variance entre les 3 est minime, dans < 5 secondes lune de lautre. Pendant que je le regardais déchirer et encoder, létat de lencodage était un simple flash sur lécran, à peine enregistré. Et en regardant le système de fichiers en train de ripper, il semblait encoder à la volée au fur et à mesure de lextraction. YMMV sur des systèmes plus lents cependant.

En ce qui concerne la taille des fichiers, voici les tailles de fichiers produites:

Niveau 0 = 278 Mo

Niveau 5 = 257 Mo

Niveau 8 = 256 Mo

entrez la description de limage ici

Alors que le total des déchirures et enc Les temps dode étaient fondamentalement les mêmes, les tailles de fichier nétaient pas, CEPENDANT, il y a certainement des rendements décroissants dans les niveaux de compression ultérieurs (comme la réponse de Suuuehgi y fait allusion).

Pour moi, il semble que si vous sont à partir de CD et ont un PC décent, le temps quil faut pour ripper et encoder ne changera pas beaucoup en fonction du niveau de compression FLAC. La taille du fichier change cependant. Je pense que la suggestion de dbPowerAmps du niveau FLAC 5 par défaut est bonne. Seulement 1 Mo de différence entre FLAC 5 et FLAC 8, où – comme si vous passez au FLAC 0, mon exemple montre 21 Mo de stockage excédentaire qui pourraient être économisés. Cela peut ne pas sembler beaucoup, mais lorsque vous extrayez de vastes collections, cela sadditionne rapidement (une seule chanson FLAC peut être de cette taille.)

Cela a été fait sur un bureau avec un lecteur DVD USB 2 , déchirant en moyenne à une vitesse 7x. Les spécifications de mon ordinateur de bureau sont un processeur Intel Core i5-6500 à 3,2 GHz, 16 Go de RAM et un disque SSD Samsung 860 EVO Sata.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *