Обнаружение пропуска пользователя до конца видео AVPlayer

Я написал приложение Xamarin.Forms для iOS Page что пользователи AVPlayer для воспроизведения видео через пользовательский рендерер страниц.

Когда видео заканчивается, или когда пользователь переходит к концу видео (используя элементы управления, созданные AVPlayerViewController), они должны быть отправлены на следующий ContentPage в приложении.

Я могу отслеживать, когда видео "естественно" заканчивается, наблюдая за AVPlayerItem.DidPlayToEndTimeNotification на AVPlayerItem _playerItem, вот так:

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

Затем я помещаю новую страницу в стек навигации в VideoDidFinishPlayingи пользователь продолжает.

Однако это не работает, если пользователь прокручивает видео до конца, используя панель управления по умолчанию.

Как я могу определить, закончилось ли видео, когда пользователь удалил его до конца?

1 ответ

Решение

С использованием AVPlayerViewController и разрешение пользователю искать вручную до конца не сработает DidPlayToEndTimeNotification поскольку медиаактив на самом деле не играл до конца "нормально".

Вот что я сделал в похожем случае:

Добавить 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);
    }
}
Другие вопросы по тегам