0

i'm trying to create a Popup page (using Rg.Plugin.Popup) that has to display a stream video got from an API. Everytime i navigate into this page, i want to display a different video, obtained from the API, based on parameters provided by the page I come from (i get them by a message sent by Messenger). It seems to work at first run but, when i close the Popup page, and i open it again the videoView is all black and in the output is written: Failed to get window format.

That's my code ( base on sample provided here: https://code.videolan.org/videolan/LibVLCSharp/tree/master/Samples/Forms):

The code-behind page:

 public partial class WebcamVideoPopUpPage : PopupPage
{
    public WebcamVideoPopUpPage()
    {
        var vm = App.Locator.WebCamVideoVM;
        this.BindingContext = vm;
        InitializeComponent();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Messenger.Default.Send(new OnApperingVideoMessage());
    }

    private void VideoView_MediaPlayerChanged(object sender, 
     LibVLCSharp.Shared.MediaPlayerChangedEventArgs e)
    {
        Messenger.Default.Send(new OnVideoViewInitializedMessage());
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();

    }

}

videoView in xaml:

<shared:VideoView x:Name="VideoView" 
                  MediaPlayer ="{Binding MediaPlayer}"
                  HorizontalOptions ="FillAndExpand" 
                  VerticalOptions ="FillAndExpand"
                  MediaPlayerChanged ="VideoView_MediaPlayerChanged"/>

the ViewModel:

public class WebcamVideoViewModel : BaseViewModel
{
    private LibVLC LibVLC { get; set; }

    private bool IsLoaded { get; set; }
    private bool IsVideoViewInitialized { get; set; }

    private Media media { get; set; }



    private MediaPlayer _mediaPlayer;
    public MediaPlayer MediaPlayer
    {
        get { return _mediaPlayer; }
        set
        {
            _mediaPlayer = value;
            OnPropertyChanged();
        }
    }
    public WebcamVideoViewModel(INavigationService navigationService, IApiManagerFactory apiFactory) : base(navigationService, apiFactory)
    {
        Messenger.Default.Register<InfoWebcamVideoMessage>(this, OnReceivedInfoWebcam);
        Messenger.Default.Register<OnApperingVideoMessage>(this, OnAppearing);
        Messenger.Default.Register<OnVideoViewInitializedMessage>(this, OnVideoViewInitialized);
        Task.Run(Initialize);
    }

    private void Initialize()
    {
        Core.Initialize();

        LibVLC = new LibVLC();
        MediaPlayer = new MediaPlayer(LibVLC);
    }


    private async void OnReceivedInfoWebcam(InfoWebcamVideoMessage msg)
    {
        var response = await ApiManager.GetVideoWebcam(msg.Mpr, msg.Uuid);
        if (response.IsSuccessStatusCode)
        {  
            var stream = await response.Content.ReadAsStreamAsync();
            media = new Media(LibVLC, stream);
            Play();

        }
    }

    public void OnAppearing(OnApperingVideoMessage msg)
    {
        IsLoaded = true;

    }

    public void OnVideoViewInitialized(OnVideoViewInitializedMessage msg)
    {
        IsVideoViewInitialized = true;

    }

    private void Play()
    {
        if (IsLoaded && IsVideoViewInitialized)
        {
            MediaPlayer.Play(media);
        }
    }

}
Giuseppe Pennisi
  • 396
  • 3
  • 22
  • It seems you get answer [here](https://code.videolan.org/videolan/LibVLCSharp/issues/176), you can write the answer below and mark it so that people with same problem will get help. – nevermore Jul 16 '19 at 08:52

1 Answers1

0

I resolved my problem overriding OnAppering method:

protected override void OnDisappearing()
{
  base.OnDisappearing();
  VideoView.MediaPlayer.Stop();
  VideoView.MediaPlayer = null;
}
Giuseppe Pennisi
  • 396
  • 3
  • 22