Завершено из-за давления памяти при использовании iOS AVPlayer

В моем iOS-приложении я запускаю видео YouTube в виде цикла с помощью вспомогательной библиотеки YouTube для iOS. Но я не даю возможности воспроизвести видео во всю его длину, но через 20 секунд я снова ставлю в очередь то же видео, как показано ниже.

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state{

    if (state == kYTPlayerStateQueued) {
        startedTimer = NO;

        [self.playerView playVideo];      
    } else if (state == kYTPlayerStatePlaying) {

        if (!startedTimer) {
            startedTimer = YES;

            vidReplayTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(restartVideo) userInfo:nil repeats:NO];
        }
    } 
}

а также

- (void)restartVideo {
    [self.playerView cueVideoById:selectedYTVideoId startSeconds:0.1 suggestedQuality:kYTPlaybackQualityMedium];
}

Это работает отлично, как я хотел.

Затем я хотел воспроизвести файл mp4, прежде чем YouTube будет воспроизводить видео каждый раз. Для этого я использовал AVPlayer. Затем код изменился, как показано ниже.

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state{

    if (state == kYTPlayerStatePlaying) {
        if (self.avPlayer != nil) {
            avPlayerLayer.hidden = YES;
            self.avPlayer = nil;
        }

        if (!startedTimer) {
            startedTimer = YES;

            vidReplayTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(restartVideo) userInfo:nil repeats:NO];
        }
    } 
}

а также

- (void)restartVideo {
    self.avPlayer = [AVPlayer playerWithURL:introVideoFileURL];

    avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
    self.avPlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;

    avPlayerLayer.frame = CGRectMake(0, 0, 320, 330);
    [self.view.layer addSublayer: avPlayerLayer];

    [self.avPlayer play];

    [self.playerView cueVideoById:selectedYTVideoId startSeconds:0.1 suggestedQuality:kYTPlaybackQualityMedium];
}

После вышеуказанных изменений приложение запускается, как я ожидал, но почти через четыре минуты оно выдает всплывающее окно "Завершено из-за давления памяти" в моем XCode, и приложение вылетает. Я проверил память с помощью инструмента разработчика инструментов, и к моменту сбоя приложение использует около 35 МБ памяти. К тому времени, когда приложение начало работать, оно использует более 45 МБ памяти и работает без сбоев.

Как видите, я создаю AVPlayer только тогда, когда мне это нужно, и устанавливаю его равным nil сразу после завершения работы. В чем может быть причина этой проблемы и как я могу решить эту проблему?

1 ответ

Перемещение решения Bhavesh Lathigara в комментариях к ответу сообщества Wiki:

когда didReceiveMemoryWarning Вызывается, обнуляет все объекты, связанные с воспроизведением видео / аудио, и заново создает их при необходимости.

Другие вопросы по тегам