Не удается найти переднюю, заднюю камеру в приложении магазина Windows 8.1

1

Я разработал приложение для хранения Windows 8.1, вам нужно сделать снимок с помощью камеры и почты.

 MediaCaptureInitializationSettings _captureSettings = new var devices = wait DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
foreach (устройство var в устройствах)
{
if (device.EnclosureLocation! = null && device.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back)
{
 deviceId = device.Id;
 ломать;
}
 }
 if (! string.IsNullOrEmpty(deviceId))
 {
_captureSettings.AudioDeviceId = "";
_captureSettings.VideoDeviceId = deviceId;
_captureSettings.PhotoCaptureSource = Windows.Media.Capture.PhotoCaptureSource.Photo;
_captureSettings.StreamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.Video;
 }
 captureManager = новый MediaCapture();
 ожидание captureManager.InitializeAsync(_captureSettings);
 ожидание captureManager.ClearEffectsAsync(MediaStreamType.Photo);
 capturePreview1.Source = captureManager;
 ожидание captureManager.StartPreviewAsync();
 </Код>

 Здесь я получаю два устройства, но у устройств EnclosureLocation значение null, поэтому я не могу найти, какая из них - передняя и задняя камеры.

 поэтому решили получить второе устройство из списка 

 <Код>
 deviceId = devices [1].Id;
 </Код>

 но он выдает ошибку, например: "Текущий источник записи не имеет независимого потока фотографий".
 в строке инициализации MediaCapture

 <Код>

 ожидание captureManager.InitializeAsync(_captureSettings);

 </Код>

Я пробовал в windows surface pro 2 и устройствах acer. Пожалуйста, порекомендуйте. Заранее спасибо.

Теги:
xaml
visual-studio-2013
windows-8.1

1 ответ

3

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

Чтобы использовать приложение "Камера в Windows 8.1", я использую этот код:

// First need to find all webcams
DeviceInformationCollection webcamList = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture)

// Then I do a query to find the front webcam
DeviceInformation frontWebcam = (from webcam in webcamList
 where webcam.EnclosureLocation != null 
 && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Front
 select webcam).FirstOrDefault();

// Same for the back webcam
DeviceInformation backWebcam = (from webcam in webcamList
 where webcam.EnclosureLocation != null 
 && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
 select webcam).FirstOrDefault();

// Then you need to initialize your MediaCapture
var captureManager = new MediaCapture();
await captureManager.InitializeAsync(new MediaCaptureInitializationSettings
{
    // Choose the webcam you want (backWebcam or frontWebcam)
    VideoDeviceId = backWebcam.Id,
    AudioDeviceId = "",
    StreamingCaptureMode = StreamingCaptureMode.Video,
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview
});

// Set the source of the CaptureElement to your MediaCapture
capturePreview1.Source = captureManager;

// Start the preview
await captureManager.StartPreviewAsync();

Таким образом, это легче читать. Код не очень отличается, MediaCaptureInitializationSettings - это не то же самое.

Этот код работает для меня на Surface 2 RT и Nokia 635, поэтому он должен работать на вас.

Редактировать:

Кажется, он работает на устройствах с Windows RT, но на всех устройствах с Windows 8.1 он всегда равен нулю. Msdn говорит, что:

Если информация о местоположении в корпусе отсутствует, свойство будет null

так что вы можете сделать, сначала попробуйте увидеть, если вы нашли backwebcam, и если он null принимает последний;

DeviceInformation backWebcam = (from webcam in webcamList
 where webcam.EnclosureLocation != null 
 && webcam.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
 select webcam).FirstOrDefault();

if (backWebcam == null)
{
   backWebcam = webcamList.Last();
}

Но вы не уверены, что последний в коллекции является задним, поэтому вы должны добавить кнопку, чтобы пользователь переключал камеру

Если вы меняете камеру,

await captureManager.StopPreviewAsync();

await captureManager.InitializeAsync(new MediaCaptureInitializationSettings
    {
        // Choose an other webcam 
        VideoDeviceId = //id of the new webcam,
        AudioDeviceId = "",
        StreamingCaptureMode = StreamingCaptureMode.Video,
        PhotoCaptureSource = PhotoCaptureSource.VideoPreview
    });

 await captureManager.StartPreviewAsync();

таким образом, вы можете быть уверены, что пользователь может выбрать правильную камеру, даже если вы программно не можете определить, какой из них

  • 1
    Большое спасибо за ваш ответ. Я попробовал ваш код, я вижу два устройства в 'webcamList', но значение webcam.EcclosureLocation всех устройств равно нулю. поэтому я не могу найти заднюю камеру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню