Дополнительное сжатие может быть достигнуто при помощи использования того факта, что следующие друг за другом кадры часто почти одинаковые. Этот эффект не так полезен, как может показаться на первый взгляд, так как многие режиссеры делают переходы от одной сцены к другой каждые 3-4 с (подсчитайте сцены, сменяющиеся за пару минут в любом фильме). Тем не менее массив из 75 или более похожих кадров предполагает, что видео может быть сжато гораздо сильнее, чем при кодировании каждого JPEG отдельно.
Для сцен, в которых камера и задний план статичны, а один-два актера медленно передвигаются, почти все пиксели соседних кадров будут совпадать. В таком случае просто извлечение каждого кадра из предыдущего и запуск JPEG с различиями сильно упростят ситуацию. Однако для сцен, где камера идет за актером или приближается, эта техника мало чем нам поможет. Необходим способ компенсировать это движение. Именно это и делает MPEG, и в этом заключается главное отличие MPEEG от JPEG. На выходе MPEG получается 3 вида кадров:
1. I- (Intracoded — закодированные в себе) кадры: содержащие сами себя сжатые неподвижные картинки.
2. P- (Predictive — предсказательные) кадры: поблочная разница с предыдущим кадром.
3. B- (Bidirectional — двунаправленные) кадры: поблочная разница с предыдущим и последующим кадрами.
Кадры первого типа, I-кадры, являются неподвижными картинками. Они могут кодироваться при помощи JPEG или чего-то похожего. Периодически такие кадры должны встречаться (например, пару раз в секунду) по трем причинам. Во-первых, MPEG может использоваться для многоадресной передачи, когда количество пользователей может увеличиться или уменьшиться. Если все кадры, начиная со второго, зависят от предшествующих, тот, кто пропустил первый кадр, не сможет декодировать ни один из следующих. Во-вторых, если какой-то кадр был получен с ошибкой, последующие будут нечитаемыми. В третьих, без кадров первого типа декодеру придется рассчитывать каждый кадр, чтобы картинка не сбивалась.
P-кадры, напротив, кодируют различия между кадрами. Они основаны на идее макроблоков (macroblocks), которые покрывают, например, 16 х 16 пикселей для яркости и 8 х 8 для цветности. Макроблок кодируется при помощи поиска на предыдущем кадре такого же или немного отличающегося. Пример того, где могут быть полезны P-кадры, приведен на рис. 7.25. На нем мы видим три последовательных кадра с одинаковым задним планом, но разной позицией героя. Макроблоки, содержащие человека, будут смещены на какое-то расстояние и их придется отыскать.
Рис. 7.25. Три последовательных кадра
Стандарты MPEG не определяют то, на каком расстоянии должен вестись поиск или насколько должны быть похожи области, чтобы считать их условно совпадающими. Все зависит от каждого отдельного случая его применения. Например, в некоторой реализации поиск макроблока может вестись на той же позиции и на позициях, отстоящих от нее на ±Дх по оси x и ±Ду в направлении у. Для каждой позиции может вычисляться количество совпадений в матрице яркости. Позиция с наибольшим числом совпадений (при условии, что это число перекроет минимально необходимое) будет объявлена победителем. В ином случае будет считаться, что макроблок отсутствует. Конечно, возможно внедрение и гораздо более сложных алгоритмов.
Если макроблок найден, он кодируется при помощи его разницы с тем же макроблоком в предыдущем кадре (по яркости и хроматическим характеристикам). Обычно эти матрицы различий затем подвергаются дискретному косинусному преобразованию, квантованию, кодированию длины серий и кодированию по методу Хаффмана.
Значение макроблока в выходном потоке сопровождается вектором перемещения (на сколько макроблок переместился в каждом направлении), а затем идет кодирование этой разницы. Если макроблок не найден в предыдущем кадре, его текущее значение кодируется как в I-кадре. Конечно, этот алгоритм крайне ассиметричен. На практике он может проверять каждую спорную позицию в предыдущем кадре в отчаянной попытке локализовать каждый макроблок, вне зависимости от того, как далеко он переместился. Этот подход минимизирует закодированный поток MPEG за счет очень медленного кодирования. Он подходит для однократного кодирования библиотеки фильмов, но ни в коем случае не для кодирования видеоконференций.
В каждом отдельном случае по-своему определяется, что такое «найденный» макроблок. Благодаря этому качество и скорость алгоритмов кодирования варьируются, но подходящий выходной MPEG получается всегда.
Пока декодирование MPEG прямое. Декодирование I-кадров похоже на декодирование изображений JPEG. Декодирование P-кадров требует от декодера буфе-ризовывать предыдущие кадры, чтобы построить следующие в отдельном буфере из полностью декодированных макроблоков и макроблоков, содержащих различия с предыдущим кадром. Новый кадр собирается макроблок за макроблоком.
B-кадры похожи на P-кадры, но в случае их применения эталонный макроблок может находиться как в предыдущем, так и в последующем кадре. Эта дополнительная свобода позволяет лучше компенсировать движение. Это полезно, например, когда объекты на некоторое время перекрываются. Чтобы закодировать B-кадр, кодировщик должен держать в памяти последовательность кадров: прошедшие, текущий (кодируемый) и следующий. Декодирование также несколько усложняется и занимает больше времени. Это происходит из-за того, что отдельный B-кадр не может быть декодирован, пока не декодированы последующие кадры, от которых он зависит. Таким образом, хотя B-кадры позволяют максимально сжать видео, они не всегда используются из-за сложности и необходимости специфической буферизации.
Стандарты MPEG содержат много улучшений этих техник, что позволяет достичь очень хорошего сжатия. AVC может использоваться, чтобы сжать видео в соотношении 50 : 1, что сокращает требования по пропускной способности канала в те же 50 раз. Чтобы узнать о AVC больше, почитайте книгу Салливана и Виганда (Sullivan and Wiegand, 2005).
7.4.3. Потоковая передача сохраненных медиафайлов
Теперь давайте перейдем к сетевым приложениям. В первую очередь мы поговорим о потоковой передаче медиаинформации, которая уже хранится в файлах. Наиболее известным примером можно считать просмотр видео через Интернет. Это одна из форм VoD (Video on Demand — видео по запросу). Другие формы видео по запросу используют для передачи фильмов провайдерскую сеть, которая не является частью Интернета (например, кабельная сеть).
В следующем разделе мы рассмотрим передачу медиа в реальном времени, например передача телесигнала через IP (IPTV) и интернет-радио. Затем мы рассмотрим третий случай — конференции в реальном времени. Примером являются звонки с передачей голоса через IP или видеоконференции через Skype.
В этих случаях требования к тому, как мы можем передавать аудио и видео по сети, крайне высоки, так как мы должны уделять особое внимание задержкам и ее варьированию (неустойчивости синхронизации).
В Интернете крайне много сайтов с музыкой и видео, которые транслируют сохраненные медиафайлы. На самом деле, проще всего работать с сохраненными медиафайлами не транслируя их. Представьте себе, что вы хотите создать сайт проката видео типа iTunes от Apple. Обычный веб-сайт предоставит пользователям возможность загрузить, а потом посмотреть видео (после оплаты, конечно). Эта последовательность шагов показана на рис. 7.26. Мы остановимся на них подробно, чтобы была лучше видна разница со следующим примером.
Рис. 7.26. Проигрывание медиафайлов при помощи Всемирной паутины через загрузку
Браузер начинает действовать, когда пользователь щелкает на названии фильма. На первом шаге отсылается HTTP-запрос фильма на веб-сервер, на который указывает ссылка фильма. На втором шаге сервер получает фильм (который представляет собой обычный файл в формате MP4 или каком-нибудь другом) и отсылает ее браузеру.