Como gravar áudio ou vídeo (HTML)
[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente ]
Você pode gravar vídeo de uma câmera e/ou áudio do microfone.
Instruções
Inicializar MediaCaptureSettings
A propriedade MediaCaptureSettings fornece as configurações para o objeto MediaCapture. Use a classe MediaCaptureInitializationSettings para inicializar estas propriedades, como no exemplo a seguir.
// 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;
}
Criar o objeto MediaCapture
O objeto MediaCapture contém os métodos e as operações assíncronas necessários para a captura de um vídeo.
oMediaCapture = new Windows.Media.Capture.MediaCapture();
Inicializar o objeto MediaCapture
Use o método MediaCapture.InitializeAsync para inicializar o objeto MediaCapture. Por padrão, InitializeAsync usa o dispositivo de vídeo padrão e capturará tanto áudio ou vídeo. Alternativamente, você pode criar e inicializar o seu próprio objeto MediaCaptureInitializationSettings e passá-lo ao método 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);
}
Criar um perfil de codificação
O perfil de codificação contém todas as configurações sobre como o arquivo de destino será codificado. A API Windows.Media.MediaProperties fornece várias opções para criação de um objeto MediaEncodingProfile.
O namespace Windows.Media.MediaProperties fornece um conjunto de perfis de codificação predefinidos:
- Áudio AAC (M4A)
- Áudio MP3
- Áudio do Windows Media (WMA)
- Vídeo MP4 (Vídeo H.264 mais áudio AAC)
- Vídeo do Windows Media (WMV)
Os primeiros três perfis dessa lista contêm apenas áudio. Os outros dois contêm vídeo e áudio.
O código a seguir cria um perfil para vídeo MP4.
// Create a profile.
function createProfile() {
profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
}
O método estático CreateMp4 cria um perfil de codificação MP4. O parâmetro para esse método fornece a resolução de destino do vídeo. Nesse caso, VideoEncodingQuality.HD720p significa 1280 x 720 píxeis a 30 quadros por segundo. ("720p" significa 720 linhas de varredura progressiva por quadro.) Os outros métodos de criação de perfis predefinidos seguem todos o mesmo padrão.
Alternativamente, você pode criar um perfil que corresponda a um arquivo de mídia usando o método Windows.Media.MediaProperties.MediaEncodingProfile.CreateFromFileAsync. Ou, se você sabe exatamente quais configurações de codificação deseja, você pode criar um novo objeto Windows.Media.MediaProperties.MediaEncodingProfile e preencher todos os detalhes do perfil.
Iniciar a gravação
Para começar a capturar vídeo para um arquivo, crie um arquivo para o vídeo capturado. Em seguida, chame o método StartRecordToStorageFileAsync, passando o MediaEncodingProfile e o arquivo de armazenamento de destino.
// 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);
} );
}
Pare a gravação
Para parar a captura de vídeo, chame o método StopRecordAsync.
// Stop the video capture.
function stopMediaCaptureSession() {
oMediaCapture.stopRecordAsync().then(function (result) {
}, errorHandler);
}
Exemplo completo
O exemplo a seguir mostra como as etapas da gravação de vídeo em um arquivo funcionam em conjunto.
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);
}
Limpar os recursos de MediaCapture adequadamente
Aviso
É extremamente importante que você feche e descarte adequadamente o objeto MediaCapture e objetos relacionados quando seu aplicativo é suspenso. Uma falha nesse procedimento pode interferir em outros aplicativos que estão acessando a câmera do dispositivo, o que resultará em uma experiência de usuário negativa de seu aplicativo.
No Windows Phone, limpe seus recursos MediaCapture no manipulador do evento oncheckpoint de ciclo de vida do aplicativo. No Windows, use os eventos SoundLevelChanged e verifique se o nível de som não está no modo mudo. Se estiver no modo mudo, limpe os recursos de MediaCapture. Se o evento indicar outro nível de som, use o evento para recriá-lo. Observe que esse evento não irá disparar seu código mesmo se você ativar/desativar manualmente o modo mudo do som enquanto o aplicativo está sendo executado. Portanto, esse evento atende efetivamente aos mesmos propósitos de Suspender e Continuar no telefone. Isso se faz necessário porque, no Windows, o usuário pode alternar entre os aplicativos sem que o aplicativo atual seja suspenso.
Você deve limpar os recursos de captura de mídia no evento oncheckpoint no Windows Phone ou no SoundLevelChanged no Windows, como explicado nas diretrizes na observação acima. Uma boa maneira de fazer isso é declarar algumas variáveis para armazenar o objeto MediaCapture e os boolianos que indicam se o aplicativo atualmente está gravando ou visualizando o vídeo. Em seguida, crie uma função que pausa a gravação ou visualização se uma delas estiver em progresso, as chamadas que fecham o método do objeto MediaCapture e o configura para nulo. O código a seguir exibe um exemplo de implementação desse método.
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);
}
Por fim, adicione o código a seguir em seu manipulador de eventos oncheckpoint. É muito importante que você use uma promessa para chamar seu método de limpeza. Isso garante que os sistemas deixem o método ser concluído antes de suspender seu aplicativo.
app.oncheckpoint = function (args) {
args.setPromise(
cleanupCaptureResources()
);
};