Подтвердить что ты не робот

Windows Phone 8.1 MediaCapture замерзает телефон

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

    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        MediaCapture _MediaCapture;
        bool _recording;
        public MainPage()
        {
            this.InitializeComponent();

            this.NavigationCacheMode = NavigationCacheMode.Required;
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.
        /// This parameter is typically used to configure the page.</param>
        protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            var devices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);


            var rearCamera = devices[0];
            if (devices.Count > 0)
            {

                rearCamera = devices.Single(currDev =>
                  currDev.EnclosureLocation.Panel == Windows.Devices.Enumeration.Panel.Back
                );
            }

            _MediaCapture = new MediaCapture();
            await _MediaCapture.InitializeAsync(new MediaCaptureInitializationSettings() { VideoDeviceId = rearCamera.Id });

// this is CaptureElement
            xCapture.Source = _MediaCapture;

            _recording = false;
        }

        protected override async void OnNavigatedFrom(NavigationEventArgs e)
        {
            if(_MediaCapture != null)
            {
                await _MediaCapture.StopPreviewAsync();
                await _MediaCapture.StopRecordAsync();

                _MediaCapture.Dispose();
                _MediaCapture = null;

                xCapture.Source = null;
            }


            base.OnNavigatedFrom(e);


        }

// button click handler
        private async void StartMeasure(object sender, RoutedEventArgs e)
        {
            if (_recording)
            {
                //await _MediaCapture.StopPreviewAsync();
                _MediaCapture.VideoDeviceController.TorchControl.Enabled = false;
                _recording = false;
            }
            else
            {
                //await _MediaCapture.StartPreviewAsync();
                _MediaCapture.VideoDeviceController.TorchControl.Enabled = true;
                _recording = true;
            }
        }
    }

В этом виде он отлично работает.

Если я раскомментирую эти строки предварительного просмотра, он работает, но только один раз.

Если я нажму кнопку три раза: включи, выключи и снова, я получаю исключение в строке с включением TorchControl.

System.Exception: Исключение из HRESULT: 0xE801000D в Windows.Media.Devices.TorchControl.put_Enabled (логическое значение) в Pulsometr3.MainPage.d__d.MoveNext()

HRESULT меняется.

Что еще более странно, оно иногда замораживает телефон (например, 2 из 3 раза), и мне нужно удерживать Power + Volume Down.

Я попытался украсить все методы с помощью [STAThread], но это не помогло (http://technet.microsoft.com/en-ca/br226599).

Что еще более интересно, когда я выполняю операции с помощью debbuger, используя F10 для перехода по строкам, я могу переключать предварительный просмотр столько раз, сколько захочу. Это было ужасно, потому что отладчик держал все потоки, не так ли? Итак, в теории нет разницы?

Кроме того, телефон иногда зависает при развертывании... И это просто раздражает.

Любые идеи?

4b9b3361

Ответ 1

У меня есть именно это... по какой-то причине microsoft не очень заботится о ее преемнике OS для WP8, что делает меня очень грустным. Но это было полтора года назад в течение лета, я пробовал это, возможно, вы можете сделать снимок для поиска по запросу в Google, а также дважды проверить свои проявления приложений, если у вас есть передняя/задняя камера и веб-камера. что если это не сработает, то неудача, вам стоит придерживаться версии wp 8.0, которая работает точно так же на wp 8.1, так что не волнуйтесь:) и другие библиотеки, такие как facebook stuff или parse.com, не будут работать на стр. 8.1 С#:)

Ответ 2

Я думаю, что ваша проблема связана с кешем страницы. Попробуйте удалить эту строку в коде this.NavigationCacheMode = NavigationCacheMode.Required;

Ответ 3

Если я правильно понимаю, у кнопки есть обработчик StartMeasure, который является асинхронным методом и ожидает Start/StopPreviewAsync(). Проблема может заключаться в том, что если вы нажмете кнопку более одного раза, одно действие может быть все еще ожидаемым (в процессе), а другое вызвано, это может вызвать некоторые проблемы, потому что он попытается запустить и остановить предварительный просмотр в том же которое, вероятно, приведет к некоторым условиям гонки. Вы можете проверить это, добавив блокировку для управления доступом к менеджеру захвата, чтобы проверить это. Кроме того, проверка bool и назначение его после ожидаемой операции - это не атомная операция, которая также может привести к условиям гонки.

    private object locker;

    private async void StartMeasure(object sender, RoutedEventArgs e)
    {
        lock (locker)
        {
            if (_recording)
            {
                await _MediaCapture.StopPreviewAsync();
            }
            else
            {
                await _MediaCapture.StartPreviewAsync();
            }
            _recording = !_recording;
            _MediaCapture.VideoDeviceController.TorchControl.Enabled = _recording;               
        }
    }