iOS AVPlayer не может сделать паузу после перемотки назад / перемотки вперед - PullRequest
0 голосов
/ 10 марта 2020

Сценарий

  • Если AVPlayer воспроизводит видео, перемотайте на 15 секунд и продолжите воспроизведение.
  • Если AVPlayer приостановлен, перемотайте на 15 секунд и оставайтесь в состояние паузы.

выпуск

Я не могу приостановить видео после вызова seekToTime:.

Вопрос

Как приостановить проигрыватель после вызова seekToTime?

Я пробовал как [Avplayer pause], так и установить Avplayer.rate в 0. Ничто не останавливает видео после звонка seekToTime.

Мой код

@property (strong, nonatomic) AVPlayer *player;
.
.
.
@synthesize player
.
.
.
- (IBAction)rewind:(id)sender {
    NSLog(@"rewind called");

    int secToRewind = DEFAULT_REWIND_SEC;
    int time = CMTimeGetSeconds(player.currentTime) - secToRewind;
    CMTime newTime = CMTimeMakeWithSeconds(time, 1);
    CMTime tolerance = CMTimeMakeWithSeconds(1, 1);

    __weak __typeof__(self) weakSelf = self;
    int playerRate = player.rate;
    [player seekToTime:newTime toleranceBefore: tolerance toleranceAfter: tolerance completionHandler:^(BOOL finished) {

        NSLog(@"seekToTime called");

        __strong __typeof__(self) strongSelf = weakSelf;
        if (playerRate == 0) {
            [player pause];
        }

    }];


}

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Я нашел код, вызывающий автозапуск. К игроку был прикреплен наблюдатель. Всякий раз, когда элемент проигрывателя находится в AVPlayerItemStatusReadyToPlay, проигрыватель был настроен на воспроизведение этого элемента независимо от состояния воспроизведения / паузы.

Код с исправлениями

case AVPlayerItemStatusReadyToPlay: {

            if ([playButton isSelected]) {
                 [self.player play];
            }


        }
0 голосов
/ 10 марта 2020

Я предполагаю, что проблема в буферизации контента, так как вы возвращаетесь на X (предположительно 15 секунд) назад, это очень много, и для буферизации контента требуется немного времени.

Попробуйте следующий код ...

@property (strong, nonatomic) AVPlayer *player;
.
.
.
@synthesize player
.
.
.
- (IBAction)rewind:(id)sender {
    NSLog(@"rewind called");

    int secToRewind = DEFAULT_REWIND_SEC;
    int time = CMTimeGetSeconds(player.currentTime) - secToRewind;
    CMTime newTime = CMTimeMakeWithSeconds(time, 1);
    CMTime tolerance = CMTimeMakeWithSeconds(1, 1);

    __weak __typeof__(self) weakSelf = self;
    int playerRate = player.rate;
    [player seekToTime:newTime toleranceBefore: tolerance toleranceAfter: tolerance completionHandler:^(BOOL finished) {



        do {

          NSLog(@"Successful rewind");

         __strong __typeof__(self) strongSelf = weakSelf;
         if (playerRate == 0) {
             [player playAt:[player currentTime]];
         }

       } while (completed == true);

    }];


}
...