Pergunta

Eu tenho que ler um arquivo grande contendo muitos quadros de animação do CD/DVDROM e exibi -lo na tela como uma animação. Ao ler o disco rígido, a estratégia de ler um quadro na memória, processamento, exibição e leitura do próximo quadro funciona bem, mas quando leio a partir do dispositivo óptico, o tempo de acesso mata a animação.

Eu uso métodos C e WinAPI OpenFile/ReadFile.

Como devo ler o conteúdo de um arquivo armazenado em um dispositivo óptico para obter velocidade de animação em tempo real (eu vi um programa que o faz mesmo em velocidade dupla, com certeza ele não buffer o arquivo inteiro antes do início da animação)?

Foi útil?

Solução

Duas técnicas:

  1. Buffer ou cache grande, como em vários MB. O CD/DVD possui E/S seqüencial razoável, mas velocidades de busca/acesso muito lentas (como você observou), por isso é rápido reabastecer o buffer. Você só precisa que o buffer seja grande o suficiente para que ele cubra alguns segundos para permitir que o disco gire, se necessário, e procure se já foi criado.

  2. Multi-threading: mantenha um thread lendo continuamente e uma animação de decodificação de threads separada. O tópico do leitor deve bloquear se ficar muito à frente da decodificação.

Essas técnicas se aplicam a qualquer linguagem de programação e podem ser combinadas para obter o melhor efeito. Um buffer de leitura e um buffer de quadro decodificado protege você duas vezes também contra o tempo de decodificação e o tempo de acesso.

EDITAR:Estas são as técnicas que o Mplayer usa. Além disso, você deve considerar seu formato de codificação, se puder - diferentes formatos podem negociar o tempo da CPU na decodificação de menos dados a serem lidos no disco. Algumas informações para estimar quanto vídeo devem ser compactadas.

  • LEIA VELOCIDADE PARA 1X CD-ROM: 150 KIB/S (velocidade mínima nua)
  • Leia a velocidade 4x CD-ROM: 600 KIB/S (unidade mínima padrão)
  • Leia a velocidade 16x CD-ROM: 1600 kib/s (máximo obtido, geralmente é executado apenas até 8x)
  • Leia a velocidade 1x DVD DVD: ~ 1,3 MIB/S
  • Vídeo de definição padrão compactado com mpeg2 em qualidade de DVD: ~ 600 kib/s
  • Vídeo de definição padrão compactado com mpeg4 na qualidade do DVD: ~ 100 kib/s
  • Vídeo de definição padrão não compactado: ~ 30 mb/s
  • Imagem padrão de 1000x1000 (1 megapixel) a 24 bits da cor: 3 MB
  • Imagem padrão de 1 megapixel em cores de 8 bits (escala de cinza): 1 MB

Edit2: informações adicionais

  • Observe que os DVDs geralmente podem ser lidos em 8x ou mais se a sua unidade suportar (a maioria faz agora).
  • As animações começam a parecer suaves em mais de 24 quadros/segundo. Abaixo disso, eles parecerão espumosos a um espectador.
  • A compressão sem perdas é geralmente boa para uma redução de 50% no tamanho para imagens fotográficas. Sua milhagem pode variar.
  • A reprodução suave das animações dependerá parcialmente de como você fala com o hardware de vídeo. Alguns métodos produzirão melhores resultados que outros. Eu sugiro que você olhe para o código do MPlayer neste caso.

Outras dicas

Uma coisa a experimentar é a compressão. O carregamento de um arquivo zip da unidade, por exemplo, levará menos tempo, mas exigirá mais tempo da CPU para processar. Se a compactação sem perdas for possível, isso pode valer a pena inspecionar. Compreender uma unidade de CD também é útil. A unidade gira a uma velocidade de rotação fixa. Isso significa que dados sobre o fora do disco carrega mais rápido que os dados por dentro. Um queimador, no entanto, queimará dados de dentro para fora, para que você possa acabar tendo que queimar muitos dados antes da "animação" para obter a velocidade máxima de leitura.

usar Createfile com open_always e file_flag_sequencial_scan

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top