Поделиться через


Краткое руководство: захват видео с помощью API MediaCapture

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. В случае разработки приложений для Windows 10 см. раздел последняя документация]

В этом разделе описывается захват видео с записью в файл с помощью API Windows.Media.Capture. Вы можете использовать API Windows.Media.Capture для управления асинхронной операцией захвата, выбора профиля кодирования и записи получаемого видео в файл.

Образец захвата мультимедийного содержимого в приложениях среды выполнения Windows на JavaScript см. в разделе Образец захвата мультимедийного содержимого.

Цель: В этом учебнике описывается захват видео с помощью API Windows.Media.Capture.

Необходимые условия

Предполагается, что вы умеете создавать простые приложения среды выполнения Windows на JavaScript. Дополнительные сведения о создании первого приложения см. в разделе Создание первого приложения Магазина Windows на JavaScript.

Инструкции

Объявление возможности работы с веб-камерой

Чтобы добавить возможность работы с веб-камерой, используйте конструктор файла манифеста приложения. Выберите вкладку Характеристики, а затем выберите в списке вариант Веб-камера.

Инициализация свойства MediaCaptureSettings

Свойство MediaCaptureSettings предоставляет параметры конфигурации для объекта MediaCapture. Чтобы инициализировать эти свойства, используйте класс MediaCaptureInitializationSettings, как показано в примере.

// Initialize the MediaCaptureInitialzationSettings.
function initCaptureSettings() {
    captureInitSettings = null;
    captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
    captureInitSettings.audioDeviceId = "";
    captureInitSettings.videoDeviceId = "";
    captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audioAndVideo;
    captureInitSettings.photoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.videoPreview;
    if (deviceList.length > 0)
        captureInitSettings.videoDeviceId = deviceList[0].id;
}

Создание объекта MediaCapture

Объект MediaCapture содержит методы и асинхронные операции, необходимые для захвата видео.

    oMediaCapture = new Windows.Media.Capture.MediaCapture();

Инициализация объекта MediaCapture

Для инициализации объекта MediaCapture используйте метод MediaCapture.InitializeAsync. По умолчанию метод InitializeAsync использует устройство видеозахвата по умолчанию и записывает либо звук, либо видео. Но вы можете создать и инициализировать собственный объект MediaCaptureInitializationSettings, а затем передать его методу InitializeAsync.

// Create and initialze the MediaCapture object.
function initMediaCapture() {
    oMediaCapture = null;
    oMediaCapture = new Windows.Media.Capture.MediaCapture();
    oMediaCapture.initializeAsync(captureInitSettings).then (function (result) {
       createProfile();
    }, errorHandler);    
}

Создание профиля кодирования

Профиль кодирования содержит все параметры кодирования конечного файла. В API MediaProperties предусмотрено несколько вариантов создания объекта MediaEncodingProfile.

Пространство имен Windows.Media.MediaProperties предоставляет набор предопределенных профилей кодирования:

  • аудиофайл в формате AAC (M4A);
  • аудиофайл в формате MP3;
  • аудиофайл в формате WMA;
  • видеофайл в формате MP4 (видео в формате H.264 и аудио в формате AAC);
  • видеофайл в формате WMV.

Первые три профиля в этом списке предназначены только для аудиофайлов. Последние два профиля предназначены как для видео, так и для аудиофайлов.

Следующий фрагмент кода используется для создания профиля видеофайла в формате MP4.

// Create a profile.
function createProfile() {
    profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
        Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
}

Профиль кодирования MP4 создается статическим методом CreateMp4. Параметр этого метода задает целевое значение разрешения видео. В данном случае VideoEncodingQuality.HD720p означает разрешение 1280 x 720 пикселей со скоростью 30 кадров в секунду ("720p" означает 720 строк прогрессивной развертки на один кадр). Все остальные методы создания предопределенных профилей работают по тому же принципу.

В качестве альтернативы с помощью метода MediaProperties.MediaEncodingProfile.CreateFromFileAsync можно создать профиль, который соответствует существующему файлу мультимедиа. А если точно известны необходимые параметры кодирования, можно создать новый объект MediaProperties.MediaEncodingProfile и заполнить профиль данными.

Начало записи

Чтобы приступить к записи видео в файл, создайте файл для захвата видео. Затем вызовите метод StartRecordToStorageFileAsync, передав ему объект MediaEncodingProfile и конечный файл для сохранения.

// Start the video capture.
function startMediaCaptureSession() {
   Windows.Storage.KnownFolders.videosLibrary.createFileAsync("cameraCapture.mp4", Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (newFile) {
        storageFile = newFile;
        oMediaCapture.startRecordToStorageFileAsync(profile, storageFile).then(function (result) {           
           
        }, errorHandler);
    }  );   
}

Остановка записи

Чтобы остановить видеозахват, вызовите метод StopRecordAsync.

// Stop the video capture.
function stopMediaCaptureSession() {
    oMediaCapture.stopRecordAsync().then(function (result) {
        
    }, errorHandler);         
}

Полный пример

В следующем примере показано, как объединить вместе все этапы захвата видео с записью в файл.


var oMediaCapture;
var profile;
var captureInitSettings;
var deviceList = new Array();
var recordState = false;
var storageFile;



function errorHandler(e) {
    sdkSample.displayStatus(e.message + ", Error Code: " + e.code.toString(16));
}



