<video>
<video>
lépésről lépésre<video>
<video src="video.mp4" width="320" height="200" controls muted>
Upsz...
</video>
<video preload="none|metadata|auto" poster="url">
<source src="/video.webm" type="video/webm; codecs='vp8, vorbis'"/>
<source src="/video.mp4" type="video/mp4; codecs='avc1.42C028, mp4a.40.2'"/>
...
</video>
<video >
<source src="/video.webm#t=10" type="video/webm"/>
...
</video>
<!-- Ahol #t=[start_time][,end_time] -->
Accept Ranges: bytes
Header támogatása
var video = document.querySelector('video');
video.duration // sec
video.currentTime // sec
video.buffered // TimeRange: start(idx), end(idx), length
video.play([time])
video.pause()
video.paused
video.volume // [0-1]
video.muted
video.readyState // HAVE_NOTHING | HAVE_METADATA | HAVE_CURRENT_DATA | HAVE_FUTURE_DATA | HAVE_ENOUGH_DATA
video.load()
var video = document.querySelector('video'),
w = video.videoWidth,
h = video.videoHeight;
// Teljes képernyős mód
document.body.[moz|webkit|ms]RequestFullScreen()
// Képlopás a videóból
document.querySelector('canvas')
.getContext('2d')
.drawImage(video, 0, 0, w, h);
WebM
, OGV
, MP4
audio: ACC|MP3WebM
, OGV
, MP4
részlegesenMP4
, WebM
külön codekkelMP4
audio: ACC, OGV
külön codekkel + QuickTimeended
event loopolt videónál Chrome < 35 és IE alattcanplaythrough
, adaptív video streamingpreload="none"
preload="none"
-nálpreload="metadata"
-nál vantimeupdate
event VS setTimeout
VS requestAnimationFrame
VS <track>
autoplay="false"
attribútum, volume
property értéke mindig 1
playbackRate
property-t nem támogatja az iOSz-index
beállításvisibility:hidden
vagy display:none
), transition
-okkel megoldható a logóIdőzített szöveges adatsáv
<audio>
<video>
<source ...>
<track kind="subtitle" src="sub-en.srt" srclang="en" default>
<track kind="subtitle" src="sub-hu.srt" srclang="hu">
<track kind="chapters" src="...">
<track kind="descriptions" src="...">
<track kind="metadata" src="meta.vtt" label="Location informations">
</video>
.vtt
text/vtt
WEBVTT 1 00:00:22.230 --> 00:00:24.606 Felirat
WEBVTT 2 00:00:34.159 --> 00:00:35.743 line:63% position:72% align:start Pozícionálva
WEBVTT 3 00:00:40.500 --> 00:00:41.500 <p> <c.classname>Negydik</c> formázva <i>dőlt</i> <b>félkövér</b> </p>
WEBVTT 4 00:00:60.500 --> 00:00:71.500 { "name": "Budapest" "latitude": 47.497912 "longitude": 19.040235 }
var video = document.querySelector("video"),
textTracks = video.textTracks,
textTrack = textTracks[0],
cues = textTrack.cues,
cue = cues[0],
cueId = cue.id,
cueText = cue.text,
data = JSON.parse(cueText);
textTrack.addEventListener('load', ... );
textTrack.addEventListener('error', ... );
var track = video.addTextTrack('metadata'),
cue = new TextTrackCue(0, video.duration, "text");
cue.addEventListener('enter', ...);
cue.addEventListener('exit', ...)
track.addCue(cue)
textTrack.addEventListener('cuechange', ... );
Demo
API-k a videó (és audió) forrás manipulálásához
Kép és hang adatforrások kezelése
var codec = 'video/webm; codecs="vorbis,vp8"',
video = document.querySelector('video'),
mediaSource = new MediaSource();
video.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function callback(e){
var sourceBuffer = mediaSource.addSourceBuffer(codec);
...
sourceBuffer.appendBuffer(new Uint8Array( chunk ));
...
mediaSource.endOfStream();
}, false)
chrome://flags/#disable-media-source
media.mediasource.enabled=true
Kép és hang adatfolyamok
getUserMedia
<video>
, <audio>
, WebRTC
MediaStreamTrack.getSources(function(sourceInfo){
sourceInfo // [{id:'', kind:'audio|video|..', label:''}, ..]
});
var constraints = {
audio: { optional: [{sourceId: audioSource}] } || true,
video: { optional: [{sourceId: videoSource}] } || true
};
navigator.getUserMedia(constraints, function success(stream) {
videoElement.src = window.URL.createObjectURL(stream);
videoElement.play();
}, errorCallback);
getUserMedia()
webkit
prefixmoz
prefixneedkey
eseményre keresünk egy támogatott CDM-et MediaKeys.isTypeSupported(CDM, type)
MediaKey
-t video.setMediaKeys(new MediaKeys('keySystem'))
MediaKeySession
-t keySession = video.mediaKeys.createSession(contentType, initData)
message
event üzenetét továbbítjuk a License szervernek
keySession.update(license)
chrome://flags/#enable-encrypted-media
chrome://flags/#disable-prefixed-encrypted-media