Pourquoi ai-je rippé un CD 300 fois

Je collectionne de la musique: j'achète des CD, les numérise avec Exact Audio Copy et je numérise les couvertures et les encarts. Parfois, ce n'est pas facile si le CD est sorti en édition limitée à l'étranger il y a 10 ans. La chose la plus difficile est si le CD a un défaut de fabrication - et que certaines pistes ne peuvent pas être lues.

L' album d'arrangements pour piano d'Altneuland 帰 る べ き 城 est sorti en 2005. Je l'ai trouvé trois ans plus tard (probablement sur YouTube), j'ai téléchargé la meilleure copie - et l'ai mise sur la liste des futurs achats. Les progrès récents de la technologie du courrier international ont permis d’acheter un disque usagé l’année dernière. Malheureusement, aucun de mes lecteurs de CD n'a pu lire la piste numéro 3. Cela se produit souvent lors de l'achat de vieux disques, en particulier lorsqu'ils sont passés par le centre d'expédition international USPS. Je l'ai mis de côté et j'ai commencé à chercher une autre copie que j'ai trouvée le mois dernier. Il est arrivé vendredi - et j'ai immédiatement essayé de le déchirer. Mais avec poussé avec exactement la même erreur . Il semble que ce ne soit pas une question d'usure ou de dommage - le disque est probablement sorti défectueux dès l'usine.

ADDITION: Après l'enquête, je ne crois plus que ce soit un défaut d'usine. Lorsque j'écris le début ou la fin d'une mauvaise piste sur un CD-R vide et que je le copie, le ripper produit la même erreur! Essayez-le vous-même avec le fichier minimal.flac .

Il reste deux options: essayez un jour de trouver une autre copie qui sera copiée avec succès (peu probable), ou restaurez en quelque sorte les données audio originales à partir de disques endommagés. Vous savez déjà quelle option j'ai choisie.

Comment fonctionne le ripper



EAC n'a pas pu lire la piste n ° 3 du disque [帰 る べ き 城]

Les CD stockent des données numériques, mais il existe une interface complètement analogique entre les disques, les lasers et les diodes optiques. Les erreurs de lecture se produisent pour diverses raisons: supports sales, rayures sur la couche de protection en polycarbonate, vibrations du lecteur lui-même. Les codes de correction d'erreur primitifs de la norme CDDA aident à minimiser la distorsion du son sur les disques rarement utilisés, mais ne sont pas en mesure de restaurer complètement le flux binaire sur un CD avec un grand nombre d'erreurs. Les rippers modernes résolvent le problème avec deux méthodes de détection d'erreur importantes: la lecture redondante et AccurateRip.

La page EAC: Technologie d'extraction décrit comment l'EAC produit des lectures redondantes:

En mode sans échec, le programme lit chaque secteur au moins deux fois [...] En cas d'erreur (lecture ou synchronisation), le programme continue de lire ce secteur jusqu'à ce que 8 tentatives sur 16 soient identiques. Une telle procédure est effectuée au plus une, trois ou cinq fois (en fonction de la qualité de récupération d'erreur sélectionnée). Donc dans le pire des cas, les mauvais secteurs sont lus 82 fois!

Tout est simple. Si une demande de lecture renvoie parfois des données incorrectes, relisez-les, puis soyez particulièrement prudent si les deux premières lectures donnent des résultats différents. AccurateRip utilise le même principe, mais de manière distribuée: les rippers envoient des sommes de contrôle des fichiers audio copiés à ce service. L'idée est que si un millier de personnes copient une piste avec les mêmes bits, c'est probablement la bonne rip.

Cet article explique ce qu'il faut faire si les deux méthodes ne peuvent pas aider. L'EAC ne donne pas de résultat si chaque lecture renvoie des données différentes, et dans la base de données AccurateRip, il n'y a qu'un seul enregistrement sur un disque rare [1] .

«J'ai passé dix mille passages, dix mille passages pour te voir»



Lecteurs optiques Asus, LG, Lite-On, Pioneer et OEM inconnu

Si le CD n'est pas copié, il est logique d'utiliser un autre lecteur. Parfois, un modèle particulier est plus condescendant par rapport aux spécifications CDDA, ou existe-t-il un meilleur firmware pour corriger les erreurs, ou autre chose. Le forum DBpoweramp a une cote de précision de lecteur de CD / DVD pour sélectionner le lecteur rip le plus approprié.

Samedi matin, j'ai acheté cinq nouveaux lecteurs de CD de différents fabricants [2] , Je les ai tous essayés - et j'en ai trouvé un qui pouvait garder la synchronisation sur une piste rythmique. Malheureusement, la confirmation du rip n'a pas pu être obtenue - entre tous les rips, il y avait environ 20 000 octets différents.

Mais maintenant, j'avais des fichiers .wav sur le disque, et vous pouvez en bénéficier. J'ai pensé que les erreurs de lecture sur une mauvaise piste étaient quelque peu proches de la «bonne». Par conséquent, il est logique de faire plusieurs déchirures et de trouver une valeur de «consensus» pour les octets instables. Cette approche a finalement réussi, mais elle a demandé beaucoup plus de travail que ce à quoi je m'attendais.

«La quantité va dans la qualité»


J'ai commencé par copier le disque à plusieurs reprises sur l'un des lecteurs, écrire toutes les valeurs pour chaque octet et déclarer l'erreur «corrigeable» si plus de la moitié des déchirures produit une valeur d'octet spécifique pour cette position. Le début était bon: le nombre d'erreurs non corrigibles est passé de près de ~ 6900 octets à N = 4 à ~ 5000 octets à N = 10. Le bénéfice de chaque rip supplémentaire a diminué au fil du temps, jusqu'à ce que vers N = 80, le nombre d'erreurs non corrigibles se stabilise à ~ 3700. J'ai arrêté de déchirer à N = 100.


Erreurs fixes et fatales sur le nombre de rip

Ensuite, j'ai essayé de copier le disque 100 fois sur le deuxième lecteur et d'utiliser deux cartes de correction pour «remplir» les positions d'erreur non corrigibles du premier lecteur. Mais cela n'a pas fonctionné: sur chaque disque il y avait des milliers de corrections qui ne correspondaient pas à des corrections sur l'autre! Il s'avère que le bruit ne peut pas être éliminé en le combinant avec une autre source de bruit mais liée.


La même chose, mais pour deux disques à validation croisée

Art artisanal




Il existe une autre bonne ressource sur le site Web de l'EAC: le test de qualité DAE , qui détermine la qualité du micrologiciel d'un lecteur en fonction du niveau d'erreurs corrigé. Il s'agit d'une gestion des erreurs de niveau inférieur lorsque le lecteur corrige les erreurs de lecture plutôt que de simplement les signaler. Le hic est que le «mode sans échec» du CAE n'est disponible que lorsque vous désactivez ce code de correction d'erreur intégré, ce qui suggère qu'il ne fonctionne pas correctement.

J'ai préparé le test en gravant le fichier .wav sur CD-R, en mettant en évidence le secteur exact sur la surface de données et en le peignant soigneusement avec un marqueur noir. Ce sont des erreurs fatales garanties sur un modèle déterministe.

J'ai testé tous les disques et obtenu deux résultats intéressants:



J'ai utilisé le lecteur Lite-On pour contourner les erreurs de synchronisation. Il mâcha le marqueur magique avec plaisir, mais il était très confus par les lignes droites sur la surface des données. Vous pouvez voir comment au lieu de trois pics séparés sur la droite, il y a un blob géant défaillant.

Errors total Num : 206645159
Errors (Loudness) Num : 965075 - Avg : -21.7 dB(A) - Max : -5.5 dB(A)
Error Muting Num : 154153 - Avg : 99.1 Samples - Max : 3584 Samples
Skips Num : 103 - Avg : 417.3 Samples - Max : 2939 Samples

Total Test Result : 45.3 points (of 100.0 maximum)




Le lecteur Pioneer a reçu le score DAE le plus élevé. À mon avis, le graphique n'a pas l'air spécial, mais l'outil d'analyse a dit que c'est le meilleur firmware pour corriger les erreurs dans mon petit ensemble.

Errors total Num : 2331952
Errors (Loudness) Num : 147286 - Avg : -77.2 dB(A) - Max : -13.2 dB(A)
Error Muting Num : 8468 - Avg : 1.5 Samples - Max : 273 Samples
Skips Num : 50 - Avg : 6.5 Samples - Max : 30 Samples

Total Test Result : 62.7 points (of 100.0 maximum)


"A partir d'un certain moment, les chiffres comptent"


Comment utiliser le firmware Pioneer avec une bonne correction d'erreurs si le "mode sans échec" EAC l'ignore? Très simple: basculez le CAE en "mode rafale" et écrivez sur le disque le flux binaire sous la forme dans laquelle le micrologiciel les signale. Comment alors transformer ce tas de fichiers .wav non vérifiés en un fichier de bonne qualité, comme en "mode sans échec"? Oui, le même outil d'analyse d'erreur que nous avons utilisé dans les déchirures avec Lite-On!

Après quelques paramètres de configuration EAC et après une centaine de déchirures, nous obtenons un si beau diagramme.


Erreurs fixes et non corrigibles sur le nombre de déchirures (Pioneer)

Ce qui peut être noté:

  • Les erreurs de bits fatales tendent rapidement à zéro, mais ne l'atteignent jamais.
  • Un énorme saut dans les bugs corrigés en 53-54 déchirures.
  • Le nombre d'erreurs avant et après ce grand saut ne change pratiquement pas, ce qui indique des zones de stabilité dans les données copiées.

0xA595BC09


En utilisant une correction d'erreur presque parfaite de Pioneer, j'ai généré un fichier de «meilleure estimation» et j'ai commencé à le comparer avec les déchirures de Pioneer. Comme prévu, plusieurs sections de faible qualité ont été découvertes, que j'ai corrigées en effectuant 10 autres déchirures:

$ for RIP_ID in $(seq -w 1 100); do echo -n "rip$RIP_ID: "; cmp -l analysis-out.wav rips-cd1-pioneer/rip${RIP_ID}/*.wav | wc -l ; done | sort -rgk2 | head -n 10
rip054: 2865
rip099: 974
rip007: 533
rip037: 452
rip042: 438
rip035: 404
rip006: 392
rip059: 381
rip043: 327
rip014: 323


J'ai aussi trouvé quelque chose de vraiment intéressant: plusieurs déchirures ont produit exactement le même contenu! Rappelez-vous, c'est précisément le critère de réussite dans le CA "mode sans échec". shncat -q -e | rhash --print="%C" shncat -q -e | rhash --print="%C" utilisé pour calculer la somme de contrôle CRC32 des données audio brutes: c'est ce que l'EAC utilise.

$ for wav in rips-cd1-pioneer/*/*.wav; do shncat "$wav" -q -e | rhash --printf="%C $wav\n" - ; done | sort -k1
[...]
9DD05FFF rips-cd1-pioneer/rip059/rip.wav
9F8D1B53 rips-cd1-pioneer/rip072/rip.wav
A2EA0283 rips-cd1-pioneer/rip082/rip.wav
A595BC09 rips-cd1-pioneer/rip021/rip.wav
A595BC09 rips-cd1-pioneer/rip022/rip.wav
A595BC09 rips-cd1-pioneer/rip023/rip.wav
A595BC09 rips-cd1-pioneer/rip024/rip.wav
A595BC09 rips-cd1-pioneer/rip025/rip.wav
A595BC09 rips-cd1-pioneer/rip026/rip.wav
A595BC09 rips-cd1-pioneer/rip027/rip.wav
A595BC09 rips-cd1-pioneer/rip028/rip.wav
A595BC09 rips-cd1-pioneer/rip030/rip.wav
A595BC09 rips-cd1-pioneer/rip031/rip.wav
A595BC09 rips-cd1-pioneer/rip040/rip.wav
A595BC09 rips-cd1-pioneer/rip055/rip.wav
A595BC09 rips-cd1-pioneer/rip058/rip.wav
AA3B5929 rips-cd1-pioneer/rip043/rip.wav
ABAAE784 rips-cd1-pioneer/rip033/rip.wav
[...]


Pendant ce temps, des déchirures répétées de sections de faible qualité nous ont permis de terminer l'analyse avec zéro erreur fatale. Et quand j'ai vérifié ce fichier, il y avait exactement le même contenu audio que dans le rip "normal"! Cela suffit pour déclarer la victoire.

Je suis sûr à 99% que j'ai bien copié ce CD problématique, et 0xA595BC09 est le bon montant de CRC pour la piste numéro 3.

Annexe A: compare.rs


J'ai utilisé cet outil pour calculer les erreurs d'octets probables. Il n'est pas destiné à une utilisation à long terme, il est donc un peu moche, mais il peut être intéressant pour ceux qui sont tombés sur cette page, résolvant le même problème.

 extern crate memmap; use std::cmp; use std::collections::HashMap; use std::env; use std::fs; use std::sync; use std::sync::mpsc; use std::thread; use memmap::Mmap; const CHUNK_SIZE: usize = 1 << 20; fn suspect_positions( mmaps: &HashMap<String, Mmap>, start_idx: usize, end_idx: usize, ) -> Vec<usize> { let mut positions = Vec::new(); for ii in start_idx..end_idx { let mut first = true; let mut byte: u8 = 0; for (_file_name, file_content) in mmaps { if first { byte = file_content[ii]; first = false; } else if byte != file_content[ii] { positions.push(ii); break; } } } positions } fn main() { let mut args: Vec<String> = env::args().collect(); args.remove(0); let mut first = true; let mut size: usize = 0; let mut files: Vec<fs::File> = Vec::new(); let mut mmaps: HashMap<String, Mmap> = HashMap::new(); for filename in args { let mut file = fs::File::open(&filename).unwrap(); files.push(file); let mmap = unsafe { Mmap::map(files.last().unwrap()).unwrap() }; if first { first = false; size = mmap.len(); } else { assert!(size == mmap.len()); } mmaps.insert(filename, mmap); } let (suspects_tx, suspects_rx) = mpsc::channel(); let mut start_idx = 0; let mmaps_ref = sync::Arc::new(mmaps); loop { let t_start_idx = start_idx; let t_end_idx = cmp::min(start_idx + CHUNK_SIZE, size); if start_idx == t_end_idx { break; } let mmaps_ref = mmaps_ref.clone(); let suspects_tx = suspects_tx.clone(); thread::spawn(move || { let suspects = suspect_positions(mmaps_ref.as_ref(), t_start_idx, t_end_idx); suspects_tx.send(suspects).unwrap(); }); start_idx = t_end_idx; } drop(suspects_tx); let mut suspects: Vec<usize> = Vec::with_capacity(size); for mut suspects_chunk in suspects_rx { suspects.append(&mut suspects_chunk); } suspects.sort(); println!("{{\"files\": ["); let mut first_file = true; for (file_name, file_content) in mmaps_ref.iter() { let file_comma = if first_file { "" } else { "," }; first_file = false; println!("{}{{\"name\": \"{}\", \"suspect_bytes\": [", file_comma, file_name); for (ii, position) in suspects.iter().enumerate() { let comma = if ii == suspects.len() - 1 { "" } else { "," }; println!("[{}, {}]{}", position, file_content[*position], comma); } println!("]}}"); } println!("]}}"); } 

1. Dans ce seul enregistrement AccurateRip, le CRC pour toutes les pistes sauf la piste numéro 3 correspond à mon disque: la somme est 0x84B9DD1A et j'ai 0xA595BC09. Je soupçonne que le ripper n'a pas compris qu'il avait une mauvaise conduite. [retour]

2. La question évidente lors de l'achat d'un lecteur de CD ou de DVD en 2018 est: "Merde, où puis-je les acheter?" Et j'avais besoin non pas d'un, mais de plusieurs marques différentes . Je ne connais qu'un seul magasin à proximité qui dispose de lecteurs de DVD de 5,25 pouces. Un seul magasin est assez grand pour ne pas regretter l'espace de stockage pour de tels lecteurs, et assez étrange pour ne pas sembler déplacé là-bas. Bien sûr, je parler de Frys Electronics. [retour]

Source: https://habr.com/ru/post/fr418995/


All Articles