Я работал над этой проблемой, так как меня очень интересует xHtml+RDFa, и я нашел способ воспроизводить видео в строгом документе xHtml 1.0 в браузерах HTML5, не блокируя браузеры не HTML5.
Я опубликовал плагин jQuery здесь: https://github.com/charlycoste/xhtml-video
И демо здесь: http://demo.ccoste.fr/video
На самом деле, это гораздо менее эффективно, чем использование тега HTML5, но, по крайней мере... оно работает!
Решение основано на javascript и холсте, но может быть изящно деградировано с помощью тегов <object>
(это то, что делает мой плагин jQuery).
То, что я делаю, на самом деле просто:
Я создаю в памяти новый элемент видео (не тег), но не добавляю его в документ DOM:
var video = document.createElement('video');
Я создаю новый canvas
элемент в памяти, но не добавляю его в документ DOM:
var canvas = document.createElement('canvas');
Я создаю новый img
элемент и добавляю его в DOM.
// var parent = ... ;
// var width = ...;
// var height = ...;
var img = document.createElement('img');
img.setAttribute('width', width);
img.setAttribute('height', height);
parent.appendChild(img);
Когда воспроизводится видео (video.play()
), я заставляю его рисовать каждый кадр на холсте (который не виден, потому что не добавлен в DOM, что делает DOM действительным документом xhtml 1.0)
canvas.getContext("2d").drawImage(video, 0, 0, width, height);
Наконец, я использую метод toDataURL()
элемента canvas
, чтобы получить изображение в кодировке base64 для кадра и поместить его в атрибут src
элемента img
.
img.setAttribute('src', canvas.toDataURL());
Делая это, вы заставляете объекты javascript воспроизводить видео из DOM и помещать каждый кадр в элемент img
DOM. Таким образом, вы можете воспроизводить видео, используя возможности HTML5 браузера, но без документа HTML5.
И если в браузере нет возможностей HTML5 или если он не может обрабатывать используемый кодек, он вернется к собственному поведению <object>
(в общем... браузер будет искать плагин, такой как VLC, или что-то подобное... )
И если нет возможности воспроизвести видео (нет плагина для него), будет использоваться альтернативный контент, указанный внутри тега <object>
.
Аспект производительности: поскольку это приводит к очень интенсивному процессу, воспроизведение может мерцать... Чтобы избежать этого, вы можете уменьшить качество рендеринга, используя сжатие jpeg следующим образом: canvas.toDataURL('image/jpeg', quality)
, где quality
— значение от 0 до 1.
person
Charles-Édouard Coste
schedule
08.11.2014