最新更新后,播放Xamarin for iOS的视频已损坏

时间:2015-04-16 10:46:03

标签: ios xamarin mpmovieplayercontroller xamarin.forms

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试切换到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);
}