c# - Xamarin:AVPlayer 在 iOS 13 上自动关闭
问题描述
我正在尝试在 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);
}
我删除了一些其他内容,因为我无法在此处发布
解决方案
我使用你的代码,它在我这边运行良好,我只是Element.AutoPlay
在最后一个 if 语句中删除,因为我不知道是什么Element
。项目启动后成功播放视频:
[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 上测试。