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

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

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

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


person bartek    schedule 01.02.2010    source источник
comment
DICOM - действительно сложный формат... в зависимости от того, какое разрешение и параметры сжатия, вы, возможно, не сможете читать с компакт-диска достаточно быстро, чтобы воспроизводить его в реальном времени. В этом случае вам следует выбирать между замедленным воспроизведением и рывками. DVD не должны вызывать проблем — см. таблицу относительных скоростей и битрейтов.   -  person BobMcGee    schedule 02.02.2010


Ответы (3)


Две техники:

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

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

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

EDIT: Это техники, которые использует 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 в этом случае.
person BobMcGee    schedule 01.02.2010
comment
Должны ли данные считываться в некоторых определенных фрагментах данных, или лучше использовать перекрывающийся ввод-вывод? - person bartek; 02.02.2010
comment
@bartek: перекрывающийся ввод-вывод будет обходить системный кеш, поэтому (вероятно) он будет плавнее, но не обязательно быстрее. - person John Knoeller; 02.02.2010
comment
Большое спасибо, это действительно полезно. Я не уверен, что понимаю, что означает постоянное чтение, имеет ли какое-то значение, если я вызываю ReadFile много раз с меньшим read_buffer или меньше раз с большим буфером? Я обнаружил, что использование std::fstream, кажется, использует более плавный диск, может ли это быть правдой? - person bartek; 02.02.2010
comment
@Bartek: для этих целей не имеет значения, какой у вас метод чтения, если он постоянно извлекает из файла и передает в отдельный поток декодирования (возможно, разбивая на кадры в качестве этапа предварительной обработки). Попробуйте разные методы чтения и посмотрите, какой из них даст наибольшую пропускную способность. Самое важное в многопоточном подходе — это то, что вы отделяете поток ввода-вывода от декодирования. Это означает, что ваша пропускная способность ограничена только более медленным шагом, а не их комбинацией. Может иметь решающее значение для вещей, интенсивно использующих как ввод-вывод, так и процессор. - person BobMcGee; 02.02.2010

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

person Goz    schedule 01.02.2010
comment
Это хороший совет (и применимый и к жестким дискам), но, если я правильно понял, спрашивающий не имеет большого контроля над размещением данных на диске или форматом анимации. Думаю, было бы неплохо упомянуть о скорости чтения для оптических приводов в сравнении со стандартными битрейтами для форматов сжатого видео. - person BobMcGee; 02.02.2010
comment
если быть более точным, я читал файлы dicom (формат медицинских изображений), данные в многокадровых изображениях всегда хранятся кадр за кадром в одном сегменте данных, иногда они кодируются без потерь. - person bartek; 02.02.2010
comment
Можете ли вы закодировать его с потерями? Можете ли вы поместить его в любое место на диске? - person Goz; 02.02.2010
comment
Если я создаю компакт-диски, я могу, но обычно мне приходится читать то, что я получаю, также у IHE есть несколько ограничений на шифрование данных и компакт-диски пациентов. - person bartek; 02.02.2010
comment
Я очень расстроен, потому что не могу добиться хороших результатов, когда другие могут. Я не понимаю CD-привод io хорошо. Я еще не пробовал FILE_FLAG_SEQUENTIAL_SCAN. - person bartek; 02.02.2010

используйте CreateFile с OPEN_ALWAYS и FILE_FLAG_SEQUENTIAL_SCAN

person John Knoeller    schedule 01.02.2010