Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测用户跳过AVPlayer视频的结尾_C#_Ios_Xamarin_Avplayer_Xamarin Forms - Fatal编程技术网

C# 检测用户跳过AVPlayer视频的结尾

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

我已经编写了一个Xamarin.Forms iOS应用程序
页面
,用户可以使用
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);
    }
}