簡體   English   中英

如何使用LibVLCSharp復制第二個視頻?

[英]How to reproduce a second video with LibVLCSharp?

我試圖創建一個彈出頁面(使用Rg.Plugin.Popup ),該頁面必須顯示從API獲取的流視頻。 每次我導航到此頁面時,我都希望根據我來自頁面的參數(通過Messenger發送的消息獲取它們)顯示從API獲取的不同視頻。 它似乎在第一次運行時就起作用了,但是,當我關閉Popup頁面時,再次打開它時,videoView變黑了,並在輸出中寫道: Failed to get window format

那是我的代碼(基於此處提供的示例: https : //code.videolan.org/videolan/LibVLCSharp/tree/master/Samples/Forms ):

代碼隱藏頁面:

 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();

    }

}

xaml中的videoView:

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

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);
        }
    }

}

我解決了覆蓋OnAppering方法的問題:

protected override void OnDisappearing()
{
  base.OnDisappearing();
  VideoView.MediaPlayer.Stop();
  VideoView.MediaPlayer = null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM