예제 #1
0
        private async void CameraHelper_OnInitOver(ErrorMessageType obj)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                try
                {
                    IsSetCamera = true;
                    cbxCameraList.Items.Clear();
                    CameraInfo selectedCamera = null;
                    foreach (var item in CameraHelper.CameraDevicesList)
                    {
                        cbxCameraList.Items.Add(item);
                        if (CameraHelper.SelectedCameraId == item.Id)
                        {
                            selectedCamera = item;
                        }
                    }
                    cbxCameraList.SelectedItem = selectedCamera;
                    cbxSizeList.Items.Clear();
                    var sizeList = CameraHelper.GetSizeList();
                    CameraSizeInfo selectedItem = null;
                    foreach (var item in sizeList)
                    {
                        cbxSizeList.Items.Add(item);
                        if (item.Width == CameraHelper.CurrentPhotoW && item.Height == CameraHelper.CurrentPhotoH)
                        {
                            selectedItem = item;
                        }
                    }
                    if (selectedItem == null && sizeList.Count > 0)
                    {
                        selectedItem = sizeList.First(li => li.SizeTag == sizeList.Max(li2 => li2.SizeTag));
                    }
                    cbxSizeList.SelectedItem      = selectedItem;
                    sldZoom.Minimum               = CameraHelper.MinZoomSetting;
                    sldZoom.Maximum               = CameraHelper.MaxZoomSetting;
                    sldZoom.StepFrequency         = CameraHelper.StepZoomSeting;
                    sldZoom.IsEnabled             = CameraHelper.IsSupportHWZoom == true;
                    btnCaptureMorePhoto.IsEnabled = CameraHelper.IsSupportContinuousCapture == true;


                    AutoFocus.IsChecked    = CameraHelper.bFocus;
                    AutoExposure.IsChecked = CameraHelper.bExposureAuto;
                    AutoBacklightCompensation.IsChecked = CameraHelper.bBacklightCompensation;
                    AutoWhiteBalance.IsChecked          = CameraHelper.bWhiteBalance;
                }
                finally
                {
                    IsSetCamera            = false;
                    BottomAppBar.IsEnabled = true;
                }
            });
        }
예제 #2
0
        /// <summary>
        /// 初始化摄像头并启动预览
        /// </summary>
        public static async void InitCamera(bool isNewInit = true, bool isMinZoom = false)
        {
            try
            {
                AppPathHelper.Init();
                ConfigHelper.Init();
                if (isNewInit == true && IsLoading == true)
                {
                    TriggerInitCameraOver(ErrorMessageType.Camera_Start_IsLoading);
                    if (CameraLoadedEvent != null)
                    {
                        CameraLoadedEvent();
                    }
                    return;
                }
                IsLoading = true;
                if (isNewInit == true)
                {
                    FailedIndex       = 1;
                    IsZoomEffectAdded = false;
                }
                //使用UI线程进行初始化,因为需要一些事件中进行调用或重试,这些事件可能在子线程中。
                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    IsCanSetCamera = false;
                    IsCanUseCamera = false;
                });

                try
                {
                    await StopPreview();
                    await LoadDevice();

                    if (CurrentCamDevice == null)
                    {
                        TriggerInitCameraOver(ErrorMessageType.Camera_Start_NoDevice);
                        if (CameraLoadedEvent != null)
                        {
                            CameraLoadedEvent();
                        }
                        return;
                    }
                    var useRes = IsCanUseCurrentDevice();
                    if (useRes != ErrorMessageType.None)
                    {
                        TriggerInitCameraOver(useRes);
                        if (CameraLoadedEvent != null)
                        {
                            CameraLoadedEvent();
                        }
                        return;
                    }
                    var res = await InitCamera();

                    if (!res)
                    {
                        TriggerInitCameraOver(ErrorMessageType.Camera_Start_UserDenied);
                        if (CameraLoadedEvent != null)
                        {
                            CameraLoadedEvent();
                        }
                        return;
                    }
                    if (isMinZoom)
                    {
                        AppHelper.CameraZoomNumber = MinZoomSetting;
                    }
                    SetZoom(AppHelper.CameraZoomNumber, true);
                    GetPreviewSize();
                    GetPhotoSize();
                    if (CameraPhotoSizeList != null)
                    {
                        IsHavePhotoStream = CameraPhotoSizeList.Count > 0;
                    }
                    else
                    {
                        IsHavePhotoStream = false;
                    }
                    //获取录像分辨率,在摄像头初始化的时候判断是否支持两种录像的分辨率。
                    var recordSize = MainCamera.VideoDeviceController
                                     .GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord)
                                     .Where(li => li is VideoEncodingProperties)
                                     .Select(li => li as VideoEncodingProperties);
                    var cameraSize    = CameraHelper.GetSizeList();
                    var oneRecordSize = RecordSizeList[0];
                    var twoRecordSize = RecordSizeList[1];
                    IsCanRecord =
                        recordSize.Count(li => li.Width == oneRecordSize.Width && li.Height == oneRecordSize.Height) > 0 &&
                        cameraSize.Count(li =>
                                         (li.Width == oneRecordSize.Width && li.Height == oneRecordSize.Height) ||
                                         (li.Width == twoRecordSize.Width && li.Height == twoRecordSize.Height)) > 0;
                    //设置分辨率
                    await SetSize();

                    MainCamera.Failed += async(ds, de) =>
                    {
                        try
                        {
                            await StopPreview();
                        }
                        catch (Exception ex)
                        {
                        }
                        switch (de.Code)
                        {
                        case 0xC00D3EA3:
                        case 0xC00D3704:
                            TriggerInitCameraOver(ErrorMessageType.Camera_Start_AppLocked);
                            break;

                        case 0xC00D3E82:
                            if (FailedIndex <= 2)
                            {
                                FailedIndex++;
                                await Task.Delay(500);

                                InitCamera(false);
                            }
                            else
                            {
                                TriggerInitCameraOver(ErrorMessageType.Camera_Start_AppLocked);
                            }
                            break;

                        case 0x80070326:
                            TriggerInitCameraOver(ErrorMessageType.Camera_Start_NoAccessRight);
                            break;
                        }
                    };
                    if (OnNeedSetControls != null)
                    {
                        await OnNeedSetControls(MainCamera);
                    }
                    await MainCamera.StartPreviewAsync();

                    //await PrepareLowLagPhoto();
                    //调用结束事件
                    TriggerInitCameraOver(ErrorMessageType.None);
                }
                catch (Exception ex)
                {
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                IsLoading = false;
                if (CameraLoadedEvent != null)
                {
                    CameraLoadedEvent();
                }
            }
        }