C# 检测用户跳过AVPlayer视频的结尾
我已经编写了一个Xamarin.Forms iOS应用程序C# 检测用户跳过AVPlayer视频的结尾,c#,ios,xamarin,avplayer,xamarin-forms,C#,Ios,Xamarin,Avplayer,Xamarin Forms,我已经编写了一个Xamarin.Forms iOS应用程序页面,用户可以使用AVPlayer通过自定义页面渲染器播放视频 当视频结束时,或当用户滚动到视频结束时(使用由avplayervewcontroller创建的控件),它们应该被发送到应用程序中的下一个ContentPage 我可以通过观察AVPlayerItem\u playerItem上的AVPlayerItem.didplaytoEndTime通知来跟踪视频何时“自然”结束,如下所示: videoEndNotification
页面
,用户可以使用AVPlayer
通过自定义页面渲染器播放视频
当视频结束时,或当用户滚动到视频结束时(使用由avplayervewcontroller
创建的控件),它们应该被发送到应用程序中的下一个ContentPage
我可以通过观察AVPlayerItem\u playerItem
上的AVPlayerItem.didplaytoEndTime通知来跟踪视频何时“自然”结束,如下所示:
videoEndNotificationToken = NSNotificationCenter.DefaultCenter.AddObserver(
AVPlayerItem.DidPlayToEndTimeNotification,
VideoDidFinishPlaying,
_playerItem);
然后,我在VideoDidFinishPlaying
中的导航堆栈上推送一个新页面,用户继续
但是,如果用户使用默认的控制栏将视频拖到最后,则此操作不起作用
如何检测视频是否通过用户将其拖到结尾而结束?使用avplayervewcontroller
并允许用户手动搜索到结尾不会触发DidPlayToEndTimeNotification
,因为媒体资产实际上没有“正常”播放到结尾
以下是我在类似案例中所做的:
添加TimeJumpedNotification
:
手动搜索结束的测试:
public void videoFinished(NSNotification通知){
if(notify.Name==AVPlayerItem.TimeJumpedNotification){
Console.WriteLine(“{0}:{1}”,_playerItem.Duration,_player.CurrentTime);
if(数学绝对值(_playerItem.Duration.Seconds-_player.CurrentTime.Seconds)<0.001){
Console.WriteLine(“通过用户查找结束”);
}
}else if(notify.Name==AVPlayerItem.DidPlayToEndTimeNotification){
Console.WriteLine(“正常饰面”);
}否则{
//播放后台调用通知、项目失败支付到EndTimeErrorKey等。。。
Console.WriteLine(notify.Name);
}
}
使用avplayervewcontroller
并允许用户手动搜索结束不会触发DidPlayToEndTimeNotification
,因为媒体资产实际上没有“正常”播放到结束
以下是我在类似案例中所做的:
添加TimeJumpedNotification
:
手动搜索结束的测试:
public void videoFinished(NSNotification通知){
if(notify.Name==AVPlayerItem.TimeJumpedNotification){
Console.WriteLine(“{0}:{1}”,_playerItem.Duration,_player.CurrentTime);
if(数学绝对值(_playerItem.Duration.Seconds-_player.CurrentTime.Seconds)<0.001){
Console.WriteLine(“通过用户查找结束”);
}
}else if(notify.Name==AVPlayerItem.DidPlayToEndTimeNotification){
Console.WriteLine(“正常饰面”);
}否则{
//播放后台调用通知、项目失败支付到EndTimeErrorKey等。。。
Console.WriteLine(notify.Name);
}
}
AVPlayer
没有任何控件,您在使用哪些控件?那些由avplayervewcontroller
avplayervcontroller
提供的控件没有任何控件,您在使用哪些控件?那些由avplayervcontroller
提供的控件正是我想要的,谢谢。我现在面临的唯一问题是,我想等到用户将手指从搜索栏上取下后再继续,而不是在他们仍在搜索时立即移动页面……您可能想问另一个关于后续问题的问题。我遇到的问题是avplayervewcontroller
子类化以访问控件是不可能的,因为苹果公司实际上声明不将该视图子类化,我发现事情很快就发生了变化。两个不同的项目:一个是我放弃了avplayervcontroller
并为AVPlayer
编写了自己的视图,另一个是我在视图中添加了一个透明覆盖层来跟踪触摸,然后递归地进入avplayervcontroller
子视图,以确定用户触摸下屏幕上的内容,yuk:-/Ooft,听起来很残忍。我对这一切都很陌生,所以这两种方法听起来都很吓人!应用程序等待搜索结束并不是关键任务,只是一个“可能有”,所以我现在可以离开,专注于我今天忽略的Android端口。再次感谢你的帮助!np,再一次,问另一个问题,因为我“假设”有一个比我更聪明的人提出了一种方法,可以将触摸委托/事件添加到avplayervewcontroller
中的控件中,即使是一个粗糙的脏标志来跟踪搜索栏是否在使用,也可以解决您的用例。接下来的就是我所要求的,谢谢。我现在面临的唯一问题是,我想等到用户将手指从搜索栏上取下后再继续,而不是在他们仍在搜索时立即移动页面……您可能想问另一个关于后续问题的问题。我遇到的问题是avplayervewcontroller
子类化以访问控件是不可能的,因为苹果公司实际上声明不将该视图子类化,我发现事情很快就发生了变化。两个不同的项目:一个是我放弃了avplayervcontroller
并为AVPlayer
编写了自己的视图,另一个是我在视图中添加了一个透明覆盖层来跟踪触摸,然后递归地进入avplayervcontroller
子视图,以确定用户触摸下屏幕上的内容,yuk:-/Ooft,听起来很残忍。我对这一切都很陌生,所以这两种方法听起来都很吓人!应用程序等待搜索结束并不是关键任务,只是一个“可能有”,所以我现在可以离开,专注于我今天忽略的Android端口。再次感谢你的帮助!np,再次询问另一个问题,因为我“假设”有比我更聪明的人提出了一种方法,可以将触摸委托/事件添加到avplayervewcontroller
中的控件中,甚至可以使用一个粗糙的脏标志来跟踪搜索栏
didPlayToEndTimeNotification = NSNotificationCenter.DefaultCenter.AddObserver(
AVPlayerItem.DidPlayToEndTimeNotification,
videoFinished,
_playerItem);
timeJumpedNotification = NSNotificationCenter.DefaultCenter.AddObserver(
AVPlayerItem.TimeJumpedNotification,
videoFinished,
_playerItem);
public void videoFinished(NSNotification notify){
if (notify.Name == AVPlayerItem.TimeJumpedNotification) {
Console.WriteLine ("{0} : {1}", _playerItem.Duration, _player.CurrentTime);
if (Math.Abs(_playerItem.Duration.Seconds - _player.CurrentTime.Seconds) < 0.001) {
Console.WriteLine ("Seek to end by user");
}
} else if (notify.Name == AVPlayerItem.DidPlayToEndTimeNotification) {
Console.WriteLine ("Normal finish");
} else {
// PlaybackStalledNotification, ItemFailedToPlayToEndTimeErrorKey, etc...
Console.WriteLine (notify.Name);
}
}