Simon Pieters
Opera Software
2010-02-16
Om Opera, Om mig, Demos, Historia, Hur video fungerar, Codec-krig, Konvertera format, .htaccess, Video-elementet, Audio-elementet, Source-elementet, DOM API, Events, Canvas, Sökning, CSS, Fallback
2005: WHATWG
2007: Sommarjobb Opera
2007: Anställning Opera
opera, YouTube, vimeo, Wikipedia, metavid, Dailymotion, mozilla, 9elements, simon
Container
Video-codec
Audio-codec
Ogg
MPEG-4
Theora
H.264
Baseline profile
Main profile
High profile
Vorbis
AAC
Low complexity profile
Main profile
Scalable sampling rate profile
Ogg | ✘ | ✔ | ✔ | ✔ | ✘ | ✘ |
MP4 | ✔ | ✘ | ✔ | ✘ | ✔ | ✔ |
Ogg | ✘ | ✘ | ✔ | ✔ |
MP4 | ✔ | ✔ | ✘ | ✘ |
Firefogg
Handbrake
AddType video/ogg .ogv AddType audio/ogg .oga .ogg AddType video/mp4 .mp4
<video src="test.ogv"> </video>
<video src="test.ogv" poster="test.jpg" autobuffer autoplay loop controls width="320" height="240"> </video>
<video loop> <video loop=""> <video loop="loop">
<audio src="test.oga" autobuffer autoplay loop controls> </audio>
<video> <source src="test.ogv" type="video/ogg"> <source src="test.mp4" type="video/mp4"> </video>
<source src="test.ogv" type="video/ogg" media="all and (device-min-height:720px)">
width height videoWidth videoHeight poster error src currentSrc networkState autobuffer buffered load() canPlayType() readyState seeking currentTime duration paused defaultPlaybackRate playbackRate played seekable ended autoplay loop play() pause() controls volume muted
var video = document.createElement('video'); video.src = 'test.ogv'; var audio = new Audio('test.oga');
document.body.appendChild(video);
video.onloadedmetadata = function(e) { video.width = 3 * video.videoWidth; }
if (video.error) alert(video.error.code);
video.error.MEDIA_ERR_ABORTED video.error.MEDIA_ERR_NETWORK video.error.MEDIA_ERR_DECODE video.error.MEDIA_ERR_SRC_NOT_SUPPORTED
<video onloadedmetadata="alert(currentSrc)"> <source src="test.ogv" type="video/ogg"> <source src="test.mp4" type="video/mp4"> </video>
video.NETWORK_EMPTY video.NETWORK_IDLE video.NETWORK_LOADING video.NETWORK_NO_SOURCE
alert(video.buffered.length); alert(video.buffered.start(0)); alert(video.buffered.end(0));
video.src = 'video2.ogv'; // inget load() behövs
source1.src = 'video2.ogv'; source2.src = 'video2.mp4'; video.load();
"", "maybe" eller "probably"
alert(video.canPlayType('video/ogg')); alert(video.canPlayType('video/ogg; codecs="theora, vorbis"'));
video.HAVE_NOTHING video.HAVE_METADATA video.HAVE_CURRENT_DATA video.HAVE_FUTURE_DATA video.HAVE_ENOUGH_DATA
alert(video.seeking); video.currentTime = 5; alert(video.seeking);
alert(video.currentTime); video.currentTime = 5; alert(video.currentTime);
Är 0 i vanliga fall
Streaming kan vara > 0
NaN: okänd
Infinity: streaming (eller okänd)
Videons längd i sekunder
true om videon är pausad
1.0: normal hastighet
0.5: slow motion
2.0: snabbspola
-1.0: spela baklänges
true om videon har spelat klart
video.loop = true;
⇔
video.setAttribute('loop', 'loop');
⇔
<video loop="loop">
video.loop = false;
⇔
video.removeAttribute('loop');
⇔
<video>
volume: 0.0 .. 1.0
muted: true/false
loadstart progress suspend abort error emptied stalled play pause loadedmetadata loadeddata waiting playing canplay canplaythrough seeking seeked timeupdate ended ratechange durationchange volumechange
video.onloadstart = function(e) {}
video.addEventListener('loadstart', function(e) {}, false);
<video onloadstart=""></video>
Första steget i processen att hitta src/source
Några bytes har hämtats.
Webbläsaren väntar med att hämta mer data.
Webbläsaren avbryter hämtning av data.
Ett fel har inträffat.
video.onerror = function(e) { alert(video.error.code) }
Ett fatalt fel har inträffat eller load() har körts.
video.networkState == video.NETWORK_EMPTY
Servern slutar temporärt att ge data.
video.networkState == video.NETWORK_LOADING
Användaren klickar på play eller play() har körts.
video.paused == false
Användaren klickar på pause eller pause() har körts.
video.paused == true
Webbläsaren vet dimensioner och längd på videon.
video.readyState == video.HAVE_METADATA
Webbläsaren kan rita nuvarande frame för första gången.
video.readyState == video.HAVE_CURRENT_DATA
Webbläsaren stannar för nästa frame är inte tillgänglig ännu.
video.readyState <= video.HAVE_CURRENT_DATA
Webbläsaren börjar spela.
Webbläsaren kan spela en bit.
video.readyState == video.HAVE_FUTURE_DATA
Webbläsaren kan spela hela vägen utan att stoppa.
video.readyState == video.HAVE_ENOUGH_DATA
Sökning i videon pågår.
video.seeking == true
Sökning är färdig.
video.seeking == false
Skickas hela tiden medan videon spelar.
Videon har spelat klart.
video.ended == true
Videons längd har ändrats (från okänd till känd eller från gissning till mer precis).
Användaren ändrar volym eller volume eller muted har ändrats med skript.
drawImage, createPattern
HTTP/1.1 206 Partial Content Accept-ranges: bytes Content-range: bytes 123000-3456000/4567000
MPEG-4: metadata i början
Ogg: metadata i slutet
HTTP Content-Duration header
video { box-shadow:0 5px 10px black; -o-transition:1s width; -o-image-fit:fill; width:400px; height:300px; } video:hover { width:800px; }
<video controls src="video.ogv"> <a href="video.ogv">video</a> </video>
<video controls src="video.mp4"> <object data="video.swf"> <a href="video.mp4">video</a> </object> </video>
<video controls src="video.ogv"> <object type="application/x-java-applet" width="480" height="288"> <param name="archive" value="cortado-ovt-stripped-wm_r51500.jar"> <param name="code" value="com.fluendo.player.Cortado.class"> <param name="url" value="video.ogv"> <a href="video.ogv">video</a> </object> </video>
function fallback(v) { while (v.firstChild) { if (v.firstChild.nodeName == 'SOURCE') v.removeChild(v.firstChild); else v.parentNode.insertBefore (v.firstChild, v); } v.parentNode.removeChild(v); }
<video controls src="video.ogv" onerror="fallback(this)"> ... </video>
<video controls> <source src="video.ogv" type="video/ogg"> <source src="video.mp4" type="video/mp4" onerror="fallback(parentNode)"> ... </video>
Frågor?