Coleciono músicas: compro CDs, digitalizo com
Exact Audio Copy e digitalizo capas e inserções. Às vezes, não é fácil se o CD foi lançado em uma edição limitada no exterior há 10 anos. O mais difícil é se o CD tiver um defeito de fabricação - e algumas faixas não puderem ser lidas.
O álbum de arranjos para piano de
Altneuland 帰 る べ き 城 foi lançado em 2005. Eu o encontrei três anos depois (provavelmente no YouTube), baixei a melhor cópia - e coloquei na lista de compras futuras. Avanços recentes na tecnologia de correio internacional tornaram possível comprar um disco usado no ano passado. Infelizmente, nenhuma das minhas unidades de CD conseguiu ler a faixa número 3. Isso geralmente acontece na compra de discos antigos, principalmente quando eles passam pelo centro de expedição internacional do USPS. Coloquei de lado e comecei a procurar outra cópia que encontrei no mês passado. Ele chegou na sexta-feira - e eu imediatamente tentei rasgá-lo. Mas com empurrado com
exatamente o mesmo erro . Parece que isso não é uma questão de desgaste ou dano - o disco provavelmente saiu defeituoso diretamente da fábrica.
ADIÇÃO: Após a investigação, não acredito mais que se trata de um defeito de fábrica. Quando gravo o início ou o fim de uma faixa ruim em um CD-R vazio e a copio, o estripador produz o mesmo erro! Tente você mesmo com o arquivo
minimal.flac .
Existem duas opções: tente um dia encontrar outra cópia que será copiada com êxito (improvável) ou, de alguma forma, restaurar os dados de som originais de discos danificados. Você já sabe qual opção eu escolhi.
Como o estripador funciona
O EAC não pôde ler a faixa n ° 3 do disco [帰 る べ き 城]Os CDs armazenam dados digitais, mas há uma interface completamente analógica entre discos, lasers e diodos ópticos. Os erros de leitura ocorrem por vários motivos: mídia suja, arranhões na camada protetora de policarbonato, vibração da própria unidade. Os códigos de correção de erros primitivos no
padrão CDDA ajudam a minimizar a distorção do som em discos raramente usados, mas não conseguem restaurar completamente o fluxo de bits em um CD com um grande número de erros. Os ripadores modernos resolvem o problema com dois métodos importantes de detecção de erros: leitura redundante e AccurateRip.
A página
EAC: Extraction Technology descreve como o EAC produz leituras redundantes:
No modo de segurança, o programa lê cada setor pelo menos duas vezes [...] Se ocorrer um erro (ler ou sincronizar), o programa continuará lendo esse setor até que 8 de 16 tentativas sejam idênticas. Esse procedimento é realizado no máximo uma vez, três ou cinco vezes (de acordo com a qualidade selecionada de recuperação de erro). Portanto, na pior das hipóteses, setores defeituosos são lidos 82 vezes!
Tudo é simples. Se uma solicitação de leitura às vezes retornar dados incorretos, leia-os novamente e, em seguida, tenha especial cuidado se as duas primeiras leituras fornecerem resultados diferentes.
O AccurateRip usa o mesmo princípio, mas de maneira distribuída: os ripadores enviam somas de verificação dos arquivos de áudio copiados para este serviço. A idéia é que, se mil pessoas copiam uma faixa com os mesmos bits, esse provavelmente é o rasgo certo.
Este artigo é sobre o que fazer se ambos os métodos não puderem ajudar. O EAC não fornece um resultado se cada leitura retornar dados diferentes, e no banco de dados AccurateRip há apenas um registro sobre um disco raro
[1] .
"Passei dez mil passagens, dez mil passagens para vê-lo"
Drives ópticos Asus, LG, Lite-On, Pioneer e OEM desconhecidoSe o CD não for copiado, é lógico usar uma unidade diferente. Às vezes, um modelo específico é mais condescendente com as especificações do CDDA, ou existe um firmware melhor para corrigir erros ou algo mais. O fórum DBpoweramp possui
uma classificação de precisão da unidade de CD / DVD para selecionar a unidade rip adequada.
No sábado de manhã, comprei cinco novas unidades de CD de diferentes fabricantes
[2] , Tentei todos eles - e encontrei um que era capaz de manter a sincronização em uma faixa de batida. Infelizmente, não foi possível obter a confirmação do rip - entre todos os rasgos, havia cerca de 20.000 bytes diferentes.
Mas agora eu tinha arquivos .wav no disco e você pode se beneficiar disso. Eu raciocinei que os erros de leitura em uma faixa ruim estão próximos do "correto". Portanto, faz sentido fazer vários rasgos e encontrar um valor de "consenso" para bytes instáveis. Essa abordagem acabou sendo bem-sucedida, mas exigiu muito mais trabalho do que eu esperava.
"Quantidade entra em qualidade"
Comecei copiando um disco várias vezes em uma das unidades, escrevendo todos os valores para cada byte e declarando o erro “corrigível” se mais da metade dos rasgos produzir um valor de byte específico para esta posição. O começo foi bom: o número de erros incorrigíveis diminuiu de quase ~ 6900 bytes em N = 4 para ~ 5000 bytes em N = 10. O benefício de cada rip adicional diminuiu ao longo do tempo, até cerca de N = 80, o número de erros incorrigíveis estabilizados em ~ 3700. Parei de rasgar em N = 100.
Erros corrigidos e fatais no número de ripTentei copiar o disco 100 vezes na segunda unidade e usar duas placas de correção para "preencher" as posições de erro incorrigíveis da primeira unidade. Mas não funcionou: em cada unidade, havia milhares de correções que não correspondiam às correções na outra! Acontece que o ruído não pode ser eliminado combinando-o com outra fonte de ruído, mas relacionada.
A mesma coisa, mas para dois discos de validação cruzadaArte artesanal

