Haluan kopioida / arkistoida koko musiikkikokoelmani häviöttömään, mutta pakattuun tiedostomuotoon, eli kaikkien tiedostojen tulisi olla täydellisiä , alkuperäisten tietojen häviöttömät esitykset, mutta niiden pitäisi kuluttaa vähemmän tilaa kuin pakkaamaton WAV (E).

WAV (E) on kielletty, koska se on ei ilmainen (Microsoftin omistama aineisto), alustojen välinen pakkaaminen on hankalaa tai ei mahdollista ja tiedoston koko on rajoitettu 4 Gt: iin. Siksi valitsen FLAC: n (Free Lossless Audio Codec).

Koska koko kokoelman digitointi on mammutti ja FLAC tarjoaa 9 pakkaustasoa (0–8), tulee kultainen kysymys :

Mikä pakkaustaso minun pitäisi valita viisaasti?

Kommentit

  • tämä kysymys ei koske lainkaan ' t äänisuunnittelua, mutta se koskettaa valintaa, jonka jotkut äänisuunnittelijat kohtaavat, kuinka parhaiten käsitellä jatkuvasti kasvavia kirjastojamme. Henkilökohtaisesti olen ' siirtymässä FLAC: iin WAVE: lla yksinkertaisesti tallennusongelman vuoksi, mutta minä ' pelkään, että minulla ei ole ' mitään käsitystä pakkaustasosta.
  • Mielenkiintoista olen lähettänyt tämä ensin musiikissa , mutta siellä olevat ihmiset suosittivat sen siirtämistä äänisuunnitteluun.

Vastaa

FLAC-pakkaustasot ovat (vain) kauppaa -koodausajan ja tiedostokoko . Dekoodausaika on melkein riippumaton pakkaussuhteesta. Seuraavassa viittaan pakkaustasoihin 0, …, 8 nimellä FLAC-0, …, FLAC-8.

Lyhyesti : Suosittelen FLAC-4 !


Helpot ratkaisut

Ilmeisesti:

  • Jos en välitä aikakoodauksesta ja koska tila on rahaa, otan korkeimman pakkaustason FLAC-8 .

  • Jos en välitä avaruudesta, mutta haluan päästä tämän taakse mahdollisimman nopeasti, otan pienimmän pakkaustason FLAC-0 .


Vaikea ratkaisu

Missä on oikea keskikohta tiedostokoon ja koodausajan välillä? Olen törmännyt Nathan Zacharyn artikkeliin tästä kysymyksestä, mutta hän vertaa vain kahta tiedostoa, koodaa ne vain kerran (koodausaika vaihtelee suuresti tietokoneen sivukuormituksen mukaan) ) ja taulukoita on vaikea lukea verrattuna kaavioihin.

Joten tämän innoittamana muutin hänen mittauksensa viidellä täydellisellä albumilla kukin eri tyylilajissa ja koodasi jokaisen tiedoston / raidan 10 kertaa .

Menettely:

  • Kopioi albumi abcde ja oikeat cdparanoia asetukset pakkaamattomaksi WAV: ksi.
  • Muunna jokainen tiedosto 10 kertaa kullekin pakkaustasolle (FLAC-0 FLAC-8: ksi) ja ota keskimääräinen koodausaika suhteessa FLAC-0 ja -tiedoston koko suhteessa F LAC-0 .
    • Tätä varten poistin Internet-yhteyden käytöstä, kaikki säännölliset työt (cronjobs) ja melkein kaiken muun, jotta pakkaus tosiasiassa käy ja mahdollisimman vähän häiriöitä.

Tämän toimenpiteen tulee olla melko riippumaton käytetystä laitteistosta. Käytin flac-versiota 1.3.2 Arch Linuxissa käyttämällä flac <infile> --compression-level-X -f -o flacX.flac.

Tehokkuus

Jos kerrot suhteellinen koko suhteellisen koodauksen / pakkausajan , saat arvon pahuudelle . Mutta koska tätä pahuutta hallitsee enimmäkseen suhteellinen aika, kaaviot olisivat huomattavasti päällekkäisiä. Joten kaavion selventämiseksi peilasin vain pahuuden hyvyydeksi , kutsun tehokkuutta tähän.

Tulokset

FLAC-4: stä lähtien pakkausaika räjähtää, MUTTA on kaksi yllätystä:

  1. Tiedostokoko pienenee merkittävästi FLAC-3: n ja FLAC-4 musiikkilajista riippuen: Klassisen musiikin pakkaus on tavallista pienempi FLAC-4: n avulla. Oletan, että tämä johtuu siitä, että FLAC käyttää pakkaamiseen lineaarista ennustusmallia, joka menee vähemmän hyvin monimutkaisemman (vähemmän lineaarisen) musiikin kanssa.

  2. Muun kuin klassisen musiikin osalta FLAC-3 on jopa huomattavasti huonompi kuin FLAC-2 tiedostokoon suhteen.

