building an html5 video player

54
Building an HTML5 Video Player Steve Heffernan, Video.js & Zencoder & Brightcove http:// videojs.com @heff @videojs

Upload: brightcove

Post on 20-Jun-2015

393 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Building an HTML5 Video Player

Building an HTML5 Video PlayerSteve Heffernan, Video.js & Zencoder & Brightcovehttp://videojs.com @heff @videojs

Page 2: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Agenda

History

User Support

Formats

Code

Bugs

Future

Resources

2 | Confidential

Page 3: Building an HTML5 Video Player

© 2013 Brightcove Inc.3 | Confidential

Page 4: Building an HTML5 Video Player

© 2013 Brightcove Inc.4 | Confidential

Page 5: Building an HTML5 Video Player

© 2013 Brightcove Inc.5 | Confidential

Page 6: Building an HTML5 Video Player

© 2013 Brightcove Inc.6 | Confidential

~2008~2000 ~2015

Page 7: Building an HTML5 Video Player

© 2013 Brightcove Inc.7 | Confidential

Page 8: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Reasons to use HTML5 Video

It’s the future!

Runs natively in the browser

Cleaner code

8 | Confidential

Page 9: Building an HTML5 Video Player

© 2013 Brightcove Inc.9 | Confidential

<video src=“video.mp4” controls></video>

Page 10: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

<object type=“application/x-shockwave-flash” data=“flash.swf”><param name=“movie” value=“flash.swf” />

<param name=“flashvars” value=“file=video.mp4” />

</object>

</video>

10 | Confidential

Page 11: Building an HTML5 Video Player

© 2013 Brightcove Inc.11 | Confidential

Page 12: Building an HTML5 Video Player

© 2013 Brightcove Inc.12 | Confidential

Page 13: Building an HTML5 Video Player

© 2013 Brightcove Inc.13 | Confidential

http://blog.mefeedia.com/html5-dec-2011

Page 14: Building an HTML5 Video Player

© 2013 Brightcove Inc.

The ‘Format War’

14 | Confidential

Page 15: Building an HTML5 Video Player

© 2013 Brightcove Inc.15 | Confidential

Page 16: Building an HTML5 Video Player

© 2013 Brightcove Inc.16 | Confidential

OPEN CLOSED

Page 17: Building an HTML5 Video Player

© 2013 Brightcove Inc.17 | Confidential

Page 18: Building an HTML5 Video Player

© 2013 Brightcove Inc.18 | Confidential

Page 19: Building an HTML5 Video Player

© 2013 Brightcove Inc.19 | Confidential

CONTAINER FORMAT

VIDEO CODEC

AUDIO CODEC

Page 20: Building an HTML5 Video Player

© 2013 Brightcove Inc.20 | Confidential

9+ 9+3+

MP4

H.264

AAC

Page 21: Building an HTML5 Video Player

© 2013 Brightcove Inc.21 | Confidential

OGV

THEORA

VORBIS

3+ 10.5+3.5+

Page 22: Building an HTML5 Video Player

© 2013 Brightcove Inc.22 | Confidential

WEBM

VP8

VORBIS

6+ 10.6+4+

Page 23: Building an HTML5 Video Player

© 2013 Brightcove Inc.23 | Confidential

Page 24: Building an HTML5 Video Player

© 2013 Brightcove Inc.24 | Confidential

6+ 10.6+4+

3+ 10.5+3.5+

9+9+ 3+ 3+

Three Formats

Page 25: Building an HTML5 Video Player

© 2013 Brightcove Inc.25 | Confidential

6+ 10.6+4+

9+9+ 3+ 3+

Two Formats

Page 26: Building an HTML5 Video Player

© 2013 Brightcove Inc.26 | Confidential

9+9+ 3+ 3+

One Format

Page 27: Building an HTML5 Video Player

© 2013 Brightcove Inc.27 | Confidential

Handbrake.fr

Page 28: Building an HTML5 Video Player

© 2013 Brightcove Inc.28 | Confidential

Firefogg.org

Page 29: Building an HTML5 Video Player

© 2013 Brightcove Inc.29 | Confidential

Zencoder.com

Page 30: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Content Protection

RTMP Streaming

DRM (Flash Access/Smooth Streaming)

30 | Confidential

Source Obscurity

Time/GEO/IP limited URLs

Native App Obscurity

HTTP Streaming

AES Encryption

Page 31: Building an HTML5 Video Player

© 2013 Brightcove Inc.31 | Confidential

Content Protection

bit.ly/wAkriF

Page 32: Building an HTML5 Video Player

© 2013 Brightcove Inc.32 | Confidential

<video src=“video.mp4” controls></video>

Page 33: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

</video>

33 | Confidential

Page 34: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

</video>

34 | Confidential

Page 35: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

<object type=“application/x-shockwave-flash” data=“flash.swf”><param name=“movie” value=“flash.swf” />

<param name=“flashvars” value=“file=video.mp4” />

</object>

