hacks.mozilla.org

add some ambiance to your videos

Note: this post was originally posted to the silverorange labs blog and was written by Mike Gauthier. Mike and other people at silverorange put this demo together for the 35 days project and we thank them.

Also note that the demo below is extremely CPU-intensive. If you’re interested in the effect and you don’t have a really fast CPU you can just watch a screencast of the effect.

Last note: This demo requires Firefox 3.5 Beta99 or later.. If you have Beta 4 installed you should be able to use Help -> Check for updates… to get to the latest beta. Beta 4 included a bug where video data couldn’t be copied to the canvas.

Our work with Mozilla led us to do some experiments on what can be done with the new HTML5 functionality in Firefox 3.5. With <canvas> and the new HTML5 <video> element, we created a demo that pulls color information out of a live playing video and uses it to style a border around the video. The result is not unlike the tackiest of back-lit LCD tvs.

How It Works

The color calculation is done by drawing video frames to a HTML5 canvas element and then computing the average color of the canvas. To make computing the average color faster, the video frame is resampled onto a smaller canvas (this demo uses 50×50). Color accuracy can be improved at the cost of speed by using a larger canvas. Pushing video frames to the canvas is done as follows:

var canvas = document.getElementById('canvas');
var video = document.getElementById('video');
var context = canvas.getContext('2d');
 
// push frame to canvas
context.drawImage(video, 0, 0, canvas.width, canvas.height);
 
// get image data for color calculation
var data = context.getImageData(0, 0, canvas.width, canvas.height);

The computed color is then changed over time using a YUI animation.

The edges of the video are feathered using an SVG mask. Firefox 3.5 allows SVG masks to be applied to elements using a special CSS+SVG property. First, an SVG mask is defined inline in the document (note: this could also be defined externally). The mask is then applied to the video element using the following CSS rule:

#video {
    mask: url(index.html#m1);
}

There are two of other CSS+SVG properties available in FF3.5: clip-path and filter. To reference SVG styles in CSS use url(filename#element-id) or just url(#element-id) if the SVG is defined in the same file as the CSS.

Finally, the demo uses some new HTML CSS 3.0 features from Firefox 3.5. The box-shadow property, text-shadow property and rgba color model are used:

#main-feature {
    -moz-box-shadow: #000 0px 5px 50px;
}
#description {
    text-shadow: rgba(255, 255, 255, 0.4) 1px 1px 2px;
}

10 Responses to “add some ambiance to your videos”


  1. 1 Anita

    Thank you so much for adding the screencast so that those of us who have not yet made the change to 3.5 can share in the adventure.

  2. 2 Auren

    Works too slow for me. Maybe because it’s beta.

  3. 3 Mike

    Wow. The nightly version i’m using is great! The video seems a little choppy, but i think its the video honostly, its hardly noticable but that might be the affect the JS has on the page or soemthing. None the less, the ambient change i think is only after a substantial change and it works wonderfully. This is a GENIUS idea.

  4. 4 J. McNair

    Those with older computers:

    I’m running an older Athlon box on a nice monitor and the demo was choppy at 1920 x 1080.

    BUT I used Ctrl – to shrink the page and video frame a little and it was smooth as butter. Lowering desktop resolution helps too.

    Thus I was very impressed.

  1. 1 nitot's status on Tuesday, 09-Jun-09 13:38:06 UTC - Identi.ca
  2. 2 颠覆网络35天 ─ 给视频添加有趣的边框 < MJiA
  3. 3 柏強的城市探險記: 顛覆網路 35 天 (2b): 為影片添點情調
  4. 4 Ajaxian » Animating SVG with Canvas and Burst
  5. 5 Monthly Interesting Links Roundup (June 2009)
  6. 6 谋智社区 » Blog Archives » 颠覆网络35天 ─ 给视频添加有趣的边框

Leave a Reply