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

时间:2016-01-26 15:07:37

标签: c# ios xamarin avplayer xamarin-forms

我已经编写了一个Xamarin.Forms iOS应用Page,用户AVPlayer可以通过自定义页面渲染器播放视频。

视频播放完毕后,或当用户使用“AVPlayerViewController创建的控件”进行视频播放时,应将其发送到应用中的下一个ContentPage

我可以追踪视频“自然而然”的情况。通过观察AVPlayerItem.DidPlayToEndTimeNotification上的AVPlayerItem _playerItem来完成,如下所示:

    videoEndNotificationToken = NSNotificationCenter.DefaultCenter.AddObserver(
        AVPlayerItem.DidPlayToEndTimeNotification,
        VideoDidFinishPlaying,
        _playerItem);

然后我在VideoDidFinishPlaying中的导航堆栈上推送一个新页面,然后用户继续。

但是,如果用户使用默认控制栏擦洗到视频的末尾,则此功能无效。

我如何检测视频是否通过用户擦除到最后完成?

1 个答案:

答案 0 :(得分:3)

使用AVPlayerViewController并允许用户手动搜索结尾不会触发DidPlayToEndTimeNotification,因为媒体资产实际上并未实际播放到最后#39;通常情况下。

以下是我在类似案例中所做的事情:

添加TimeJumpedNotification

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);
    }
}