检测 AVP图层项目状态更改



这是我的(Xamarin C#(代码:(player是一个AVPlayer

var v = NSNotificationCenter.DefaultCenter.AddObserver(new NSString("Status"), ReadyNow, player.CurrentItem);

即使玩家打得很好,它也从不叫ReadyNow(NSNotification obj)

如何修复它以调用该方法?(我不知道错误是在 Xamarin/C# 部分还是在我正在使用的对象等中,如果用 Swift 编写,这将是相同的错误。

您可以获取玩家的当前物品并将观察者添加到其中。

该物业:

private AVPlayerItem CurrentItem => Player.CurrentItem;

观察者:

CurrentItem.AddObserver(this, new NSString("status"), 
NSKeyValueObservingOptions.New | NSKeyValueObservingOptions.Initial,
StatusObservationContext.Handle);

如果需要,还可以附加加载的时间范围:

CurrentItem.AddObserver(this, new NSString("loadedTimeRanges"), 
NSKeyValueObservingOptions.Initial | NSKeyValueObservingOptions.New,
LoadedTimeRangesObservationContext.Handle);

注意:在附加之前,请务必分离状态的观察者:

CurrentItem.RemoveObserver(this, new NSString("status"));

编辑:StatusObservationContext只是一个属性,指向status字符串。

public static readonly NSString StatusObservationContext = new NSString("Status");

有用的资源您可以在Martinj的优秀软件包中找到AVPlayer实施所需的一切 -XamarinMediaManager

来源:

  1. 使用 Xamarin 的 MediaManager 插件播放音频和视频
  2. Plugin.MediaManager NuGet
  3. GitHub

您正在尝试观察单个AVPlayerItem实例当前保存在CurrentItem属性中,即使它当前为 null。

您可以在AVPlayer实例上观察,并使用您希望观察以下更改的NSObjectkeyPath

例:

obs = player.AddObserver("currentItem", NSKeyValueObservingOptions.New, (NSObservedChange obj) =>
{
Console.WriteLine($"{obj.NewValue}");
});

注意:保留返回IDisposable的引用,否则您的观察者可能会超出范围和/或您将泄漏mem。

最新更新