- PVSM.RU - https://www.pvsm.ru -

Apple кодирует видео с помощью JPEG, JSON и <canvas>

Apple кодирует видео с помощью JPEG, JSON и &lt;canvas&gt;
Фрагмент файла unlock_001.jpg [1]

Компания Apple имеет огромный опыт в разработке веб-технологий, но сейчас попала в абсурдную ситуацию. Если зайти на страницу с описанием дизайнерских инноваций iPhone [2], то можно увидеть странное: видеоролик с анимацией разблокировки «айфона» закодирован с помощью нескольких JPEG-файлов необычного вида.

Возникает вопрос: как вообще это работает? И зачем прибегать к подобным ухищрениям, если можно использовать стандартный тег <video>.

Объяснение простое. Оказывается, на iPhone тег <video> работает только в полноэкранном режиме, так что Apple не может его использовать для вставки видеороликов на странице. Кроме того, Apple использует исключительно видео H.264, а его поддерживают не все браузеры, что неприемлемо для промо-странички.

Раньше Apple решала эту проблему, создавая JPEG для каждого фрейма [3] анимации, в результате чего двухсекундная анимация занимала 5 МБ. Теперь они осуществили оптимизацию: анимация iPhone 5 объёмом всего лишь один мегабайт состоит из пяти файлов:

www.apple.com/iphone/design/images/unlock/unlock_manifest.json [4]
www.apple.com/iphone/design/images/unlock/unlock_keyframe.jpg [5]
www.apple.com/iphone/design/images/unlock/unlock_001.jpg [1]
www.apple.com/iphone/design/images/unlock/unlock_002.jpg [6]
www.apple.com/iphone/design/images/unlock/unlock_endframe.jpg [7]

Алгоритм работы описан в файле ac_flow.js [8] и основан на том, что обновляется только часть картинки для экономии трафика. В файлах unlock_001.jpg и unlock_002.jpg содержатся эти обновляемые фрагменты изображения. В файле unlock_manifest.json указаны координаты, чтобы позиционировать части. Чтобы JPEG-артефакты отдельных фрагментов не испортили общую картину, Apple использует блоки размером 8х8 пикселов, как это делает кодек JPEG. Вышеупомянутые файлы unlock_001.jpg и unlock_002.jpg, фактически, используются как непрерывный поток блоков 8х8. Инструкции для обработки потока указаны отдельно в формате base64, который приходится декодировать:

Apple кодирует видео с помощью JPEG, JSON и &lt;canvas&gt;

Каждая инструкция состоит из пяти байт, первые три байта указывают координаты цели в canvas, а последние два байта — сколько блоков туда поместить. Например, инструкция AAxAC означает, что нужно взять два блока (AC) и разместить их в позицию 49 (AAx).

С таким алгоритмом сборки видео нет возможности повторного использования блоков, но зато сам манифест получается вполне лаконичным.

via dbloom [9]

Автор: alizar


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/velosiped/15259

Ссылки в тексте:

[1] unlock_001.jpg: http://www.apple.com/iphone/design/images/unlock/unlock_001.jpg

[2] дизайнерских инноваций iPhone: http://www.apple.com/iphone/design/#animation-unlock

[3] JPEG для каждого фрейма: http://www.apple.com/macbook-pro/features/#seq

[4] www.apple.com/iphone/design/images/unlock/unlock_manifest.json: http://www.apple.com/iphone/design/images/unlock/unlock_manifest.json

[5] www.apple.com/iphone/design/images/unlock/unlock_keyframe.jpg: http://www.apple.com/iphone/design/images/unlock/unlock_keyframe.jpg

[6] www.apple.com/iphone/design/images/unlock/unlock_002.jpg: http://www.apple.com/iphone/design/images/unlock/unlock_002.jpg

[7] www.apple.com/iphone/design/images/unlock/unlock_endframe.jpg: http://www.apple.com/iphone/design/images/unlock/unlock_endframe.jpg

[8] ac_flow.js: http://images.apple.com/v/iphone/c/scripts/ac_flow/ac_flow.js

[9] dbloom: https://docs.google.com/document/pub?id=1GWTMLjqQsQS45FWwqNG9ztQTdGF48hQYpjQHR_d1WsI