04.04.2011

Видео в HTML5 с субтитрами на JavaScript

Проблема любого видео — используется ли оно в HTML5 или в другой версии HTML — это доступность. Что необходимо сделать сознательным разработчикам, чтобы обеспечить текстовую замену видео для тех, кто не может его просмотреть?

Это замечательно, что HTML5 позволяет нам вставлять видео на веб-страницах таким образом, что оно может быть проиграно непосредственно браузерами, без необходимости установки плагинов. Эта функциональность добавлена в Opera 10.5 pre-alpha (на Windows и Linux; версия для Mac находится в разработке), а также в Firefox 3.6 и Google Chrome 3.

В HTML5 не существует атрибута alt для элемента video в отличие от элемента img, однако вы можете заключить "дополнительное содержимое" внутри тегов, например:

<video>
Ваш браузер не поддерживает кодек Ogg Theora.
Вы можете <a href="video.ogg">загрузить видео</a> и просмотреть его в оффлайн.
</video>

Однако, в спецификации сказано:

…это содержимое не предназначено для решения проблем доступности. Чтобы сделать видео доступным для людей с расстройствами слуха, зрения и т.п., авторам следует предоставлять альтернативные потоки медиа-данных и/или вставлять дополнительное содержимое (например, субтитры) в свои медиа-потоки.

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

Однако, на практике, никто не знает, как это реализовать, и нет браузеров, способных обнаружить и обработать эти данные или передать их пользователю. Поэтому нам нужна какая-то "уловка", чтобы решить эту проблему. Идея, к которой я пришёл, заключается в том, что субтитры хранятся в виде простого текста на странице, обернутого в элемент <div id="transcript">. Если пользователь заходит на страницу с выключенным JavaScript, он просто видит видео и субтитры после него.

Для тех пользователей, у которых включен JavaScript, мы покажем отдельные строки субтитров поверх видео в виде текста. Так как это обычный текст, то он будет доступен и для программ чтения с экрана, кроме того, он будет синхронизирован с видео.

Вот простой пример видео, который демонстрирует эту технику: Пример видео с субтитрами — How to Leverage a Synergy. (Для просмотра необходим браузер с поддержкой видео в формате Ogg.)

Если вы загляните в исходный код, то увидите, что субтитры выполнены в виде параграфов, но каждая часть текста субтитров, появляющаяся поверх видео, заключена в тег span для того чтобы определить время появления каждой из частей на экране.

Для того чтобы скрипт знал, когда какую часть показывать, я пометил каждую часть временем появления на экране и временем исчезновения. Для этого я использую новые возможности HTML5, которые позволяют мне добавить мои собственные атрибуты данных к тегам и потом использовать их в скрипте. Их можно назвать как угодно, но они должны начинаться со строки "data-". Например, я назвал их data-begin и data-end, так как они совпадают с сответствующими названиями в спецификациях Timed Text (TT) Authoring Format 1.0 и SVG 1.1 (SVG/SMIL animation).

Я присваиваю атрибуту data-begin сдвиг по времени (от начала видео), через который текущий тег span появиться на экране. Атрибут data-end содержит время исчезновения тега с экрана:

<span data-begin=1 data-end=6>Hi, my name's Dr Archimedes Einstein…</span>

В примере выше надпись появится через 1 секунду после начала видео и исчезнет через пять секунд (через 6 секунд после начала видео).

Теперь рассмотрим скрипт, который скрывает тег div, содержащий субтитры (Я использую JavaScript для написания правила CSS, чтобы назначить ему свойство display:none). Скрипт берет каждый тег span из скрытого блока div следующим образом:

var nodes = document.querySelectorAll('#transcript span');

Теперь нам необходимо расположить субтитры поверх видео в нужное время. Наложение текста выполняется легко; я просто абсолютно позиционирую другой тег div (с идентификатором captions) поверх видео. Для удобочитаемости белого текста поверх светлого фона, я добавляю тень к тексту, используя CSS:

text-shadow: black 1px 1px 3px;

Для определения времени появления каждого тега span, скрипт использует событие ontimeupdate (которое возникает каждые 250 миллисекунд проигрывания видео в Опере), чтобы сделать запрос к API видео и узнать как долго оно уже длится,

var v = document.querySelector('video');
var now = v.currentTime;

а затем обойти все элементы span субтитров и найти тот, атрибуты которого попадают в текущий промежуток времени.

В этом примере я использую генерируемое содержимое CSS, чтобы вставить отметку о времени в полную версию субтитров под видео, чтобы при отключенном JavaScript это время было доступно пользователю:

#transcript [data-begin]:before {
 content: " [" attr(data-begin) "s-" attr(data-end)"s] ";
 font-size:80%;
}

Как уже было сказано выше, это уловка. Она требует много усилий от разработчика (хотя чтобы создать субтитры нужно для начала их записать вместе с временем их показа, что само по себе составляет большую работу).

Также остаётся пара проблем со скриптом. Например, когда я заключаю аббревиатуры в субтитрах в тег abbr или иностранные слова в тег span с атрибутом lang, они не попадают в субтитры (хотя вряд ли это важно).

Кроме того, в конечном варианте пользователю должна быть предоставлена возможность увидеть субтитры полностью в виде текста, даже если у него включен JavaScript — возможно, он использует мобильный телефон и не хочет загружать всё видео, просмотрев лишь содержимое видео в виде обычного текста.

Статья является переводом публикации "Accessible HTML5 Video with JavaScripted captions".

По материалам: сайт
Просмотров:
1536
Раздел:
HTML
Теги:
html5, Video, html, верстка
Комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]