在最新更新后,使用Xamarin for iOS播放video已损坏

在Xamarin for iOS更新到v2.0.50727之前,Xamarin for iOS中的以下代码工作正常

这是Xamarin Forms应用程序中自定义渲染器中的代码

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&现在失败了。 我只看到一个黑色的canvas,video永远不会加载。 MPMoviePlayerController不会发出任何通知。 有一个这个应用程序的发布计划在下周,这最后一分钟的错误导致我头痛。 任何帮助都非常感谢。

我通过推送一个新的图像上下文解决了类似的问题。 我修改了代码以包含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); }