Включить Libvlc videoview в макет - PullRequest
       87

Включить Libvlc videoview в макет

2 голосов
/ 02 октября 2019

Кто-нибудь может мне помочь с примером кода ac # xamarin, как включить в макет в качестве элемента управления VideoView элемент управления LibVLC VideoView? Я хочу показать короткое видео, а затем, после его завершения, вернуться к основному макету. Мне удалось включить проигрыватель VLC в мой проект (спасибо http://xamaringuyshow.com/2019/08/23/xamarin-forms-vlc-video-payer/), но я хочу воспроизвести видео в отдельном макете и вернуться после завершения клипа.

Когда клипготово (но у медиаплеера нет кнопок управления - для поиска видео, для приостановки или воспроизведения - другая проблема ...), и я пытаюсь продолжить работу с основным потоком моего приложения, я получаю "Толькоисходная нить, которая создала иерархию представлений, может коснуться ошибки "ее представления", и приложение аварийно завершено.

Это часть моего кода с LibVLC:

public void ReplayVideoVLC(string link)
        {
            mainActivity.SetContentView(App3.Resource.Layout.VideoFullScreen);

            _libVLC = new LibVLC();
            _mediaPlayer = new MediaPlayer(_libVLC)
            {
                EnableHardwareDecoding = true
            };

            _videoView = new LibVLCSharp.Platforms.Android.VideoView(mainActivity) { MediaPlayer = _mediaPlayer };
            mainActivity.AddContentView(_videoView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent));            
            var media = new Media(_libVLC, link, FromType.FromLocation);            
            Core.Initialize();

            _videoView.SetZOrderOnTop(true);
            _videoView.MediaPlayer.Stopped += MediaPlayer_Stopped;
            _videoView.MediaPlayer.EncounteredError += MediaPlayer_EncounteredError;
            video_error = false;
            vlc_video_playing = true;
                try
                {            
                    _videoView.MediaPlayer.Play(media);
                }
                catch (Exception exx)
                {
                    exx = exx;
                    vlc_video_playing = false;
                }           
        }

        private void MediaPlayer_EncounteredError(object sender, EventArgs e)
        {
            //error on VLC replay...            
            video_error = true;
            Xamarin.Forms.Device.OpenUri(new Uri(client.current_video_url));
            vlc_video_playing = false;
        }

        private void MediaPlayer_Stopped(object sender, EventArgs e)
        {           
            try
            {         
                _videoView.MediaPlayer = null;
                _videoView = null;
            }
            catch (Exception exx)
            {
                //exx = exx;
            }

            if (!video_error)
            {
        mainActivity.ContinueGame();                
            }
            else
            {           
                Xamarin.Forms.Device.OpenUri(new Uri(client.current_video_url));
            }
            vlc_video_playing = false;
        }
```c#

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Попробуйте один из официальных образцов , например LocalNetwork, в котором есть встроенная навигация.

, но у медиаплеера нет кнопок управления - для поискавидео, чтобы приостановить или воспроизвести - другая проблема ...

Да, это так. Медиаплеер имеет API для всего этого, вы можете исследовать документы с помощью intellisense. Если вы имеете в виду кнопки управления пользовательским интерфейсом, вам нужен MediaElement, и в этом случае я бы посоветовал вам начать с этого образца .

Я пытаюсь продолжить работу с основным потокомВ моем приложении появляется ошибка «Только исходный поток, создавший иерархию представлений, может касаться его представлений», и приложение аварийно завершается.

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

0 голосов
/ 02 октября 2019

Вы должны переместить часть фоновой задачи, которая обновляет пользовательский интерфейс, в основной поток, используя Activity.RunOnUiThread. Так что, вероятно, это будет выглядеть примерно так:

Activity.RunOnUiThread(_videoView.MediaPlayer.Play(media));

...