在最新更新后,使用适用于iOS的Xamarin播放视频中断



Xamarin for iOS 更新到 v2.0.50727 之前,适用于 iOS 的 Xamarin 中的以下代码运行良好

这是 Xamarin 窗体应用中自定义呈现器中的代码

 class WatchVideoRenderer : PageRenderer
{
    MPMoviePlayerController moviePlayer;
    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);
        var url =  new NSUrl("http://192.168.12.4:8085/MediaUploads/1/211/520140731170618/DPM202.mp4");
        moviePlayer = new MPMoviePlayerController();
        moviePlayer.ContentUrl = url;
        moviePlayer.View.Frame = new CGRect((float)((NativeView.Bounds.Width - 600) / 2), (float)((NativeView.Bounds.Height - 450) / 2), 600, 400);
        MPMoviePlayerController.Notifications.ObserveLoadStateDidChange(OnLoadStateChanged);
        MPMoviePlayerController.Notifications.ObservePlaybackDidFinish(OnPlaybackComplete);
        View.AddSubview(moviePlayer.View);
        moviePlayer.PrepareToPlay();
        moviePlayer.ShouldAutoplay = true;
        moviePlayer.Play();
    }
    private void OnLoadStateChanged(object sender, NSNotificationEventArgs e)
    {
        if (moviePlayer.LoadState == MPMovieLoadState.Playable)
        {
        }
    }
    private void OnPlaybackComplete(object sender, MPMoviePlayerFinishedEventArgs e)
    {
    }
}

正如我所说,这一直工作到前天,之后我在 Xamarin 上安装了 2 个更新。 iOS和这现在失败了。我看到的只是一块黑色画布,视频永远不会加载。不会引发来自 MPMoviePlayer Controller 的通知。这个应用程序计划在下周发布,这个最后一分钟的错误让我头疼。任何帮助真的非常感谢。

我通过推送新的图像上下文解决了类似的问题,这确实做到了。我修改了代码以包含 BeginImageContext() 和 EndImageContext()。

UIGraphics.BeginImageContext(new CGSize(1,1));
var url =  new NSUrl("http://192.168.12.4:8085/MediaUploads/1/211/520140731170618/DPM202.mp4");
moviePlayer = new MPMoviePlayerController();
moviePlayer.ContentUrl = url;
moviePlayer.View.Frame = new CGRect((float)((NativeView.Bounds.Width - 600) / 2), (float)((NativeView.Bounds.Height - 450) / 2), 600, 400);
UIGraphics.EndImageContext();

尝试切换到 AVPlayerViewController 而不是 MPMoviePlayerController。将此代码放入 OnElementChanged 方法中。

我的渲染器

是视图渲染器而不是页面渲染器,因此您可能需要对其进行一些调整。

if(Control == null)
{
    AVPlayerViewController avpvc;
    AVPlayer avp;
    var url = NSUrl.FromString("SOME URL HERE"); //or NSUrl.FromFile 
    avp = new AVPlayer(url);
    avpvc = new AVPlayerViewController();
    avpvc.Player = avp;
    avpvc.ShowsPlaybackControls = true;
    avp.Play();
    this.SetNativeControl(avpvc.View);
} 

最新更新