</video>

35 | Confidential

Page 36: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

<object type=“application/x-shockwave-flash” data=“flash.swf”><param name=“movie” value=“flash.swf” />

<param name=“flashvars” value=“file=video.mp4” />

<img src=“image.jpg” alt=“title” title=“Can’t play video” />

</object>

</video>

<p>

<strong>Download Video:</strong>

<a href=“video.mp4”>MP4</a>

<a href=“video.ogv”>Ogg</a>

</p>

36 | Confidential

Page 37: Building an HTML5 Video Player

© 2013 Brightcove Inc.37 | Confidential

Controls

Poster

Preload

Autoplay

Loop

Width/Height

Tracks

<video controls autoplay loop width=“480” height=“270” poster=“poster.png” preload=“auto”>

<source src=“video.mp4” type=“video/mp4”>

<track kind=“captions” src=“captions.vtt” srclang=“en”>

</video>

Page 38: Building an HTML5 Video Player

© 2013 Brightcove Inc.38 | Confidential

Tag Builder

http://videojs.com/tag-builder/

Page 39: Building an HTML5 Video Player

© 2013 Brightcove Inc.

JavaScript API

Attributes

Functions• Events

39 | Confidential

Page 40: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Browser/General Issues

• Autobuffer => Preload• Cross-browser Load Progress Tracking• Missing Poster in Some Safari Devices• HTML5 Browsers Do Not Fallback on Incompatible Sources

40 | Confidential

Page 41: Building an HTML5 Video Player

© 2013 Brightcove Inc.

<video controls>

<source src=“video.mp4” type=“video/mp4”>

<source src=“video.webm” type=“video/webm”>

<source src=“video.ogv” type=“video/ogg”>

<object type=“application/x-shockwave-flash” data=“flash.swf”><param name=“movie” value=“flash.swf” />

<param name=“flashvars” value=“file=video.mp4” />

</object>

</video>

41 | Confidential

Page 42: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Determine Video Support

<script>

var vidTag = document.createElement(“video”),

flashVersion = swfobject.getFlashPlayerVersion();

if (vidTag.canPlayType && vidTag.canPlayType(“video/mp4”)) {

// Video Tag

} else if (flashVersion.major > 9){

// Flash Object

} else {

// No Video Support

</script>

42 | Confidential

SWF Object: http://code.google.com/p/swfobject/

Page 43: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Device Quirks: iOS 3

• Needs MP4 as first source. iPad Poster Attribute Bug• iPad JS in Head / iPhone JS not in Head

43 | Confidential

Page 44: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Device Quirks: Android 2.1 / 2.2

• Can’t touch to start Type attribute breaks video• canPlayType function broken• ~25% of Android Users

44 | Confidential

Page 45: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Android Touch Start Fix

45 | Confidential

<script>

if (navigator.userAgent.match(/Android/i) !== null) {

$(“video”).click(function(){

this.play();

});

}

</script>

Page 46: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Android Type Attribute Fix Options

• Don’t include type attribute Don’t use source tags<video src=“video.mp4” controls></video>

• Set source through JS APIvideo.src(“video.mp4”)

46 | Confidential

Page 47: Building an HTML5 Video Player

© 2013 Brightcove Inc.

Android canPlayType Fix

<script>

Var androidMatch = navigator.userAgent.match(/Android (\d+\./i);

if (androidMatch && androidMatch[1] < 3) {

//Overwrite canPlayType

document.createElement(“video”)

.constructor.prototype.canPlayType = function(type){

if (type && type.toLowerCase()>indexOf(“video/mp4”) !== -1) {

return “maybe”;

} else { return “”;

}

};

}

</script>

47 | Confidential

Page 48: Building an HTML5 Video Player

© 2013 Brightcove Inc.

The Future of HTML5 Video

• Content Protection - Encrypted Media Extensions• Adaptive Streaming - Media Source Extensions• Timed Text/Events - WebVTT• Video Chat - WebRTC• New Formats/Codecs - VPnext, h.265, Opus, TransOgg

48 | Confidential

Page 49: Building an HTML5 Video Player

© 2013 Brightcove Inc.49 | Confidential

VideoJS.com

Page 50: Building an HTML5 Video Player

© 2013 Brightcove Inc.50 | Confidential

Video for Everybody by Krox Camen

Page 51: Building an HTML5 Video Player

© 2013 Brightcove Inc.51 | Confidential

Dive into HTML 5 by Mark Pilgrim

Page 52: Building an HTML5 Video Player

© 2013 Brightcove Inc.

HTML5 Video and Audio in Depth

52 | Confidential

http://videojs.com/lynda

Page 53: Building an HTML5 Video Player

© 2013 Brightcove Inc.53 | Confidential

http://videojs.com

@heff @videojs

Building an HTML5 Video Player

Brightcove Webcast, March 2013

Steve Heffernan, Video.js & Zencoder & Brightcove

Page 54: Building an HTML5 Video Player

Thank you