О возможности обработки HTML5 видео в реальном времени

Динозавры медленно вымирают

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

Для получения видеофреймов достаточно воспользоваться функцией drawImage, позволяющей отрисовать кадр в canvas:

function draw() {
  if (window.requestAnimationFrame) 
    window.requestAnimationFrame(draw)
  var object = document.getElementById('video')
  var w = object.width
  var h = object.height
  context.drawImage(object, 0, 0, w, h)
  var d = context.getImageData(0, 0, w, h)
  for (y = 0; y < h; y++) {
    for (x = 0; x < w; x++) {
      for (j = 0; j < 3; j++) {
        var v = d.data[(y*w + x)*4 + j]
        /* place processing code here */
        d.data[(y*w + x)*4 + j] = v
      }
      d.data[(y*w + x)*4 + 3] = 255
    }
  }    
  context.putImageData(d, 0, 0)
}

Маленькое психоделическое демо. У меня обработка одного кадра занимает ~ 10 мс.

См. также широко известное в узких кругах демо на MDN с фильтром Chroma Key. У меня оно, кстати, не работает.

Мы можем производить цветокоррекцию, статистический анализ, пространственные и временные преобразования, совмещение нескольких видео в одно и многое другое, на что хватит скромных возможностей javascript (пока у нас нет повсеместной поддержки WebGL).

Вот так вот. Всем плавного риалтайма.


P.S. Интересующимся современным вебом рекомендую книжку по хакингу HTML5: Web Sockets, Local Storage, CORS и многое другое в практической форме.

 

shitpoet@gmail.com

 



 

free hit counters