Как записать звуковые файлы или видео (HTML)

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

Вы можете записывать видео с камеры и звук с микрофона.

Инструкции

Инициализация свойства 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 Windows.Media.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 строк прогрессивной развертки на один кадр). Все остальные методы создания предопределенных профилей работают по тому же принципу.

В качестве альтернативы с помощью метода Windows.Media.MediaProperties.MediaEncodingProfile.CreateFromFileAsync можно создать профиль, который соответствует существующему файлу мультимедиа. А если точно известны необходимые параметры кодирования, можно создать новый объект Windows.Media.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()
    );
};

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

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