2016-12-26 42 views
0

我正在爲iOS和安卓系統提供觀看視頻的應用程序。我目前正在開發iOS實現,但每次我關閉持有AVPlayer或MPPlayer的viewcontroller時,應用程序都會拋出「System.InvalidOperationException:Sequence不包含匹配的元素」。我不知道爲什麼會發生這種情況。我分享了一些示例代碼。Xamarin表單中的視頻播放器拋出System.InvalidOperationException:Sequence包含無匹配元素

渲染

using AnimeViewer.iOS.CustomRenderers; 
    using AnimeViewer.Views.Partials; 
    using AVFoundation; 
    using Foundation; 
    using UIKit; 
    using Xamarin.Forms; 
    using Xamarin.Forms.Platform.iOS; 

    [assembly: ExportRenderer(typeof(VideoPlayer), typeof(VideoPlayerRenderer))] 

    namespace AnimeViewer.iOS.CustomRenderers 
    { 
     public class VideoPlayerRenderer : ViewRenderer<VideoPlayer, UIView> 
    { 
     public VideoPlayer VideoPlayer { get; set; } 

     protected override void OnElementChanged(ElementChangedEventArgs<VideoPlayer> e) 
     { 
      base.OnElementChanged(e); 

      if (e.NewElement == null) return; 
      VideoPlayer = e.NewElement; 
      SetNativeControl(new UIView {Frame = UIScreen.MainScreen.Bounds}); 

      var player = new AVPlayer(new NSUrl(VideoPlayer.Source)); 
      var playerLayer = new AVPlayerLayer 
      { 
       Player = player, 
       Frame = Control.Frame 
      }; 
      Control.Layer.AddSublayer(playerLayer); 
      player.Play(); 
     } 
    } 
} 

查看

<?xml version="1.0" encoding="utf-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:partials="clr-namespace:AnimeViewer.Views.Partials;assembly=AnimeViewer" 
      x:Class="AnimeViewer.Views.VideoPlayerPage"> 
    <partials:VideoPlayer x:Name="Player" 
          HorizontalOptions="FillAndExpand" 
          VerticalOptions="FillAndExpand" /> 
</ContentPage> 

回答

0

你並不需要一個定製的渲染來調用視頻播放器,你可以使用一個DependencyService:

public class VideoPLayer : IVideoPlayer 
{ 
    public void Play(string path) 
    { 
     var _player = new AVPlayer(NSUrl.FromFilename(path)); 
     var _playerController = new AVPlayerViewController(); 
     _playerController.Player = _player; 

     var window = UIApplication.SharedApplication.KeyWindow; 
     var vc = window.RootViewController; 
     while (vc.PresentedViewController != null) 
     { 
      vc = vc.PresentedViewController; 
     } 

     vc.PresentViewController(_playerController, true, null); 
     _playerController.View.Frame = vc.View.Frame; 
    } 
} 

要了解更多關於DependencyService,您可以訪問以下鏈接:https://developer.xamarin.com/guides/xamarin-forms/dependency-service/

+0

感謝代碼,我之前也是這樣做過,沒有成功。但爲了向你展示,我完全用你的代碼完成了。 看看會發生什麼 1.我可以點擊情節點開視頻 https://puu.sh/t1XcQ/302e2a11f7.png 2.我可以觀看視頻沒有任何問題,它的完美! https://puu.sh/t1Xft/0d35f62409.png 3.點擊左上角完成後,約3秒後彈出此錯誤 https://puu.sh/t1Xh6/e2362bccbd.png – Elertan

+0

你確定你傳遞的路徑是正確的嗎?也許文件格式不正確? 你是從本地資源還是從uri打開視頻? –

+0

這可能是因爲您在完成Tapped事件之前設置了SelectedItem而發生的,您是否嘗試完全不瞭解它是否有效? –