flac_rank

Suositukset

Suosittelen pakkaustason käyttöä FLAC-4 .

Suuremmaksi nousu lisää merkittävästi koodausaikaa parantamalla marginaalisesti tiedostokokoa (keskimääräinen pienennys FLAC-4: stä FLAC-8: een tässä testissä on 1,2% ja 182% keskimääräisen pakkausajan kasvu).


Liite

Albumit

Otin juuri viisi ensimmäistä satunnaista CD-levyä (lueteltu alla) jonka ajattelin edustavan eri musiikkialaa. Linkit menevät tarkoituksella Amazoniin, jotta ne tarjoavat helpon mahdollisuuden vilkaista musiikkia / saada käsitys musiikista, koska sillä on merkittävä ero pakkauksessa.

Ohjelma

Tähän tehtävään kirjoitin python ohjelma, joka käy läpi kaikki alikansiot (albumit) tietyssä kansiossa () testataksesi kaikki .wav-tiedostot ja ryhmittelemällä / piirtämällä ne alikansioiden nimien mukaan.

<folder> Album 1 Album 2 ... 

Analyysi tallennetaan tiedostossa --outfile <file1>. Piirrä käyttämällä --infile <file1> ja --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) 

kommentteja

  • Voi … tämä on mahtava kvantitatiivinen -analyysi, jonka teit siellä! Arvostan todella, että käytit aikaa tehdäksesi kaiken tämän. ' t eivät olleet nopeita, mutta todella hyviä tuloksia. Kiitos!

Vastaa

Flac 0. Tallennustila on niin halpaa näinä päivinä, ei minusta näytä olevan järkevää … myös Flac 0 ei todennäköisesti hikoile hitaammassa järjestelmässä, koska sen dekoodaus on vähemmän vaativaa purkaa.

vastaus

Suuuehgin vastauksen seuraajana haluan lisätä myös, että jos aloitat CD-levyllä ja sen kopioimisella suoraan FLAC: iin, ajan koodaamisella ei välttämättä ole väliä, koska sinun on ensin kopioitava musiikki, mikä vie aikaa.

Tässä on kokeilemani asia:

Repäisin kopioni Mariah Carey ”s " Hyvää dbPowerAmp CD Ripper -ohjelmaa käyttämällä. Joulu ". Repäisin sen kerran FLAC-pakkaustasolla 8, kerran tasolla 5 (oletus dbPowerAmps) ja kerran tasolla 0.

Tässä on yhteensä kertaa jokaiselle ripille, napsauttamalla alusta, loppuun asti, kun kaikki FLAC-tiedostot on tehty:

Taso 0 = 6:19

Taso 5 = 6:18

Taso 8 = 6:23

Kuten näette, varianssi kaikkien kolmen välillä on vähäinen, sisällä < 5 sekuntia toisistaan. Kun katselin sen kopiointia ja koodausta, koodaustila oli pelkkä välähdys näytöllä, tuskin Rekisteröityminen. Ja katsomalla tiedostojärjestelmää sen kopioinnin aikana, se näytti koodaavan lennossa repimisen aikana. YMMV kuitenkin hitaammissa järjestelmissä.

Mitä tulee tiedostokokoihin, tässä ovat tuotetut tiedostokoot:

Taso 0 = 278 Mt

Taso 5 = 257 Mt

Taso 8 = 256 Mt

kirjoita kuvan kuvaus tähän

Vaikka koko kopiointi ja koodaus ode-ajat olivat periaatteessa samat, tiedostokoot eivät kuitenkaan, myöhemmissä pakkaustasoissa on kuitenkin varmasti pienenevää tuottoa (kuten Suuuehgin vastaus viittaa).

Minusta näyttää siltä, että jos lähtevät CD: ltä ja niillä on kunnollinen tietokone, kopiointiin ja koodaamiseen kuluva aika ei muutu paljoakaan FLAC-pakkausasteen perusteella. Tiedoston koko muuttuu kuitenkin. Luulen, että dbPowerAmps-ehdotus FLAC-tasosta 5 oletuksena on hyvä. Vain 1 Mt: n ero FLAC 5: n ja FLAC 8: n välillä, esimerkkinä näytetään 21 Mt ylimääräistä tallennustilaa, joka voidaan tallentaa. Se ei ehkä näytä kovin paljon, mutta kun kopioit valtavia kokoelmia, se lisääntyy nopeasti (yksi FLAC-kappale voi olla noin kooltaan.)

Tämä tehtiin työpöydällä, jossa oli USB 2 DVD -asema , kopiointi keskimäärin 7x nopeudella. Pöytätietokoneeni tekniset tiedot ovat Intel Core i5-6500 -suoritin, 3,2 GHz, 16 Gt RAM-muistia ja Samsung 860 EVO Sata SSD -asema.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *