¿Por qué grabé un CD 300 veces?

Colecciono música: compro CD, los digitalizo con Exact Audio Copy y escaneo portadas e inserciones. A veces no es fácil si el CD se lanzó en una edición limitada en el extranjero hace 10 años. Lo más difícil es si el CD tiene un defecto de fabricación, y algunas pistas no se pueden leer.

El álbum de arreglos para piano de Altneuland 帰 る べ き 城 fue lanzado en 2005. Lo encontré tres años después (probablemente en YouTube), descargué la mejor copia y la puse en la lista de futuras compras. Los recientes avances en la tecnología de correo internacional han permitido comprar un disco usado el año pasado. Desafortunadamente, ninguna de mis unidades de CD podía leer la pista número 3. Esto sucede a menudo al comprar discos viejos, especialmente cuando pasaron por el centro de envío internacional de USPS. Lo puse a un lado y comencé a buscar otra copia que encontré el mes pasado. Llegó el viernes, e inmediatamente intenté destrozarlo. Pero con empujado con exactamente el mismo error . Parece que esto no es una cuestión de desgaste o daño: el disco probablemente salió defectuoso directamente de fábrica.

ADICIÓN: Después de la investigación, ya no creo que este sea un defecto de fábrica. Cuando escribo el principio o el final de una pista incorrecta en un CD-R vacío y lo copio, ¡el extractor produce el mismo error! Pruébelo usted mismo con el archivo minimal.flac .

Quedan dos opciones: intentar algún día encontrar otra copia que se copie con éxito (poco probable) o de alguna manera restaurar los datos de sonido originales de los discos dañados. Ya sabes qué opción he elegido.

Cómo funciona el destripador



EAC no pudo leer la pista No. 3 del disco [帰 る べ き 城]

Los CD almacenan datos digitales, pero hay una interfaz completamente analógica entre discos, láseres y diodos ópticos. Los errores de lectura se producen por varios motivos: medios sucios, arañazos en la capa protectora de policarbonato, vibración del propio disco. Los códigos de corrección de errores primitivos en el estándar CDDA ayudan a minimizar la distorsión del sonido en discos raramente utilizados, pero no pueden restaurar completamente el flujo de bits en un CD con una gran cantidad de errores. Los extractores modernos resuelven el problema con dos métodos importantes de detección de errores: lectura redundante y AccurateRip.

La página EAC: Tecnología de extracción describe cómo EAC produce lecturas redundantes:

En modo seguro, el programa lee cada sector al menos dos veces [...] Si ocurre un error (leer o sincronizar), el programa continúa leyendo este sector hasta que 8 de 16 intentos sean idénticos. Tal procedimiento se lleva a cabo como máximo una vez, tres o cinco veces (de acuerdo con la calidad seleccionada de recuperación de errores). ¡En el peor de los casos, los sectores defectuosos se leen 82 veces!

Todo es simple Si una solicitud de lectura a veces devuelve datos incorrectos, léelos nuevamente y luego tenga especial cuidado si las dos primeras lecturas dan resultados diferentes. AccurateRip utiliza el mismo principio, pero de manera distribuida: los extractores envían sumas de verificación de los archivos de audio copiados a este servicio. La idea es que si mil personas copiaron una pista con los mismos bits, esta es probablemente la copia correcta.

Este artículo trata sobre qué hacer si ambos métodos no pueden ayudar. EAC no da un resultado si cada lectura devuelve datos diferentes, y en la base de datos AccurateRip solo hay un registro sobre un disco raro [1] .

"Pasé diez mil pasajes, diez mil pasajes para verte"



Unidades ópticas Asus, LG, Lite-On, Pioneer y OEM desconocido

Si el CD no se copia, entonces es lógico usar una unidad diferente. A veces, un modelo en particular es más condescendiente con las especificaciones de CDDA, o hay un mejor firmware para corregir errores u otra cosa. El foro DBpoweramp tiene una clasificación de precisión de unidad de CD / DVD para seleccionar la unidad de extracción más adecuada.

El sábado por la mañana, compré cinco nuevas unidades de CD de diferentes fabricantes [2] , Los probé todos y encontré uno que podía mantener la sincronización en una pista de ritmo. Desafortunadamente, no se pudo obtener la confirmación de extracción: entre todas las copias había aproximadamente 20,000 bytes diferentes.

Pero ahora tenía archivos .wav en el disco, y puede beneficiarse de esto. Razoné que los errores de lectura en una mala pista están cerca del "correcto". Por lo tanto, tiene sentido hacer varias extracciones y encontrar un valor de "consenso" para bytes inestables. Este enfoque fue finalmente exitoso, pero requirió mucho más trabajo del que esperaba.

"La cantidad entra en calidad"


Comencé copiando el disco repetidamente en una de las unidades, escribiendo todos los valores para cada byte y declarando el error "corregible" si más de la mitad de las rasgaduras produce un valor de byte específico para esta posición. El comienzo fue bueno: el número de errores no corregibles disminuyó de casi ~ 6900 bytes a N = 4 a ~ 5000 bytes a N = 10. El beneficio de cada rasgadura adicional disminuyó con el tiempo, hasta que alrededor de N = 80 el número de errores no corregibles se estabilizó en ~ 3700. Dejé de rasgar a N = 100.


Errores fijos y fatales en el número de rasgaduras

Luego intenté copiar el disco 100 veces en la segunda unidad y usar dos tarjetas de corrección para "llenar" las posiciones de error que no se pueden corregir desde la primera unidad. Pero no funcionó: ¡en cada unidad había miles de correcciones que no correspondían a las correcciones de la otra! Resulta que el ruido no puede eliminarse combinándolo con otra fuente de ruido pero relacionada.


Lo mismo, pero para dos discos de validación cruzada

Arte artesanal




Hay otro buen recurso en el sitio web de EAC: la prueba de calidad DAE , que determina la calidad del firmware de una unidad por el nivel de errores que se corrigen. Este es un manejo de errores de nivel inferior cuando la unidad corrige los errores de lectura en lugar de solo informarlos. El problema es que el "modo seguro" del EAC solo está disponible cuando deshabilita este código de corrección de errores incorporado, lo que sugiere que no funciona correctamente.

Preparé la prueba grabando el archivo .wav en CD-R, resaltando el sector exacto en la superficie de datos y pintándolo cuidadosamente con un marcador negro. Estos son errores fatales garantizados en un patrón determinista.

Probé todas las unidades y obtuve dos resultados interesantes:



Utilicé la unidad Lite-On para evitar errores de sincronización. Masticó el marcador mágico con placer, pero estaba muy confundido por las líneas rectas en la superficie de datos. Puede ver cómo, en lugar de tres picos separados a la derecha, hay un blob fallido gigante.

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)




La unidad Pioneer recibió el puntaje DAE más alto. En mi opinión, el cuadro no parece especial, pero la herramienta de análisis dice que este es el mejor firmware para corregir errores en mi pequeño conjunto.

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)


“Desde cierto momento, los números importan”


¿Cómo utilizar el firmware de Pioneer con una buena corrección de errores si el EAC de "modo seguro" lo ignora? Muy simple: cambie el EAC al "modo de ráfaga" y escriba en el disco el flujo de bits en la forma en que el firmware los informa. ¿Cómo convertir este grupo de archivos .wav no verificados en un archivo de buena calidad, como en "modo seguro"? Sí, la misma herramienta de análisis de errores que utilizamos en rips con Lite-On!

Después de algunos ajustes de configuración de EAC y después de cien rasgaduras, obtenemos un diagrama tan hermoso.


Errores fijos e incorregibles en el número de rasgaduras (Pioneer)

Lo que se puede notar:

  • Los errores de bits fatales tienden rápidamente a cero, pero nunca lo alcanzan.
  • Un gran salto en errores corregidos en 53-54 rasgaduras.
  • El número de errores antes y después de este gran salto prácticamente no cambia, lo que indica áreas de estabilidad en los datos copiados.

0xA595BC09


Utilizando una corrección de error casi perfecta de Pioneer, generé un archivo de "mejor conjetura" y comencé a compararlo con las rasgaduras de Pioneer. Como se esperaba, se descubrieron varias secciones de baja calidad, que corregí haciendo otras 10 rasgaduras:

$ 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


También encontré algo realmente interesante: ¡varias rasgaduras produjeron exactamente el mismo contenido! Recuerde, este es precisamente el criterio para el éxito en el EAC "modo seguro". shncat -q -e | rhash --print="%C" comando shncat -q -e | rhash --print="%C" shncat -q -e | rhash --print="%C" usa para calcular la suma de verificación CRC32 de datos de audio shncat -q -e | rhash --print="%C" : es lo que usa el EAC.

$ 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
[...]


Mientras tanto, los cortes repetidos de secciones de baja calidad nos permitieron completar el análisis con cero errores fatales. Y cuando revisé este archivo, ¡había exactamente el mismo contenido de audio que en el rip "normal"! Esto es suficiente para declarar la victoria.

Estoy 99% seguro de haber copiado con éxito este CD problemático, y 0xA595BC09 es la cantidad correcta de CRC para la pista número 3.

Apéndice A: compare.rs


Usé esta herramienta para calcular posibles errores de byte. No está destinado a un uso a largo plazo, por lo que es un poco feo, pero puede ser interesante para quienes tropezaron con esta página, resolviendo el mismo problema.

 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) En este único registro AccurateRip, el CRC para todas las pistas excepto la pista número 3 coincide con mi disco: la suma es 0x84B9DD1A, y tengo 0xA595BC09. Sospecho que el destripador no entendió que tiene una mala conducción. [volver]

2) La pregunta obvia al comprar una unidad de CD o DVD en 2018 es: "Maldición, ¿dónde puedo comprarlos?" Y no necesitaba uno, sino varios de diferentes marcas . Sé que solo hay una tienda cercana que tiene unidades de DVD de 5.25 "disponibles. Solo una tienda es lo suficientemente grande como para no lamentar el espacio en el estante para tales unidades, y lo suficientemente extraño como para no parecer fuera de lugar. Por supuesto, hablando de Frys Electronics. [volver]

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


All Articles