Быстрое чтение данных с CD-ROM - PullRequest
2 голосов
/ 02 февраля 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 02 февраля 2010

Два метода:

  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 в этом случае.
2 голосов
/ 02 февраля 2010

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

0 голосов
/ 02 февраля 2010

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

...