| <!DOCTYPE html> |
| <html> |
| <!-- |
| Copyright 2015 The Chromium Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| <head> |
| <title>Video Encoder Example</title> |
| <script type="text/javascript"> |
| var plugin; |
| var track; |
| var video; |
| |
| function $(id) { |
| return document.getElementById(id); |
| } |
| |
| function success(stream) { |
| track = stream.getVideoTracks()[0]; |
| video.srcObject = stream; |
| video.play(); |
| |
| var list = $('profileList'); |
| var profile = (list.length < 1) ? 'vp8' |
| : list.options[list.selectedIndex].value; |
| |
| plugin.postMessage({ |
| command: 'start', |
| track: track, |
| profile: profile, |
| width: 640, |
| height: 480 |
| }); |
| } |
| |
| function failure(e) { |
| console.log("Error: ", e); |
| } |
| |
| function startRecord() { |
| $('length').innerHTML = ' Size: ' + dataArray.byteLength + ' bytes'; |
| navigator.webkitGetUserMedia({audio: false, video: true}, |
| success, failure); |
| } |
| |
| function stopRecord() { |
| plugin.postMessage({ |
| command: "stop" |
| }); |
| var video = $('video'); |
| video.pause(); |
| track.stop(); |
| } |
| |
| function saveBlob(blob) { |
| var blobUrl = URL.createObjectURL(blob); |
| window.location = blobUrl; |
| } |
| |
| function handleMessage(msg) { |
| if (msg.data.name == 'data') { |
| appendData(msg.data.data); |
| } else if (msg.data.name == 'supportedProfiles') { |
| console.log('profiles: ', msg.data); |
| var profileList = $('profileList'); |
| for (var i = 0; i < msg.data.profiles.length; i++) { |
| var item = document.createElement('option'); |
| item.label = item.value = msg.data.profiles[i]; |
| profileList.appendChild(item); |
| } |
| } else if (msg.data.name == 'log') { |
| console.log(msg.data.message); |
| } |
| } |
| |
| function resetData() { |
| window.dataArray = new ArrayBuffer(0); |
| } |
| |
| function appendData(data) { |
| var tmp = new Uint8Array(dataArray.byteLength + data.byteLength); |
| tmp.set(new Uint8Array(dataArray), 0 ); |
| tmp.set(new Uint8Array(data), dataArray.byteLength); |
| dataArray = tmp.buffer; |
| $('length').textContent = ' Size: ' + dataArray.byteLength + ' bytes'; |
| } |
| |
| function initialize() { |
| plugin = $('plugin'); |
| plugin.addEventListener('message', handleMessage, false); |
| |
| video = $('video'); |
| |
| $('start').addEventListener('click', function (e) { |
| resetData(); |
| startRecord(); |
| }); |
| $('stop').addEventListener('click', function (e) { |
| stopRecord(); |
| }); |
| $('download').addEventListener('click', function (e) { |
| saveBlob(new Blob([dataArray], { type: "application/octet-stream" })); |
| }); |
| } |
| |
| document.addEventListener('DOMContentLoaded', initialize, false); |
| </script> |
| </head> |
| |
| <body> |
| <h1>Video Encoder API Example</h1><br> |
| This example demonstrates receiving frames from a video MediaStreamTrack and |
| encoding them in a plugin. |
| <br> |
| <select id="profileList"></select> |
| <input type="button" id="start" value="Start Recording"/> |
| <input type="button" id="stop" value="Stop Recording"/> |
| <input type="button" id="download" value="Download Recording"/> |
| <div id="length"></div> |
| <br> |
| <div> |
| <embed id="plugin" type="application/x-ppapi-example-video-encode"/> |
| <video id="video" width="640" height="480"/> |
| </div> |
| </body> |
| </html> |