Начальные сведения
Перед тем как переходить к техническим подробностям, давайте кратко рассмотрим важнейшие понятия и концепции работы с видеороликами. Если вам уже приходилось заниматься воспроизведением видео, этот раздел кратко напомнит основные положения.
С концептуальной точки зрения видеофайл представляет собой последовательность растровых изображений, каждое из которых содержит очередной кадр. Обычно все растры последовательности обладают одинаковыми размерами и предназначаются для вывода с постоянной скоростью. Нередко растры сопровождаются звуковыми данными — авторским повествованием, диалогом или музыкой.
Графическая и звуковая (необязательная) часть видеоролика часто называются
Формат AVI (Audio Video Interleave) был разработан Microsoft для хранения и воспроизведения видеороликов. AVI-файл кроме последовательности растров содержит одну или несколько звуковых дорожек, сопровождающих видеоролик. В этой главе нам придется часто пользоваться AVI-файлами.
Почему для хранения видеоинформации нужен специальный файловый формат? Почему нельзя представить видеоролик в виде последовательности растров и звукового файла? Существует несколько причин, но, видимо, самая важная из них — сжатие. Если кадры видеоролика будут храниться без сжатия (например, в BMP-файлах), то даже относительно короткий ролик будет занимать слишком много места. Например, 1-минутный ролик при разрешении 320×200 и частоте вывода 30 кадров в секунду займет на диске свыше 100 Мбайт.
Разумеется, для практического применения видеороликов необходимо сжатие. Возникает вопрос: какое именно? Существует много различных алгоритмов сжатия, каждый из которых обладает своими достоинствами и недостатками. Маловероятно, чтобы один алгоритм подошел сразу по всем критериям.
Поэтому в AVI-файлах была предусмотрена поддержка разнообразных методов сжатия. Конечно, без развитого API чтение AVI-файлов было бы очень сложной задачей. К счастью, в Windows существует специальный API Video For Windows, который мы вскоре рассмотрим.
Форматы видеофайлов (такие как AVI) фактически поддерживают два уровня сжатия. Различные алгоритмы обеспечивают сжатие отдельных кадров; кроме того, некоторые кадры представляются не в виде самостоятельных изображений, а в виде изменений, внесенных в предыдущие кадры.
Это объясняется тем, что типичный видеоролик состоит из похожих изображений. Например, если в нем показано, как человек идет по комнате, то фигура человека будет изменяться от кадра к кадру, но остальная часть (комната), скорее всего, останется практически неизменной. Следовательно, такой видеоролик можно представить в виде первого кадра и цепочки последующих изменений.
Кадры видеоролика с полным изображением называются
Открытый видеофайл обычно называется потоком. Как мы увидим в следующем разделе, посвященном Video For Windows API, концепция потока тесно интегрирована с Video For Windows.
Для создания и чтения AVI-файлов Windows предоставляет разработчикам Video For Windows (VFW) API. Этот API заметно упрощает задачу воспроизведения видео, поскольку в нем имеются удобные средства для поиска и извлечения кадров из ролика.
VFW не пытается поддерживать все возможные алгоритмы сжатия, используемые для хранения AVI-данных. Вместо этого VFW допускает установку и удаление компрессоров и декомпрессоров, обеспечивающих работу одного или нескольких алгоритмов сжатия. Таким образом, VFW позволяет выбрать нужные компрессор и декомпрессор в зависимости от потребностей разработчика. Кроме поддержки сжатия и распаковки VFW API предоставляет средства для поиска и извлечения кадров, а также для решения других задач, связанных с потоками.
Имена многих функций VFW API начинаются с букв AVI. Другие функции (например, относящиеся к сжатию) начинаются с IC. Существуют некоторые исключения, но большинство функций VFW снабжается одним из этих префиксов. Алфавитный список всех функций VFW приведен в табл. 8.1.
Таблица 8.1. Функции VFW
AVIBuildFilter()
AVICLearClipboard()
AVIFileAddRef()
AVIFileCreateStream()
AVIFileEndRecord()
AVIFileExit()
AVIFileGetStream()
AVIFileInfo()
AVIFileInit()
AVIFileOpen()
AVIFileReadData()
AVIFileRelease()
AVIFileWriteData()
AVIGetFromClipboard()
AVIMakeCompressedStream()
AVIMakeFileFromStream()
AVIMakeStreamFromClipboard()
AVIPutFileOnClipboard()
AVISave()
AVISaveOptions()
AVISaveOptionsFree()
AVISaveV()
AVIStreamAddRef()
AVIStreamBeginStreaming()
AVIStreamCreate()
AVIStreamEndStreaming()
AVIStreamCreate()
AVIStreamEndStreaming()
AVIStreamFindSample()
AVIStreamGetFrame()
AVIStreamGetFrameClose()
AVIStreamGetFrameOpen()
AVIStreamInfo()
AVIStreamLength()
AVIStreamOpenFromFile()
AVIStreamRead()
AVIStreamReadData()
AVIStreamReadFormat()
AVIStreamRelease()
AVIStreamSampleToTime()
AVIStreamSetFormat()
AVIStreamStart()
AVIStreamTimeToSample()
AVIStreamWrite()
AVIStreamWriteData()
CreateEditableStream()