Обнаружение пропуска пользователя до конца видео 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);
}
}