Há outro bom recurso no site da EAC: o
teste de qualidade DAE , que determina a qualidade do firmware de uma unidade pelo nível de erros que estão sendo corrigidos. Este é um tratamento de erro de nível inferior quando a unidade
corrige erros de leitura em vez de apenas relatá-los. O problema é que o "modo de segurança" do EAC só está disponível quando você desabilita esse código de correção de erros interno, sugerindo que ele não funciona corretamente.
Preparei o teste gravando o arquivo .wav em CD-R, destacando o setor exato na superfície dos dados e pintando-o cuidadosamente com um marcador preto. Esses são erros fatais garantidos em um padrão determinístico.
Testei todas as unidades e obtive dois resultados interessantes:

Usei a unidade Lite-On para solucionar os erros de sincronização. Ele mastigou o marcador mágico com prazer, mas ficou muito confuso com as linhas retas na superfície dos dados. Você pode ver como, em vez de três picos separados à direita, há um blob gigante com falha.
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)

A unidade Pioneer recebeu a maior pontuação no DAE. Na minha opinião, o gráfico não parece ser especial, mas a ferramenta de análise disse que este é o melhor firmware para corrigir erros no meu pequeno 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)
"A partir de um certo momento, os números são importantes"
Como usar o firmware da Pioneer com boa correção de erro se o EAC do "modo de segurança" o ignora? Muito simples: alterne o EAC para o "modo burst" e escreva no disco o fluxo de bits na forma em que o firmware os relata. Como então transformar esse monte de arquivos .wav não verificados em um arquivo de boa qualidade, como no "modo de segurança"? Sim, a mesma ferramenta de análise de erro que usamos nos rasgos com o Lite-On!
Após algumas definições de configuração do EAC e depois de cem rasgos, obtemos um diagrama tão bonito.
Erros corrigidos e incorrigíveis no número de rasgos (Pioneer)O que pode ser observado:
- Erros de bits fatais rapidamente tendem a zero, mas nunca atingem.
- Um enorme salto em bugs corrigidos em 53-54 rasgos.
- O número de erros antes e depois desse grande salto praticamente não muda, o que indica áreas de estabilidade nos dados copiados.
0xA595BC09
Usando uma correção de erro quase perfeita da Pioneer, gerei um arquivo de "melhor palpite" e comecei a compará-lo com os rasgos da Pioneer. Como esperado, várias seções de baixa qualidade foram descobertas, que eu corrigi fazendo mais 10 rasgos:
$ 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
Também achei algo realmente interessante: vários rasgos produziram
exatamente o mesmo conteúdo! Lembre-se, este é precisamente o critério para o sucesso no EAC "modo de segurança".
shncat -q -e | rhash --print="%C"
shncat -q -e | rhash --print="%C"
usado para calcular a soma de verificação CRC32 dos dados de áudio brutos: é o que o EAC usa.
$ 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
[...]
Enquanto isso, rasgos repetidos de seções de baixa qualidade nos permitiram concluir a análise com zero erro fatal. E quando eu verifiquei este arquivo, havia exatamente o mesmo conteúdo de áudio que no rasgo "normal"! Isso é suficiente para declarar vitória.
Tenho 99% de certeza de que copiei com êxito este CD problemático e 0xA595BC09 é a quantidade certa de CRC para a faixa número 3.
Apêndice A: compare.rs
Eu usei essa ferramenta para calcular erros prováveis de bytes. Ele não se destina ao uso a longo prazo, por isso é um pouco feio, mas pode ser interessante para quem se deparou com esta página, resolvendo o mesmo 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
Neste único registro AccurateRip, o CRC de todas as faixas, exceto a faixa número 3, corresponde ao meu disco: a soma é 0x84B9DD1A e eu tenho 0xA595BC09. Eu suspeito que o estripador não entendeu que ele tem uma má condução.
[voltar]2)
A pergunta óbvia ao comprar uma unidade de CD ou DVD em 2018 é: "Droga, onde posso comprá-los?" E eu não precisava de um, mas de
várias marcas diferentes . Eu conheço apenas uma loja próxima que possui unidades de DVD de 5,25 "disponíveis. Somente uma loja é grande o suficiente para não se arrepender do espaço de prateleira para essas unidades e estranha o suficiente para não parecer fora de lugar por lá. falando sobre a Frys Electronics.
[voltar]