这是我的(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
。
来源:
- 使用 Xamarin 的 MediaManager 插件播放音频和视频
- Plugin.MediaManager NuGet
- GitHub
您正在尝试观察单个AVPlayerItem
实例当前保存在CurrentItem
属性中,即使它当前为 null。
您可以在AVPlayer
实例上观察,并使用您希望观察以下更改的NSObject
的keyPath
:
例:
obs = player.AddObserver("currentItem", NSKeyValueObservingOptions.New, (NSObservedChange obj) =>
{
Console.WriteLine($"{obj.NewValue}");
});
注意:保留返回IDisposable
的引用,否则您的观察者可能会超出范围和/或您将泄漏mem。