Войти
ПрограммированиеСтатьиОбщее

Theora — воспроизведение видео в играх.

Автор:

Введение – что такое ogg, theora, vorbis
Декодирование файла ogg/theora
Оптимизации
Несколько слов о синхронизации

Введение – что такое ogg, theora, vorbis

Во Имя и Ради Геймдева Всея Руси.

В данной статье я хотел бы описать, как можно выводить качественное видео в компьютерных играх. Зачастую, игроделы используют библиотеки типа BinkVideo или лицензируют различные кодеки. Но есть альтернативный, open-source, вариант – это использовать контейнер ogg с аудиодорожкой vorbis и видеодорожкой theora. Также не следует забывать, что аудио-кодек mp3 уже платный и также нуждается в лицензировании. Рассматриваемая связка лишена этого недостатка, это бесплатно распространяемые библиотеки с открытым исходным кодом.

Итак, немного более подробно:

- ogg – это контейнер метаданных, обеспечивающий хранение в одном файле нескольких дорожек данных, позволяющий обнаруживать ошибки потока и искать неповрежденные места.
- vorbis – это аудио-кодек, работающий с контейнером ogg и сжимающий с потерей качества. Вы, несомненно, о нем слышали – он продвигается как не требующая лицензионных отчислений замена mp3.
- theora – это видео-кодек, работающий с контейнером ogg и сжимающий с потерей качества. Он основан на исходных кодах кодека VP3 фирмы On2. Он и является главным героем данной статьи.

Важно: в ogg файле может храниться несколько видеопотоков и/или несколько аудиопотоков. в данной статье не рассматривается вопрос проигрывания звука vorbis, это будет некое «домашнее задание» для энтузиастов.

Структура ogg/theora

Начнем со структуры ogg, которая далеко не тривиальна. Попробую объяснить качественно, конкретика пойдет, когда будем рассматривать код воспроизведения.

Физический поток – файл ogg, содержащий вперемешку данные логических потоков.

Логический поток – один из потоков данных, содержащихся в физическом потоке. Например, видеодорожка это отдельный поток, аудиодорожка – тоже. Каждый логический поток в физическом потоке имеет уникальный идентификатор.

Итак, все начинается с открытия ogg-файла. После чего библиотека ogg формирует буфер для чтения данных, куда мы эти данные прочитываем (читать оттуда данные можно любым образом, я, например, читаю через fread). После чего библиотека ogg формирует из этого буфера страницу данных (одну или несколько).

Страница данных ogg – блок информации, содержащий часть логического потока. Каждая страница имеет поле, где хранится идентификатор логического потока, которому эта страница принадлежит. Внутри физического потока данные лежат в виде страниц – сначала идут  заголовочные страницы всех логических потоков, потом страницы данных, после чего страницы завершения потоков.

После того, как определено, какому логическому потоку принадлежит эта страница, её добавляют в этот поток и из него читают пакет данных.

Пакет данных ogg – декодированная единица данных из логического потока. Содержит, как правило, закодированную информацию для кодека.

После чего полученный пакет отправляют в кодек, где с ним происходят другие чудеса.
После того, как ogg сформировал пакет, его передают на обработку библиотеке theora. Обработка его кодеком theora представляет собой

1) Передачу пакета в декодер
2) Получение из декодера картинки в формате YUV12

После чего осуществляется декодирование yuv->rgb и вывод изображения. Здесь все описано очень поверхностно, чтобы в голове сложилось впечатление обо всей иерархии передачи данных. Углубляться в архитектуру без конкретного кода не имеет смысла.

Формирование видеофайла ogg/theora.

Итак, прежде чем мы воспроизведем видео, его надо сначала получить. Если у вас уже есть видеофайл в формате ogg/theora, тогда эту главу можно пропустить. Ежели этого видеофайла нет, тогда его надо создать! Начнем.

Для начала скачайте и установите кодеки ogg/vorbis/theora вот отсюда:
http://www.illiminable.com/ogg/

Кодеки необходимы, чтобы вы могли просматривать ogg/theora через обычные проигрыватели, например, через Windows Media Player.
После того, как кодеки установлены, наступает волнительный этап создания файла. Это можно осуществить двумя путями:

1) Через утилиту GraphEdit, входящую в DirectX SDK
2) Через свою программу
3) Через сочетание программ ffdshow и vurtualdub

Остановимся на достоинствах и недостатках этих вариантов более подробно:
Достоинством первого варианта является то, что можно осуществлять перекодировку практически любого видеофайла в формат ogg/vorbis/theora, что очень удобно! Но, к сожалению, этот способ иногда приводит к сбоям. Я сталкивался с двумя видами сбоев:

- падение при начале перекодировки – GraphEdit просто падает и всё :)
- ошибка частоты кадров в видеопотоке – файл успешно перекодируется, и вроде все нормально, но при попытке просмотреть его в Windows Media Player все падает :)

Есть мнение, что несжатое видео (например, полученное из 3ds Max) перекодируется нормально. Во всяком случае, я не встречался со сбоями и падениями при перекодировании несжатых видеофайлов.

Второй пункт комментировать, наверное, не стоит, все его плюсы и минусы видны невооруженным взглядом.

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

Рассмотрим первый вариант:

Запустите программу GraphEdit, откройте в ней файл, который желаете перекодировать. Вы увидите нечто вроде:

Изображение

Здесь показан исходный файл, сплиттер контейнера, два декодера (звуковой mp3 и видео DivX), и средства воспроизведения потоков.

Далее удалите Video Renderer и Default DirectSound Device. После чего добавьте на схему Ogg Mux Filter (выберите имя записываемого файла), Vorbis Encoder Filter, Theora Encoder Filter. Все эти компоненты есть в списке DirectShow Filters. Соедините блоки, как показано на схеме:

Изображение

Обратите внимание, чтобы на первом пине Ogg Mux Filter был Vorbis Encode Filter.

Вы можете также нажать правую кнопку мыши на Theora Encode Filter и поиграться с бегунками качества, однако, это ни на что не повлияет, размер файла останется точно таким же – видимо, «энкодер» сам выбирает качество сжатия, исходя из параметров кодируемого ролика.

Теперь нажимайте на «Play» и, если ничего не упало, идите пить чай, так как процедура эта довольно длительная. После того, как закончено кодирование, Вы можете попробовать просмотреть этот файл через Windows Media Player, будем надеяться, ничего не упадет. :)

Итак, если GraphEdit смог создать ogg/theora файл (пусть даже WMP его не воспроизводит), то принимайте поздравления! Теперь приступим к написанию плейера.

Страницы: 1 2 3 4 Следующая »

#OGG, #видео

11 августа 2005

Комментарии [60]