Xamarin:AVPlayer 在 iOS 13 上自动关闭

Posted

技术标签:

【中文标题】Xamarin:AVPlayer 在 iOS 13 上自动关闭【英文标题】:Xamarin : AVPlayer Closing automatically on iOS 13 【发布时间】:2019-11-10 16:49:07 【问题描述】:

我正在尝试在 AVPlayer 上播放视频并自动关闭它。

这是 AVPlayer 弹出时的代码

if (asset != null)
            
                string[] keys =  "playable" , "hasProtectedContent" ;

               asset.LoadValuesAsynchronously(keys, () =>
                
                    DispatchQueue.MainQueue.DispatchAsync(() =>
                    
                        // Device.BeginInvokeOnMainThread(() =>  
                        if (asset == null) return;

                        playerItem = new AVPlayerItem(asset);
                        player.ReplaceCurrentItemWithPlayerItem(playerItem);
                        if (playerItem != null && Element.AutoPlay)
                            player.Play();
                    );
                );
            

这是我只在 ios 13 上遇到的错误:

[plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x60000059c5a0> F8BB1C28-BAE8-11D6-9C31-00039315CD46
[] nw_endpoint_flow_copy_multipath_subflow_counts Called on non-Multipath connection
0000000A:  0100  4          4           66
00000016:  0101  4          4           66
00000022:  0102  3          6          110
0000002E:  011A  5          8          116
0000003A:  011B  5          8          124
00000046:  0128  3          2            3
00000052:  0131  2         12          132
0000005E:  0132  2         20          144
000000A6:  0100  4          4          256
000000B2:  0101  4          4          256
000000BE:  0102  3          6          266
000000CA:  0103  3          2            6
000000D6:  0106  3          2            6
000000E2:  0115  3          2            3
000000EE:  0201  4          4          272
000000FA:  0202  4          4         7818
0000000A:  0100  3          2         3840
00000016:  0101  3          2         2400
00000022:  0102  3          6          158
0000002E:  0106  3          2            2
0000003A:  0112  3          2            1

请让我知道我在这里缺少什么。

这是我用于视频播放器渲染的代码

    public class VideoPlayerRenderer : ViewRenderer<VideoPlayer, UIView>
    
        AVPlayer player;
        AVPlayerItem playerItem;
        AVPlayerViewController _playerViewController;       // solely for ViewController property
        AVAsset asset;
        NSObject didPlayToEndObserver;

        public override UIViewController ViewController => _playerViewController;

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

            if (e.NewElement != null)
            
                if (Control == null)
                
                    // Create AVPlayerViewController
                    _playerViewController = new AVPlayerViewController();

                    // Set Player property to AVPlayer
                    player = new AVPlayer();
                    _playerViewController.Player = player;

                    UITapGestureRecognizer uiTapGestureRecognizer = new UITapGestureRecognizer(TapAction);
                    _playerViewController.ContentOverlayView.GestureRecognizers = new UIGestureRecognizer[]  uiTapGestureRecognizer ;

                    var x = _playerViewController.View;

                    // Use the View from the controller as the native control
                    SetNativeControl(_playerViewController.View);

                    didPlayToEndObserver = AVPlayerItem.Notifications.ObserveDidPlayToEndTime(AVPlayerItem_DidPlayToEndTimeNotification);
                

还有一些我删除了,因为我无法在这里发布它

【问题讨论】:

您在 iOS 13.1 中进行测试吗?看看this thread 可能会有所帮助。如果您可以在此处共享可以重现此问题的示例,那就更好了。 @JackHua-MSFT :我在 13.1 和 13.2 上进行了测试。我有同样的问题。我尝试按照线程中的说明修改我的代码,但仍然出现相同的错误。 @JackHua-MSFT : 我用视频播放器代码更新了我的帖子 @JackHua-MSFT:谢谢。我尝试从 IF 语句中删除元素,但我仍然无法播放。播放器正在自动关闭。我正在使用 PRISM 进行导航。有什么关系吗?? 我试过你给我的代码,这就是我目前所能做的。如果您可以在这里与我们分享一个可以重现此问题的示例项目,我会检查它。如果你需要,我可以分享我的测试项目。 【参考方案1】:

我使用您的代码,它在我这边运行良好,我刚刚在最后一个 if 语句中删除了 Element.AutoPlay,因为我不知道 Element 是什么。项目启动后播放video成功:

[assembly: ExportRenderer(typeof(myVideoPlayer), typeof(VideoPlayerRenderer))]
namespace App48.iOS

    public class VideoPlayerRenderer : ViewRenderer<myVideoPlayer, UIView>
    
        AVPlayer player;
        AVPlayerItem playerItem;
        AVPlayerViewController _playerViewController;       // solely for ViewController property
        AVAsset asset;

        NSError err;

        public override UIViewController ViewController => _playerViewController;

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

            if (e.NewElement != null)
            
                if (Control == null)
                
                    // Create AVPlayerViewController
                    _playerViewController = new AVPlayerViewController();

                    // Set Player property to AVPlayer
                    player = new AVPlayer();
                    _playerViewController.Player = player;

                    // Use the View from the controller as the native control
                    SetNativeControl(_playerViewController.View);

                    asset = AVAsset.FromUrl(new NSUrl("https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"));
                    if (asset != null)
                    
                        string[] keys =  "playable" , "hasProtectedContent" ;

                        asset.LoadValuesAsynchronously(keys, () =>
                        
                            DispatchQueue.MainQueue.DispatchAsync(() =>
                            
                                // Device.BeginInvokeOnMainThread(() =>  
                                if (asset == null) return;

                                Console.WriteLine(asset.StatusOfValue("playable", out err));

                                playerItem = new AVPlayerItem(asset);
                                player.ReplaceCurrentItemWithPlayerItem(playerItem);
                                if (playerItem != null)
                                    player.Play();
                            );
                        );
                    
                
            
        

    

在 xamarin.forms 中:

<StackLayout>
    <!-- Place new controls here -->
    <app48:myVideoPlayer
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />
</StackLayout>

public class myVideoPlayer : View  


注意:我在 iOS 模拟器 13.1 上测试。

【讨论】:

以上是关于Xamarin:AVPlayer 在 iOS 13 上自动关闭的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer 控件无法正常工作

在 iOS 13 上,AVPlayer 会为此 HLS 视频选择仅音频流。我可以控制这种行为,而是让它加载视频+音频吗?

iOS 13+ 应用程序的 AVAudioPlayer AVPlayer AVQueuePlayer MPMusicPlayerController MPRemoteCommandCenter MPN

如何使用 Xamarin 在 iOS 13 中获取设备令牌?

使用 AVPlayer 的 iOS 音频可视化

Xamarin.iOS SKProductRequest 事件未在 Debug 中调用(在 iOS 15 和 xCode 13 之前工作)