162 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| //// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
 | |
| //// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
 | |
| //// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
 | |
| //// PARTICULAR PURPOSE.
 | |
| ////
 | |
| //// Copyright (c) Microsoft Corporation. All rights reserved
 | |
| 
 | |
| (function () {
 | |
|     "use strict";
 | |
| 
 | |
|     var cameraList = null;
 | |
|     var mediaCaptureMgr = null;
 | |
|     var captureInitSettings = null;
 | |
| 
 | |
|     var page = WinJS.UI.Pages.define("/html/AdvancedCapture.html", {
 | |
| 
 | |
|         ready: function (element, options) {
 | |
|             scenarioInitialize();
 | |
|         },
 | |
| 
 | |
|         unload: function (element, options) {
 | |
|             // release resources
 | |
|             releaseMediaCapture();
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     function scenarioInitialize() {
 | |
|         // Initialize the UI elements
 | |
|         id("btnStartDevice").disabled = false;
 | |
|         id("btnStartDevice").addEventListener("click", startDevice, false);
 | |
|         id("btnStartPreview").disabled = true;
 | |
|         id("videoEffect").disabled = true;
 | |
|         id("btnStartPreview").addEventListener("click", startPreview, false);
 | |
|         id("cameraSelect").addEventListener("change", onDeviceChange, false);
 | |
| 
 | |
|         id("videoEffect").addEventListener('change', addEffectToImageStream, false);
 | |
| 
 | |
|         enumerateCameras();
 | |
|     }
 | |
| 
 | |
|     function initCameraSettings() {
 | |
|         captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
 | |
|         captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.video
 | |
| 
 | |
|         // If the user chose another capture device, use it by default
 | |
|         var selectedIndex = id("cameraSelect").selectedIndex;
 | |
|         var deviceInfo = cameraList[selectedIndex];
 | |
|         captureInitSettings.videoDeviceId = deviceInfo.id;
 | |
|     }
 | |
| 
 | |
|     // this function takes care of releasing the resources associated with media capturing
 | |
|     function releaseMediaCapture() {
 | |
|         if (mediaCaptureMgr) {
 | |
|             mediaCaptureMgr.close();
 | |
|             mediaCaptureMgr = null;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     //Initialize media capture with the current settings
 | |
|     function startDevice() {
 | |
|         displayStatus("Starting device");
 | |
|         releaseMediaCapture();
 | |
|         initCameraSettings();
 | |
| 
 | |
|         mediaCaptureMgr = new Windows.Media.Capture.MediaCapture();
 | |
|         mediaCaptureMgr.initializeAsync(captureInitSettings).done(function (result) {
 | |
|             // Update the UI
 | |
|             id("btnStartPreview").disabled = false;
 | |
|             id("btnStartDevice").disabled = true;
 | |
|             displayStatus("Device started");
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     function startPreview() {
 | |
|         displayStatus("Starting preview");
 | |
|         id("btnStartPreview").disabled = true;
 | |
|         id("videoEffect").disabled = false;
 | |
|         var video = id("previewVideo");
 | |
|         video.src = URL.createObjectURL(mediaCaptureMgr, { oneTimeOnly: true });
 | |
|         video.play();
 | |
|         displayStatus("Preview started");
 | |
|     }
 | |
| 
 | |
|     function addEffectToImageStream() {
 | |
|         var effectId = id("videoEffect").selectedIndex;
 | |
|         var props = new Windows.Foundation.Collections.PropertySet();
 | |
|         props.insert("{698649BE-8EAE-4551-A4CB-3EC98FBD3D86}", effectId);
 | |
| 
 | |
|         mediaCaptureMgr.clearEffectsAsync(Windows.Media.Capture.MediaStreamType.videoPreview).then(function () {
 | |
|             return mediaCaptureMgr.addEffectAsync(Windows.Media.Capture.MediaStreamType.videoPreview, 'OcvTransform.OcvImageManipulations', props);
 | |
|         }).then(function () {
 | |
|             displayStatus('Effect has been successfully added');
 | |
|         }, errorHandler);
 | |
|     }
 | |
| 
 | |
|     function enumerateCameras() {
 | |
|         displayStatus("Enumerating capture devices");
 | |
|         var cameraSelect = id("cameraSelect");
 | |
|         cameraList = null;
 | |
|         cameraList = new Array();
 | |
| 
 | |
|         // Clear the previous list of capture devices if any
 | |
|         while (cameraSelect.length > 0) {
 | |
|             cameraSelect.remove(0);
 | |
|         }
 | |
| 
 | |
|         // Enumerate cameras and add them to the list
 | |
|         var deviceInfo = Windows.Devices.Enumeration.DeviceInformation;
 | |
|         deviceInfo.findAllAsync(Windows.Devices.Enumeration.DeviceClass.videoCapture).done(function (cameras) {
 | |
|             if (cameras.length === 0) {
 | |
|                 cameraSelect.disabled = true;
 | |
|                 displayError("No camera was found");
 | |
|                 id("btnStartDevice").disabled = true;
 | |
|                 cameraSelect.add(new Option("No cameras available"));
 | |
|             } else {
 | |
|                 cameras.forEach(function (camera) {
 | |
|                     cameraList.push(camera);
 | |
|                     cameraSelect.add(new Option(camera.name));
 | |
|                 });
 | |
|             }
 | |
|         }, errorHandler);
 | |
|     }
 | |
| 
 | |
|     function onDeviceChange() {
 | |
|         releaseMediaCapture();
 | |
|         id("btnStartDevice").disabled = false;
 | |
|         id("btnStartPreview").disabled = true;
 | |
|         id("videoEffect").disabled = true;
 | |
|         displayStatus("");
 | |
|     }
 | |
| 
 | |
|     function suspendingHandler(suspendArg) {
 | |
|         displayStatus("Suspended");
 | |
|         releaseMediaCapture();
 | |
|     }
 | |
| 
 | |
|     function resumingHandler(resumeArg) {
 | |
|         displayStatus("Resumed");
 | |
|         scenarioInitialize();
 | |
|     }
 | |
| 
 | |
|     function errorHandler(err) {
 | |
|         displayError(err.message);
 | |
|     }
 | |
| 
 | |
|     function failedEventHandler(e) {
 | |
|         displayError("Fatal error", e.message);
 | |
|     }
 | |
| 
 | |
|     function displayStatus(statusText) {
 | |
|         SdkSample.displayStatus(statusText);
 | |
|     }
 | |
| 
 | |
|     function displayError(error) {
 | |
|         SdkSample.displayError(error);
 | |
|     }
 | |
| 
 | |
|     function id(elementId) {
 | |
|         return document.getElementById(elementId);
 | |
|     }
 | |
| })();
 | 
