Быстрое чтение данных с CD-ROM

Я должен прочитать большой файл, содержащий много кадров анимации с CD/DVDrom и отобразить его на экране в виде анимации. При чтении с жесткого диска стратегия чтения кадра в память, обработки, отображения и последующего чтения следующего кадра работает хорошо, но когда я читаю с оптического устройства, время доступа убивает анимацию.

Я использую C и winapi OpenFile/ReadFile методы.

Как мне прочитать содержимое файла, хранящегося на оптическом устройстве, чтобы достичь скорости анимации в реальном времени (я видел программу, которая делает это даже с удвоенной скоростью, чтобы точно не буферизовать весь файл перед запуском анимации)?

3 ответа

Решение

Две техники:

  1. БОЛЬШОЙ буфер или кеш, как в нескольких МБ. CD/DVD имеет разумные последовательные операции ввода-вывода, но очень медленные скорости поиска / доступа (как вы заметили), поэтому заполнение буфера происходит быстро. Вам просто нужно, чтобы буфер был достаточно большим, чтобы он занимал несколько секунд, чтобы позволить диску раскручиваться при необходимости и искать, если он уже раскрутился.

  2. Многопоточность: непрерывное чтение одного потока и анимация декодирования отдельного потока. Поток читателя должен блокироваться, если он слишком далеко опережает декодирование.

Эти методы применимы к любому языку программирования и могут быть объединены для достижения наилучшего эффекта. Один буфер чтения и один буфер декодированных кадров защищают вас в два раза от времени декодирования и времени доступа.

РЕДАКТИРОВАТЬ: Это методы, которые использует MPlayer. Кроме того, вы должны рассмотреть свой формат кодирования, если можете - различные форматы могут компенсировать время ЦП при декодировании для меньшего количества данных для чтения с диска. Пару информации для оценки того, сколько видео должно быть сжато.

  • Скорость чтения для 1x CD-ROM: 150 КБ / с (минимальная скорость)
  • Скорость чтения 4x CD-ROM: 600 КБ / с (стандартный минимальный привод)
  • Скорость чтения 16x CD-ROM: 1600 КБ / с (максимально достижимо, обычно работает только до 8x)
  • Скорость чтения 1x DVD-привода: ~1,3 МБ / с
  • Видео стандартной четкости, сжатое с помощью MPEG2 с качеством DVD: ~600 кБ / с
  • Видео стандартной четкости, сжатое MPEG4 с качеством DVD: ~100 кБ / с
  • Несжатое видео стандартной четкости: ~30 МБ / с
  • Стандартное изображение 1000x1000 (1 мегапиксель) в цвете 24 бита: 3 МБ
  • Стандартное 1-мегапиксельное изображение в 8-битном цвете (в оттенках серого): 1 МБ

Edit2: дополнительная информация

  • Обратите внимание, что DVD-диски обычно можно читать со скоростью 8x или около того, если ваш привод поддерживает это (большинство делают это сейчас).
  • Анимации начинают казаться плавными со скоростью 24+ кадров в секунду. Ниже они будут казаться вяленым телезрителю.
  • Сжатие без потерь, как правило, хорошо для фотографических изображений примерно на 50%. Ваш пробег может отличаться, хотя.
  • Плавное воспроизведение анимации будет частично зависеть от того, как вы говорите с видеооборудованием. Некоторые методы будут давать лучшие результаты, чем другие. Я НАСТОЯТЕЛЬНО предлагаю вам взглянуть на код для MPlayer в этом случае.

Одна вещь, чтобы попробовать это сжатие. Например, загрузка zip-файла с диска займет меньше времени, но требует больше процессорного времени для обработки. Если возможно сжатие без потерь, то это стоит проверить. Понимание привода компакт-дисков тоже полезно. Привод вращается с фиксированной скоростью вращения. Это означает, что данные на внешней стороне диска загружаются быстрее, чем данные на внутренней стороне. Однако, записывающее устройство будет записывать данные изнутри наружу, поэтому вам может понадобиться сжечь много данных перед "анимацией", чтобы получить максимальную скорость чтения.

Использовать CreateFile с OPEN_ALWAYS и FILE_FLAG_SEQUENTIAL_SCAN

Другие вопросы по тегам