// Begin initialization.
function initialization() {
    document.getElementById("message").innerHTML = "Initialization started.";
    enumerateCameras();   
}


// Identify available cameras.
function enumerateCameras() {
    var deviceInfo = Windows.Devices.Enumeration.DeviceInformation;
    deviceInfo.findAllAsync(Windows.Devices.Enumeration.DeviceClass.videoCapture).then(function (devices) {
        // Add the devices to deviceList
        if (devices.length > 0) {
           
            for (var i = 0; i < devices.length; i++) {
                deviceList.push(devices[i]);              
            }
     
            initCaptureSettings();
            initMediaCapture();
            document.getElementById("message").innerHTML = "Initialization complete.";

        } else {
            sdkSample.displayError("No camera device is found ");            
        }
    }, errorHandler);
}


// Initialize the MediaCaptureInitialzationSettings.
function initCaptureSettings() {
    captureInitSettings = null;
    captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
    captureInitSettings.audioDeviceId = "";
    captureInitSettings.videoDeviceId = "";
    captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audioAndVideo;
    captureInitSettings.photoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.videoPreview;
    if (deviceList.length > 0)
        captureInitSettings.videoDeviceId = deviceList[0].id;
}


// Create a profile.
function createProfile() {
    profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
        Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
}

// Create and initialze the MediaCapture object.
function initMediaCapture() {
    oMediaCapture = null;
    oMediaCapture = new Windows.Media.Capture.MediaCapture();
    oMediaCapture.initializeAsync(captureInitSettings).then (function (result) {
       createProfile();
    }, errorHandler);    
}


// Start the video capture.
function startMediaCaptureSession() {
   Windows.Storage.KnownFolders.videosLibrary.createFileAsync("cameraCapture.mp4", Windows.Storage.CreationCollisionOption.generateUniqueName).then(function (newFile) {
        storageFile = newFile;
        oMediaCapture.startRecordToStorageFileAsync(profile, storageFile).then(function (result) {           
           
        }, errorHandler);
    }  );   
}

// Stop the video capture.
function stopMediaCaptureSession() {
    oMediaCapture.stopRecordAsync().then(function (result) {
        
    }, errorHandler);         
}

Правильная очистка ресурсов MediaCapture

Предупреждение  

В случае приостановки работы приложения очень важно правильное завершение работы объекта MediaCapture, а также связанных объектов и их ликвидация. Если этого не сделать, то другие приложения могут столкнуться с проблемами при попытке доступа к камере устройства и у пользователя останутся негативные впечатления от вашего приложения.

В Windows Phone очистите ресурсы MediaCapture в обработчике события oncheckpoint времени жизни приложения. В Windows используйте события SoundLevelChanged и проверьте, отключен ли звук. Если он был отключен, очистите ресурсы MediaCapture. Если событие указывает на любой другой уровень звука, используйте это событие, чтобы создать их заново. Обратите внимание, что это событие не активирует ваш код даже при включении или отключении звука вручную во время работы приложения. Так что по сути это событие выполняет ту же задачу, что и приостановка с возобновлением на телефонах. Это необходимо из-за того, что в Windows пользователь может переключаться между приложениями без приостановки работы текущего приложения.

 

Следует очистить ресурсы захвата мультимедиа в событии oncheckpoint в Windows Phone или в событии SoundLevelChanged в Windows согласно инструкциям в приведенном выше примечании. Для этого удобно объявить некоторые переменные для хранения объекта MediaCapture и логических значений, показывающих, выполняется ли в приложении в настоящий момент запись или предварительный просмотр видео. Затем создайте функцию, прекращающую запись или предварительный просмотр (если эти операции выполняются), вызывающую метод Close объекта MediaCapture и присваивающую ему значение Null. Следующий код демонстрирует пример реализации этого метода.

function cleanupCaptureResources()
{
    var promises = [];

    if (mediaCapture) {
        if (isRecording) {
            promises.push(mediaCapture.stopRecordAsync().then(function () {
                isRecording = false;
            }));
        }

        promises.push(new WinJS.Promise(function (complete) {
            mediaCapture.close();
            mediaCapture = null;
            complete();
        }));
    }

    return WinJS.Promise.join(promises).done(null, errorHandler);
}

Наконец, добавьте следующий код в обработчик события oncheckpoint. Очень важно использовать объект Promise для вызова метода очистки. Это гарантирует, что система позволит методу завершить его работу перед приостановкой приложения.

app.oncheckpoint = function (args) {
    args.setPromise(
        cleanupCaptureResources()
    );
};

Сводка

В этом разделе было показано, как осуществить захват видео с помощью класса MediaCapture.

Связанные разделы

Схемы

Схема создания приложений Магазина Windows на JavaScript

Проектирование взаимодействия с пользователем в приложениях

Добавление мультимедиа

Примеры

Образец захвата мультимедийного содержимого

Образец пользовательского интерфейса для захвата с камеры

Образец пользовательского интерфейса для параметров камеры

Образец перечисления устройств

Образец связи в реальном времени

Образец расширения мультимедиа

Задачи

Краткое руководство: захват фото- или видеоизображения с использованием диалогового окна камеры

Ссылки

Windows.Media

Windows.Media.Capture

Windows.Media.Devices

Windows.Media.MediaProperties

Аудио и видео HTML5

Другие ресурсы

Поддерживаемые форматы аудио и видео

Производительность звука и видео