Кодек theora что это
В данной статье я хотел бы описать, как можно выводить качественное видео в компьютерных играх. Зачастую, игроделы используют библиотеки типа 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 сформировал пакет, его передают на обработку библиотеке theora. Обработка его кодеком theora представляет собой
1) Передачу пакета в декодер
2) Получение из декодера картинки в формате YUV12
После чего осуществляется декодирование yuv->rgb и вывод изображения. Здесь все описано очень поверхностно, чтобы в голове сложилось впечатление обо всей иерархии передачи данных. Углубляться в архитектуру без конкретного кода не имеет смысла.
Формирование видеофайла ogg/theora.
Итак, прежде чем мы воспроизведем видео, его надо сначала получить. Если у вас уже есть видеофайл в формате ogg/theora, тогда эту главу можно пропустить. Ежели этого видеофайла нет, тогда его надо создать! Начнем.
Кодеки необходимы, чтобы вы могли просматривать 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 его не воспроизводит), то принимайте поздравления! Теперь приступим к написанию плейера.
Прежде чем приступить к практике, зададимся некоторыми весьма интересными вопросами: почему консоль, зачем использовать видеокодек Ogg Theora, каким образом и с какими параметрами лучше конвертировать видео.
Начнём с матчасти:
Видеокодек — это программа/алгоритм сжатия (то есть уменьшения размера) видеоданных (видеофайла, видеопотока). Кодек — файл-формула, которая определяет, каким образом можно «упаковать» видеоконтент и, соответственно, проиграть видео. Также возможно кодирование кроме видео и аудиоинформации, добавления субтитров, векторных эффектов и т. п.
На сегодняшний день, самые популярные видеокодеки — это знакомые всем DivX, XviD, H.264, WMV, Apple QuickTime и множество других. Ogg Theora всегда была в тени своих коллег и на то, видимо, были какие-то свои причины. Может быть потому, что это относительно новый кодек (он появился только в 2004-м году), может потому-что он изначально ориентировался на применение в интернете, а не для кодирования видеофильмов… Это уже не важно.
- Theora — это открытый и бесплатный видеокодек для коммерческого и некоммерческого использования.
- Theora использует высококачественные алгоритмы сжатия, что делает этот кодек хорошим выбором для кодирования любого типа видео.
- Theora идеально подходит для потокового видео в интернете, итоговые размер/качество оставляют далеко позади всех конкурентов.
- Theora кроссплатформенна. Это означает, что вы можете использовать формат в любой современной операционной системе, как в Linux, так и в Windows.
- Каждый современный Linux-дистрибутив поддерживает Theora по-умолчанию. Вам не придётся использовать сторонние проприетарные кодеки для просмотра видео в этом формате.
Вот основные причины для использования Ogg Theora. Но привычка — великая сила и стандартными кодеками, на сегодняшний день, являются DivX и XviD. Для высококачественного кодирования используют обычно H.264. Когда вы скачиваете из интернета фильм, будьте уверены — скорее всего он сжат одним из этих трёх кодеков.
Кто виноват и что делать? Все эти кодеки закрытые, запатентованые и платные. Что-то мне подсказывает, что их владельцы получают неплохие отчисления от каждого проданного бытового плеера. Есть уйма причин, по которым Theora является более предпочтительным выбором. И начать улучшать мир можно с малого — перевести свою видеотеку в свободный формат OGV — Ogg Vorbis Video.
Используя Линукс, нам доступно очень мощное средство — консоль bash. С её помощью можно творить чудеса и сложнейшие операции делать за считанные минуты. Это же касается и конвертирования видео. Чтобы начать, нам понадобится только одна консольная утилитка — ffmpeg2theora. Не буду описывать как её установить. Если вы используете Линукс, то уже умеете устанавливать любые программы штатным менеджером пакетов. Поэтому сразу перейдём к сути.
Пример 1. Конвертирование «авишки».
Для примера давайте переконвертируем одну серию моего любимого сериала «Теория Большого Взрыва». Так что открываем консоль.
Переходим в папку с файлом:
$ cd ~/Downloads/
--optimize, как нетрудно догадаться, оптимизирует качество картинки, правда в ущерб скорости конвертирования. Но спешить нам особо некуда, качество важнее.
-a указывает на желаемое качество звука, также по десятибальной шкале. Цифра 4 означает на деле 128 кбит, чего вполне достаточно для сериала. Можно также указать ключ -A с параметром 128. Одно и то же получается.
После -o мы указываем имя файла на выходе, к примеру test.ogv (ogv — это стандартное расширение для видео в формате ogg).
А в самом конце указываем файл, который, собственно хотим переконвертировать. Жмём Enter и следим за результатом. Или не следим, так как процесс длится довольно долго, это зависит от мощности компьютера.
Пример 2. Конвертирование DVD.
Здесь всё несколько сложнее, но ненамного. Сжимать уже сжатое видео иногда всё-таки чревато ощутимыми потерями качества картинки. А вот DVDRip в формате Theora по качеству лучше привычного всем DivX. Для примера давайте «рипнем» фильм «Матрица».
Переходим в папку с файлом:
$ cd ~/Downloads/Matrix/VIDEO_TS/
Выбираем оптимальные опции в расчёте на исходный файл размером 1,4 гигабайта:
$ cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB | ffmpeg2theora --videobitrate 1434 --optimize --first-pass tech.ogv --audiobitrate 256 - && cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB | ffmpeg2theora --videobitrate 1434 --optimize --second-pass tech.ogv --audiobitrate 256 -o matrix.ogv -
Давайте разоблачим магию этого заклинания. Здесь мы сталкиваемся с мощнейшей штукой консоли под названием «перенаправление потоков». Это выходит за рамки данной статьи, но можно увидеть, что до команды ffmpeg2theora мы выстраиваем список файлов на конвертирование. DVD всегда разбито на части вида VTS_порядковый-номер_порядковый-номер, поэтому нам нужно собрать их воедино.
cat занимается сложением файлов.
| — это символ перенаправления, в нашем случае даёт очередь файлов на обработку программе ffmpeg2theora.
--videobitrate указывает на желаемое качество видео, как и ключ -v, но не по шкале от одного до десяти, а точно в килобитах. Синоним ключа -V.
--first-pass-pass означает первый, технический прогон видео и сохранение аналитической информации в файл tech.ogv для будущей основы второго, финального прогона видео.
--audiobitrate указывает на качество звука в килобитах. Синоним ключа -A.
&& — это как команда сложения. Сразу после первой программы выполнить вторую. Просто для автоматизации производства :)
--second-pass — второй прогон. В это время применяются алгоритмы и происходит непосредственное кодирование видеоряда. Для этого используется подготовленный во время первого, «аналитического» прохода, технический файл tech.ogv.
В конце команды ставится -, это указывает конвертору на входящий поток файлов для обработки.
Жмём Enter и ждём-ждём-ждём. Ждать придётся долго. Пока ждём, давайте узнаем откуда взялись цифры 1434 и 256.
С 256 всё просто. Это 256 кбит на звук, что порядочно даже для мюзикла :) Видеобитрейт вычисляется по формуле:
BV=(Sx8x1024)/L-BA, где
BV — видеобитрейт;
S — желаемый размер файла в мегабайтах;
L — длительность фильма в секундах;
BA — аудиобитрейт.
Важно уточнить, что это чистый битрейт, без так называемой избыточной технической информации, которая составляет около одного процента от битрейта видео. То есть реальный битрейт, который необходимо указать кодировщику — это 99% от BV. Вот и получаются те самые 1434 килобита.
Я захотел, чтобы исходный файл занимал именно 1,4 гигабайта. Результат несложных вычислений дал желаемый результат. Если точный размер файла не имеет значения, можно просто указать ключ -v с параметром 8, 9 или 10. Это даст высокое качество картинки без лишних заморочек. В любом случае поиграйтесь с настройками, так как для каждого видео параметры подбираются индивидуально, это зависит от динамики картинки, полутонов и т.п.
Процесс, как видите, несложный и гибкий. Конечно, перевод всей домашней видеотеки займёт много времени, но понемногу, по чуть-чуть можно начинать.
В формате Ogg Theora мной обнаружен только один недостаток, для многих он покажется существенным — отсутствие поддержки со стороны производителей бытовой техники. Да, ваш dvd-плеер, скорее всего, не сможет воспроизвести Ogg. Но ведь спрос рождает предложение, верно? Если формат станет популярным, наверняка производители обратят на него внимание. Качество картинки будет радовать глаз и настанет мир во всём мире :) Всё в наших руках.
P.S. Буду чрезвычайно признателен за любые конструктивные замечания и уточнения по данной статье.
После того, как Youtube и Vimeo представили свои тестовые страницы в HTML5, вновь пошла волна разговоров, о том, что же лучше: H.264 или Ogg Theora.
Я, конечно, за свободный веб. Но выводы о том, что Theora превосходит H.264 по качеству, сделанные многими людьми по результатам двух сомнительных сравнений (раз и два) весьма поспешны.
В первом сравнении вообще не представлено ни тестового видео, ни каких-либо настроек кодеков. Во втором сказано, что для H.264-кодека взят заведомо отстойный пресет с Youtube, а настройки Теоры умалчиваются.
Так я решил сам проверить, что есть Ogg Theora и на что этот кодек способен.
Первое, на что я обратил внимание, это список возможностей Ogg Theora. Для сравнения список возможностей H.264
- Минимальный размер блока 8x8 (в H.264 минимальный — 4x4, что позволяет лучше сохранять мелкие детали)
- Отсутствие арифметического кодирования (которое позволяет на халяву наиграть процентов 15)
- Полупиксельная точность компенсации движения (четвертьпиксельная в H.264)
- Отсутствие b-кадров
Для сравнения я решил взять кодек x264. Довольно продвинутый представитель семейства H.264-кодеков с большим количеством настроек и хорошей поддержкой сообщества. С открытыми исходниками, к тому же. По результатам последнего сравнения от MSU Videogroup он занял второе место, совсем немного проиграв лидеру. Итак, в красном углу ринга .
Для декодирования использовал плагин к AviSynth FFmpegSource2 версии 2.12.
Для сравнения взял четыре видеопоследовательности с разрешением по ширине 640 пикселей. Кодировал в два прохода (так намного проще попадать в размер) с битрейтом 500 kbps. Настройки Теоры были выставлены на максимальное качество и наиболее гибкий rate control. Для x264 я взял два пресета: первый — аналогичный возможностям Теоры (полупиксельные сдвиги, нет b-кадров, размер блоков 8x8 и т.д.), второй — обычный такой пресет x264 со всеми включёнными фичами. Качество измерял метриками PSNR и SSIM c помощью MSU Video Quality Measurement Tool.
Время кодирования я не оценивал, так как выравнивать результаты ещё и по времени — большая заморочка. И скорее всего x264 получил бы заметное преимущество в скорости за счёт ассемблерных оптимизаций, так как это более зрелый проект.
Old town cross
На этом видео визуально отличия еле заметны. Везде смыта зернистость, замылена черепица на крышах. Основные отличия в том, насколько грубо/точно переданы мелкие детали. Ну и Теора всё размыла.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Цифры и картинки — это интересно и занимательно. Но есть ещё чисто практический вопрос: соотношение размер/качество. Есть простой способ его примерно оценить: пересечь графики результатов горизонтальной линией, фиксирующей SSIM, и посмотреть битрейт в точках пересечения. Да, это только приблизительная оценка, но она достаточно информативна. Картину происходящего она отражает, а на других видео того же типа результаты всё равно будут слегка отличаться.
В качестве уровня SSIM на каждом графике я взял самый высокий результат x264 BP. За 100% на графике относительного битрейта принял результат VP8.
По графикам видно, что битрейт (и, как следствие, размер файла) у x264 BP больше, чем у VP8, на 12-39 процентов. При этом на «настоящем» видео со сменами сцен x264 BP проиграл меньше. Выигрыш x264 HP относительно VP8 составил от 16 до 33 процентов.
Замечу ещё, что здесь счёт идёт на проценты, а не на разы, как было в случае с Теорой.
Привожу время кодирования всех последовательностей, на которых проходило тестирование.
x264 High Profile: 20 минут 12 секунд
x264 Baseline Profile: 10 минут 21 секунда
VP8: 83 минуты 59 секунд
Theora: 21 минута 59 секунд
Конфигурация: Intel Core2Duo T6670 2.2 GHz, 3 GB RAM
Тут VP8 получил огромную фору. Я не стал его подгонять под остальные, так как это ещё альфа-версия. Правда, кодер уже был оптимизирован, в том числе и за счёт SIMD-инструкций.
Отрыв можно было компенсировать за счёт увеличения у x264 параметров --ref, --bframes, --me-range и --subme. Тем самым слегка улучшить качество. Но я оставил те настройки, которыми обычно пользуюсь, из практических соображений. Заодно получил на будущее примерный ориентир для VP8 по времени.
x264 работал в два потока, Theora умеет только в один, VP8 работал тоже в одном потоке, так как разработчики рекомендуют число потоков = (число ядер CPU – 1) . Но даже при идеальной многопоточности VP8 получился бы в четыре раза медленнее x264 BP. Вы готовы ждать час вместо пятнадцати минут, или четыре дня вместо одного?
Как достаточно корректно измерить скорость декодирования, я не знаю. По-хорошему, нужно тестировать несколько разных декодеров на нескольких аппаратных конфигурациях. В том числе и на мобильных устройствах. А это отдельная большая работа, для которой ещё и технические ресурсы нужны. Возможно такие замеры появятся после того, как VP8 получит более широкое распространение. А пока есть только данные разработчика x264, по которым VP8 заметно уступает. И его результатам я верю больше, чем обещаниям маркетологов On2 и Google.
Если рассматривать VP8 как кодек для веба, то он вполне удался. Качество результатов сравнимо с кодеками стандарта H.264, в плане лицензий и патентов всех устраивает, и благодаря Google он получит достаточно широкую поддержку. Youtube — отличная стартовая площадка. Chrome, Opera, Firefox — это приличная доля рынка браузеров. Плюс Adobe обещают к концу года добавить поддержку WebM в Flash, у которого инсталляционная база порядка 90%. И плюс ещё Chrome frame для пользователей IE. На мобильных устройствах поначалу тоже через Flash, потом будет и аппаратная поддержка. Непонятно, правда, чего ждать от Apple с их iPhone.
По технической части из этого сравнения видны проблемы у VP8 с rate control'ом. Испорченные сцены — следствие неправильного распределения битов по всему видео. Несмотря на то, что видео кодировалось в два прохода. И нужно заметно уменьшить время кодирования. Понятно, что это только альфа, кодек будет дорабатываться.
Насчёт патентной чистоты вопрос пока открыт. Видно будет через год-два, появятся ли претензии, и если появятся, то как они будут решены. И я не понимаю всеобщей паники вокруг royalty-free H.264 до 2016 года. Должны же MPEG-LA его продлить, зачем губить большую пользовательскую базу. Денег у компаний-разработчиков и так хватает — за счёт девайсов, которые они продают.
И хотя стандарт H.264 был принят в 2003 году, он продолжает развиваться. В 2007 и 2009 годах были приняты два расширения формата: Scalable Video Coding и Multiview Video Coding. Не уверен, что мы скоро увидим широкое использование первого, а вот второе вполне может в ближайшие годы пойти в массы, так как 3D-видео становится всё более распространённым. И здесь VP8 тоже оказывается в роли догоняющего.
Формат VP8 вполне подходит для веба. Он намного лучше Ogg Theora и сравним с H.264 по параметру размер/качество. Вопросы о патентной чистоте и скорости декодирования остаются пока открытыми. Получит ли формат распространение — это вопрос скорее коммерческого и политического успеха, нежели технического.
Выкладываю исходное видео и результаты кодирования.
Результат VP8 у меня без контейнера, raw stream. Если кто-то правильно смуксит это в матрёшку и поделится с людьми, будет здорово.
Результаты кодирования
Исходное видео
Battle
1280x544, 586 кадров
Фрагмент из фильма Терминатор. Очень динамичное видео, много движения, частые смены сцен.
Big buck bunny
Здесь визуально VP8 оказался ненамного лучше, чем x264 BP. У них на разных сценах по-разному замылена картинка. По SSIM VP8 оказался всё-таки выше. x264 HP заметно лучше. Теора заметно хуже.
Пример сцены, где хорошо заметен отрыв VP8 от x264 BP.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Ещё у VP8 бывают проблемы с распределением битрейта по видео (хотя и двухпроходное кодирование). Например вот, сама сцена статичная, только кролик двинулся, за что очень сильно пострадал. Тут даже Теора выглядит лучше. Такие штуки встречаются в порядке исключения, но встречаются.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Проверка отклонения битрейта
Чистая формальность, чтобы убедиться, что кодеки попадают в битрейт, указанный в настройках. Отклонение до 5% считается нормальным, здесь все уложились.
В конце статьи есть ссылки на результаты кодирования. Некоторые типы артефактов сильно заметны на картинках, но не сильно заметны на видео. А некоторые наоборот. Так что если кому интересно, можете оценить.
Всё-таки сложно оценить практическую пользу от того, что у одного видео попугаев на сколько-то больше, чем у другого. Так что ещё я решил проверить, в какой размер может уложить видео x264 при том же визуальном качестве, что и у Theora. Пресет Theora тот же, для x264 — тот, который x264 normal. Для сравнения использовал SSIM. Для всех последовательностей SSIM у x264 чуть выше, но приближен максимально, насколько мне это удалось.
Вот график битрейтов получившихся файлов:
Файлы различаются в размере в 2-4 раза.
- Увеличить число ссылочных кадров
- Увеличить число последовательных b-кадров
- Увеличить максимальный радиус оценки движения
- Использовать опции --tune ssim и --tune psnr, которые позволяют улучшить показатели по одной метрике, несколько ухудшив их по другой (в первом сравнении от разработчиков Theora был только PSNR)
- Включить и настроить психовизуальные оптимизации, если бы сравнение было субъективным
- Заняться подгонкой параметров устранения блочности
- Использовать другие более хитрые настройки, использующие особенности тестового видео
- Отключить использование нескольких ссылочных кадров
- Оставить включённые по дефолту психовизуальные оптимизации, которые просаживают и SSIM, и PSNR
- Выбрать менее качественный алгоритм оценки движения
- Оставить возможность использования блоков только размером 16x16 пикселей
- Использовать не по назначению опции адаптивного квантования для просаживания одной из метрик
- Использовать какие-нибудь неадекватные настройки
H.264 — более эффективный, чем Ogg Theora, формат по показателю качество/размер. Также он куда более гибкий, позволяет значительно варьировать параметры в зависимости от поставленной задачи.
И не стоит слепо верить сравнениям, в которых не приведены настройки кодеков. Слишком много возможностей для манёвра.
Результаты кодирования (25 МБ)
Исходное видео (365 МБ) — весит так много, потому что закодировано lossless-кодеком huffyuv.
В данной статье я хотел бы описать, как можно выводить качественное видео в компьютерных играх. Зачастую, игроделы используют библиотеки типа 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 сформировал пакет, его передают на обработку библиотеке theora. Обработка его кодеком theora представляет собой
1) Передачу пакета в декодер
2) Получение из декодера картинки в формате YUV12
После чего осуществляется декодирование yuv->rgb и вывод изображения. Здесь все описано очень поверхностно, чтобы в голове сложилось впечатление обо всей иерархии передачи данных. Углубляться в архитектуру без конкретного кода не имеет смысла.
Формирование видеофайла ogg/theora.
Итак, прежде чем мы воспроизведем видео, его надо сначала получить. Если у вас уже есть видеофайл в формате ogg/theora, тогда эту главу можно пропустить. Ежели этого видеофайла нет, тогда его надо создать! Начнем.
Кодеки необходимы, чтобы вы могли просматривать 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 его не воспроизводит), то принимайте поздравления! Теперь приступим к написанию плейера.
Месяц назад Google открыл спецификации формата VP8, который должен стать основным форматом видео в вебе. VP8 свободен от патентов в отличие от H.264, при этом по заявлениям разработчиков должен превзойти конкурента по качеству. На сайте компании On2 уже давно висит многообещающий график. Когда кодек появился в открытом доступе, мне стало интересно, выполнили ли они обещание.
Те сравнения, которые появились в сети после релиза, были достаточно поверхностны. Jason Garrett-Glaser, разработчик x264, также готовит своё субъективное сравнение большого количества кодеков, где будет представлен и VP8, но он его ещё пока не опубликовал.
Так я взялся проделать своё небольшое объективное сравнение.
Готовить сравнение я начал ещё на той же неделе, на которой был релиз VP8, поэтому все кодеры примерно месячной давности.
Референсный кодер, версия от 18 мая 2010 года, собирал в VS2008 в конфигурации Release.
Представителем семейства H.264 будет кодек x264 версии r1602. Думаю, многие о нём уже слышали: он бесплатен, широко доступен и является одним из передовых. Поскольку VP8 заявлен как веб-оптимизированный кодек, то разумно сравнивать его с Baseline-профайлом x264. Но я также измерил данные по High-профайлу x264, чтобы составить полную картину.
Основные отличия baseline-профайла заключаются в отсутствии b-кадров и арифметического кодирования. B-кадров у VP8 тоже нет, а вот арифметическое кодирование есть. Более подробно про профайлы H.264 можно посмотреть в Википедии.
Old town cross
1280x720, 500 кадров
Видео с плавным движением. Большое количество деталей, но есть равномерная область (небо). Также есть небольшая зернистость.
Вместо замера на одном битрейте, как в прошлый раз, сейчас я решил сделать несколько замеров на разных битрейтах. И данные по всем замерам можно представить на одном графике в виде ломаной. Диапазон изменения битрейта я подбирал за несколько проб, исходя из визуального качества результатов.
Кодирование проводил в два прохода с заданным битрейтом. Битрейт, естественно, переменный. Quality-based режима у VP8 нет, если что.
Для оценки качества использовал метрику SSIM. Как показывает практика, она ближе к результатам визуального сравнения, чем PSNR. Для измерения SSIM использовал MSU Video Quality Measurement Tool.
Кстати, у x264 есть параметр --tune ssim, который позволяет слегка улучшить показатель SSIM, просаживая при этом PSNR. Не включил этот параметр, так как я изначально хотел считать обе метрики. Но не стал, потому что объём работы удваивается, а полезность малая — результаты обычно очень похожи.
Отклонение битрейта в этот раз учтено за счёт того, что точки на график наносились в соответствии с реальным показанным битрейтом. На некоторых графиках можно заметить, что точки находятся не точно на отметке.
VP8 оказался между двумя профайлами x264, а Теора сильно от них отстала. Чтобы можно было разглядеть на графиках разницу в результатах x264 и VP8, пришлось от Теоры оставить только два-три замера на самых высоких битрейтах.
Скриншоты к результатам даю отдельными ссылками, так как куча картинок только замусорит статью. Да и рассматривать их, переключаясь между табами, всё равно удобнее.
Пресеты
Theora:
--soft-target --two-pass --optimize --speedlevel 0 --keyint 250
x264 analogue:
--bframes 0 --no-cabac --partitions i8x8,p8x8 --me umh --no-mbtree --no-psy --no-fast-pskip --no-dct-decimate --subme 1
x264 normal:
--bframes 4 --b-pyramid normal --partitions all --me umh --no-psy --trellis 2 --no-fast-pskip --no-dct-decimate --subme 10 --b-adapt 2 --direct auto
В списке возможностей Теоры заявлено использование нескольких ссылочных (референсных) кадров, но эта фича в настройки никак не вынесена. И поскольку использование нескольких ссылочных кадров Теорой я никак проконтролировать не могу, я разрешил x264 ни в чём себе не отказывать и использовать дефолтное ref=3.
Последовательности
- Battle
Небольшой кусок из второго Терминатора, где постоянно что-то происходит, стреляет, взрывается. Очень динамичное видео. - Football
Небольшой кусок из футбольной трансляции. Типичный use-case, кстати. - Shuttle start
Запуск шаттла, что следует из названия. Статичное видео. - Toys and calendar
Видео с плавным движением и большим количеством мелких деталей.
Для начала графики по метрикам PSNR и SSIM. Вообще, SSIM появилась позже и считается более продвинутой. Также, насколько мне известно, результаты сравнения с использованием SSIM обычно ближе к результатам субъективного сравнения. Но PSNR на всякий случай тоже померял.
Как видим, Theora безнадёжно сливает обычному пресету x264. Относительно пресета x264 с урезанными настройками Теоре тоже можно засчитать поражение. Чуда не произошло.
Теперь немного пройдусь по последовательностям.
Toys and calendar
Вот здесь у Теоры полный провал. Урезанный пресет x264 аккуратно замыливает высокие частоты, и в целом картинка смотрибельная. У Теоры же местами жуткая блочность и местами снос деталей. А обычному пресету x264 вполне хватило битрейта, даже узоры на обоях остались.
Battle
Несмотря на более высокие показатели SSIM у всех кодеков, результаты на этом видео визуально хуже, чем на других. В основном у VP8 картинка менее замыленная, чем у x264 BP.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
И вот ещё пример, когда VP8 сильно испоганил сцену.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Shuttle start
С этим видео оба кодека справились одинаково хорошо. Но в среднем x264 чуть-чуть вытянул в деталях.
libtheora
Интересно посмотреть, сколько мы наиграли относительно другого полностью открытого кодека. Так что в сравнении участвует новый билд Ogg Theora. Сейчас идёт разработка новой версии кодера, которую назвали Ptalarbvorm, и в сети как раз появилась демо. Билд версии ptalarbvorm-svn17230. MediaInfo его распознаёт как libtheora 1.1+ 20100314 (Ptalarbvorm).
Для декодирования результатов Теоры и x264 я использовал AviSynth-плагин FFMpegSource2 версии 2-2.13. Для декодирования VP8 — референсный декодер.
Пресеты кодеков
x264 High Profile:
--keyint 250 --bframes 4 --b-adapt 2 --b-pyramid normal --ref 3 --rc-lookahead 50 --no-psy --partitions all --8x8dct --direct auto --me umh --subme 8 --trellis 2 --no-fast-pskip
x264 Baseline Profile:
--keyint 250 --bframes 0 --ref 3 --rc-lookahead 50 --no-psy --partitions all --direct auto --me umh --subme 8 --trellis 2 --no-fast-pskip --no-cabac --profile baseline
VP8:
--good --end-usage=0 --undershoot-pct=100 -p 2 --kf-max-dist=250 --drop-frame=0 --resize-allowed=0 --static-thresh=0 --profile=0 --auto-alt-ref=1 --lag-in-frames=16
libtheora:
--soft-target --two-pass -k 250 -z 0
Для сравнения я взял четыре видеопоследовательности, две из них в SD и две в HD.
Big buck bunny
704x480, 926 кадров
Фрагмент мультфильма Big buck bunny, трёхмерная анимация. Это видео я чаще всего встречал на демках разных открытых кодеков и не мог пройти мимо =) Исходник анаморфный, то есть пропроции слегка искажены.
Football
Футбольное поле у Теоры получилось какое-то неровное. На результат x264 смотреть намного приятнее.
Toys and calendar
640x352, 250 кадров
Плавное движение, много деталей и сложные текстуры. Это видео мне понравилось в предыдущем сравнении, решил использовать его и в этом.
Battle
Тут и PSNR Теоре подыграл, и вообще отставание небольшое. Отмечу, что по моему восприятию результата, битрейта не хватило даже обычному пресету x264 — слишком динамичное видео.
Скриншоты пары кадров для сравнения.
Пример, где Теора превосходит x264
Toys and calendar
Здесь результаты x264 и VP8 визуально отличаются незначительно. VP8 лучше сохранил текстуры, чем x264 Baseline Profile, а x264 High Profile это удалось ещё чуть лучше. У Теоры картинка сильно размыта.
Скриншоты: Исходник Theora VP8 x264 BP x264 HP
Читайте также: