【问题标题】:How to reproduce a second video with LibVLCSharp?如何使用 LibVLCSharp 重现第二个视频?
【发布时间】:2019-07-16 18:48:35
【问题描述】:

我正在尝试创建一个弹出页面(使用Rg.Plugin.Popup),该页面必须显示从 API 获取的流视频。每次我导航到这个页面时,我都想根据我来自的页面提供的参数显示从 API 获得的不同视频(我通过 Messenger 发送的消息获取它们)。它似乎在第一次运行时可以工作,但是当我关闭弹出页面并再次打开它时,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 中的视频视图:

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

视图模型:

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

}

【问题讨论】:

  • 看来你得到了答案here,你可以在下面写下答案并标记它,以便有同样问题的人得到帮助。

标签: c# video xamarin.forms libvlc libvlcsharp


【解决方案1】:

我解决了覆盖 OnAppering 方法的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多