Pregunta

Tengo que leer un archivo grande que contiene muchos cuadros de animación de CD/DVDROM y mostrarlo en pantalla como animación. Al leer el disco duro, la estrategia de leer un marco en la memoria, procesar, mostrar y luego leer el siguiente cuadro funciona bien, pero cuando leo desde el dispositivo óptico, el tiempo de acceso mata la animación.

Utilizo métodos C y Winapi OpenFile/ReadFile.

¿Cómo debo leer el contenido de un archivo almacenado en un dispositivo óptico para lograr la velocidad de animación en tiempo real (he visto un programa que lo hace incluso a doble velocidad, seguro que no amortigua todo el archivo antes de comenzar la animación)?

¿Fue útil?

Solución

Dos técnicas:

  1. Buffer o caché grande, como en múltiples MB. CD/DVD tiene E/S secuenciales razonables pero velocidades de búsqueda/acceso muy lentas (como ha señalado), por lo que es rápido rellenar el búfer. Solo necesita que el búfer sea lo suficientemente grande como para que cubra unos segundos para permitir que el disco gire si es necesario, y busque si ya giró.

  2. Multi-subprocesos: mantenga un hilo continuamente leyendo y una animación de decodificación de hilo separada. El hilo del lector debe bloquear si se adelanta demasiado a la decodificación.

Estas técnicas se aplican a cualquier lenguaje de programación y se pueden combinar para obtener el mejor efecto. Un búfer de lectura y un búfer de marco decodificado lo protegen dos veces también contra el tiempo de decodificación y el tiempo de acceso.

EDITAR:Estas son las técnicas que usa MPlayer. Además, debe considerar su formato de codificación si puede: diferentes formatos pueden intercambiar el tiempo de la CPU en la decodificación de menos datos para leer desde el disco. Un par de información para estimar cuánto video debe comprimirse.

  • Lea la velocidad para 1x CD-ROM: 150 kib/s (velocidad mínima)
  • Lea la velocidad 4x CD-ROM: 600 kib/s (unidad mínima estándar)
  • Lea la velocidad 16x CD-ROM: 1600 kib/s (máximo obtenible, generalmente solo se ejecuta hasta 8x)
  • Leer Velocidad 1x DVD Drive: ~ 1.3 MIB/S
  • Video de definición estándar comprimido con MPEG2 en calidad de DVD: ~ 600 kib/s
  • Video de definición estándar comprimido con MPEG4 en la calidad del DVD: ~ 100 kib/s
  • Video de definición estándar sin comprimir: ~ 30 MB/s
  • Imagen estándar de 1000x1000 (1 megapíxeles) a 24 bits color: 3 mb
  • Imagen estándar de 1 megapíxeles a color de 8 bits (escala de grises): 1 MB

Edit2: información adicional

  • Tenga en cuenta que los DVD comúnmente se pueden leer a 8 veces más o menos si su unidad lo admite (la mayoría lo hace ahora).
  • Las animaciones comienzan a parecer suaves a más de 24 cuadros/segundo. Debajo de eso aparecerán jerky a un espectador.
  • La compresión sin pérdidas suele ser buena para una reducción de aproximadamente el 50% en tamaño para imágenes fotográficas. Sin embargo, su kilometraje puede variar.
  • La reproducción suave de las animaciones dependerá en parte de cómo hablas con el hardware de video. Algunos métodos producirán mejores resultados que otros. Le sugiero que vea el código para MPlayer en este caso.

Otros consejos

Una cosa para probar es la compresión. Cargar un archivo zip de la unidad, por ejemplo, tomará menos tiempo pero requerirá más tiempo de CPU para procesar. Si es posible la compresión sin pérdida, entonces puede valer la pena inspeccionar. Comprender una unidad de CD también es útil. La unidad gira a una velocidad de rotación fija. Esto significa que los datos en el fuera de del disco se carga más rápido que los datos en el interior. Sin embargo, un quemador grabará datos desde el interior hacia afuera, por lo que puede terminar teniendo que quemar muchos datos antes de la "animación" para obtener la velocidad de lectura máxima.

usar Crea un archivo con Open_always y file_flag_sequential_scan

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top