Как открыть и автоматически захватить камеру с помощью класса MediaCapture

Мы пытаемся автоматически захватить изображение с веб-камеры, используя класс MediaCapture. Мы пытаемся создать приложение, которое откроет камеру, немного подождет и сделает снимок перед ней, чтобы никто не коснулся экрана для захвата. мы попытались использовать класс LowLagPhotoCapture, но не работает должным образом. Образец кода -

async private void InitMediaCapture()
{
    MediaCapture _mediaCapture = new MediaCapture();
        await _mediaCapture.InitializeAsync();
        _displayRequest.RequestActive();                        
        PreviewControlCheckIn.Source = _mediaCapture;
        await _mediaCapture.StartPreviewAsync();
        await Task.delay(500);
    CaptureImage();
}
async private void CaptureImage()
{
    storeFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync   ("TestPhoto.jpg",CreationCollisionOption.GenerateUniqueName);
        ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();
        await _mediaCapture.CapturePhotoToStorageFileAsync(imgFormat, storeFile);
    await _mediaCapture.StopPreviewAsync();
}

Любая информация была бы отличной, заранее спасибо за помощь.

1 ответ

Решение

Я заполнил предоставленный вами код и выполнил ваше требование. Пожалуйста, обратитесь к следующему коду. Обратите внимание, что вы должны объявить о возможностях камеры и микрофона в манифесте пакета приложения универсальной платформы Windows (UWP) для доступа к определенному API.

async private void InitMediaCapture()
{
    _mediaCapture = new MediaCapture();
    var cameraDevice = await FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel.Back);
    var settings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
    await _mediaCapture.InitializeAsync(settings);
    _displayRequest.RequestActive();
    PreviewControl.Source = _mediaCapture;
    await _mediaCapture.StartPreviewAsync();

    var picturesLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
    _captureFolder = picturesLibrary.SaveFolder ?? ApplicationData.Current.LocalFolder;

    await Task.Delay(500);
    CaptureImage();
}

 async private void CaptureImage()
 {
     var storeFile = await _captureFolder.CreateFileAsync("PreviewFrame.jpg", CreationCollisionOption.GenerateUniqueName);
     ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg();
     await _mediaCapture.CapturePhotoToStorageFileAsync(imgFormat, storeFile);
     await _mediaCapture.StopPreviewAsync();
 }
 private static async Task<DeviceInformation> FindCameraDeviceByPanelAsync(Windows.Devices.Enumeration.Panel desiredPanel)
 {
     // Get available devices for capturing pictures
     var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

     // Get the desired camera by panel
     DeviceInformation desiredDevice = allVideoDevices.FirstOrDefault(x => x.EnclosureLocation != null && x.EnclosureLocation.Panel == desiredPanel);

     // If there is no device mounted on the desired panel, return the first device found
     return desiredDevice ?? allVideoDevices.FirstOrDefault();
 }

Фотография будет сохранена в Pictures библиотека. И я загрузил пример кода в github. Пожалуйста, проверьте!

Другие вопросы по тегам