2017-01-01 3 views
0

Я пытаюсь создать камеру в качестве фона в форматах xamarin, где я планирую добавить вещи поверх камеры в свой общий код.Как использовать камеру в качестве фона?

Сейчас я делаю это для iOS-устройств. Я получаю сбой в этой строке кода прямо сейчас: Frame = liveCameraStream.Bounds с ошибкой: ссылка на объект не установлена ​​в экземпляр объекта.

Так что мой вопрос в том, как я могу настроить текущий код, чтобы получить камеру в качестве фона в форме xamarin?

Это мой рендер в прошивкой:

[assembly: ExportRenderer(typeof(ICameraBackground), typeof(CameraBackground_iOS))] 
namespace project.iOS 
{ 
public class CameraBackground_iOS : ViewRenderer 
{ 
    AVCaptureSession captureSession; 
    AVCaptureDeviceInput captureDeviceInput; 
    AVCaptureStillImageOutput stillImageOutput; 
    UIView liveCameraStream; 

    protected override void OnElementChanged(ElementChangedEventArgs<View> e) 
    { 
     base.OnElementChanged(e); 
     SetupLiveCameraStream(); 
    } 

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 
     SetupLiveCameraStream(); 
    } 


    public async void SetupLiveCameraStream() 
    { 
     await AuthorizeCameraUse(); 
     captureSession = new AVCaptureSession(); 

     var videoPreviewLayer = new AVCaptureVideoPreviewLayer(captureSession) 
     { 
      Frame = liveCameraStream.Bounds 
     }; 
     liveCameraStream.Layer.AddSublayer(videoPreviewLayer); 

     var captureDevice = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video); 
     ConfigureCameraForDevice(captureDevice); 
     captureDeviceInput = AVCaptureDeviceInput.FromDevice(captureDevice); 

     var dictionary = new NSMutableDictionary(); 
     dictionary[AVVideo.CodecKey] = new NSNumber((int)AVVideoCodec.JPEG); 
     stillImageOutput = new AVCaptureStillImageOutput() 
     { 
      OutputSettings = new NSDictionary() 
     }; 

     captureSession.AddOutput(stillImageOutput); 
     captureSession.AddInput(captureDeviceInput); 
     captureSession.StartRunning(); 
    } 


    public void ConfigureCameraForDevice(AVCaptureDevice device) 
    { 
     var error = new NSError(); 
     if (device.IsFocusModeSupported(AVCaptureFocusMode.ContinuousAutoFocus)) 
     { 
      device.LockForConfiguration(out error); 
      device.FocusMode = AVCaptureFocusMode.ContinuousAutoFocus; 
      device.UnlockForConfiguration(); 
     } 
     else if (device.IsExposureModeSupported(AVCaptureExposureMode.ContinuousAutoExposure)) 
     { 
      device.LockForConfiguration(out error); 
      device.ExposureMode = AVCaptureExposureMode.ContinuousAutoExposure; 
      device.UnlockForConfiguration(); 
     } 
     else if (device.IsWhiteBalanceModeSupported(AVCaptureWhiteBalanceMode.ContinuousAutoWhiteBalance)) 
     { 
      device.LockForConfiguration(out error); 
      device.WhiteBalanceMode = AVCaptureWhiteBalanceMode.ContinuousAutoWhiteBalance; 
      device.UnlockForConfiguration(); 
     } 
    } 

    public async Task AuthorizeCameraUse() 
    { 
     var authorizationStatus = AVCaptureDevice.GetAuthorizationStatus(AVMediaType.Video); 
     if (authorizationStatus != AVAuthorizationStatus.Authorized) 
     { 
      await AVCaptureDevice.RequestAccessForMediaTypeAsync(AVMediaType.Video); 
     } 
    } 
+0

Так ваш вопрос или нет, как исправить сбой, или как использовать камеру в качестве ваш фон в приложении? Поскольку вопрос в настоящее время написан, трудно сказать. – Demitrian

+0

Как использовать камеру в качестве фона. Я упомянул, где я сейчас столкнулся, чтобы продемонстрировать свою текущую ситуацию. Я немного обновлю поток, чтобы сделать его более понятным! Спасибо за головы – Martman

ответ

1

Xamarin.Forms.Labs, рамки для MVVM Xamarin.Forms, имеет CameraView, что вы можете использовать. Он также был реализован для обеих платформ. Если вы не хотите устанавливать весь пакет, вы можете просто захватить источник. Но не забудьте добавить соответствующую лицензию в свой проект, если вы решите это сделать.

CameraView может употребляться довольно легко в проекте Xamarin.Forms так:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage x:Class="XLabs.Samples.Pages.Controls.CameraViewPage" 
     xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:controls="clr-namespace:XLabs.Forms.Controls;assembly=XLabs.Forms"> 
<StackLayout> 
    <controls:CameraView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" /> 
</StackLayout> 

+0

Тогда вы можете просто взять источник из 'Xamarin.Forms.Labs' и включить свою лицензию в свой проект, как я уже упоминал. Затем вы также можете изменить рендеринг в соответствии с вашими потребностями. – Demitrian

+0

Спасибо;) Получил это на работу – Martman

+0

Рад узнать, что вы сделали это работать :) – Demitrian

Смежные вопросы