Графика для Windows средствами DirectDraw
Шрифт:
Второе поле структуры AVISTREAMINFO, fccHandler, определяет алгоритм сжатия, примененный при сохранении видеопотока. Как вы вскоре увидите, в Video For Windows это поле можно использовать для создания «декомпрессоров», которые способны восстановить каждый сжатый кадр из потока.
Поле dwStart определяет индекс первого кадра потока (это важно, потому что первый кадр видеоролика может иметь индекс 0 или 1). Эту же величину можно непосредственно получить функцией AVIStreamStart.В поле dwLength хранится общее количество кадров видеоролика. Его можно либо взять
Теперь мы знаем, как открыть видеопоток и получить сведения о нем. Можно переходить к процессу чтения и отображения видеокадров. Чтение кадров выполняется функцией AVIStreamRead. Эта функция, получив логический номер потока и индекс интересующего нас кадра, помещает данные кадра в буфер, который мы также должны ей передать. Данные кадра хранятся в сжатом виде, поэтому перед отображением их необходимо восстановить.
Для восстановления кадров применяется функция ICDecompress. Она получает два буфера: в одном находятся сжатые данные, а в другой будет помещен восстановленный кадр. Функции ICDecompress также следует передать логический номер декомпрессора, используемого функцией ICDecompress для обработки сжатых данных.
Логический номер декомпрессора можно получить функцией ICDecompressOpen. По описанию видеоданных функция ICDecompressOpen ищет декомпрессор с поддержкой нужного алгоритма восстановления.
После завершения работы с потоком необходимо закрыть его функцией AVIStreamRelease. После вызова функции AVIStreamRelease логический номер потока становится недействительным (до повторного открытия потока). Наконец, перед завершением программы необходимо вызвать функцию AVIFileExit, которая освобождает программные модули VFW.
Программа AviPlay
Пора браться за программирование. Программу AviPlay, как и все остальные программы, рассматриваемые в этой книге, можно найти на CD-ROM.
Программа AviPlay использует Video For Windows для открытия и воспроизведения AVI-файлов на поверхностях DirectDraw. Она позволяет выбрать любой AVI-файл и задать видеорежим для воспроизведения ролика. Диалоговое окно для выбора файла изображено на рис. 8.1.
Рис. 8.1. Диалоговое окно для выбора AVI-файла в программе AviPlay
Если вы еще не успели опробовать программу AviPlay и не обнаружили этого сами, я хочу указать на несколько вещей, которые эта программа не умеет делать. Например, она не воспроизводит аудиопотоки из выбранного AVI-файла, а лишь извлекает и воспроизводит графическую часть файла.
Кроме того, программа не пытается управлять частотой вывода кадров; все кадры извлекаются и воспроизводятся с максимальной скоростью. В каждом AVI-файле присутствуют хронометрические данные, которые используются всеми полноценными программами для воспроизведения AVI-файлов.
Еще одна полезная возможность, которая бы пригодилась в программе AviPlay, — поддержка 16- и 24-битных видеорежимов. В представленном варианте всегда применяются 8-битные режимы независимо от глубины пикселей воспроизводимого ролика.
Большинство
Листинг 8.1. Класс AviPlayWin