Прекращено из-за нехватки памяти при использовании 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, и приложение вылетает. Я проверил память с помощью инструмента разработчика Instruments, и к моменту сбоя приложение использует почти 35 МБ памяти. К тому времени, когда приложение начало работать, оно использует более 45 МБ памяти и работает без сбоев.

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


person AnujAroshA    schedule 30.07.2014    source источник
comment
удачи в этом? Я сталкиваюсь с той же проблемой   -  person Bhavesh Lathigara    schedule 14.08.2014
comment
Не совсем. Я изменил тип игрока. Теперь используйте MPMoviePlayerController вместо AVPlayer.   -  person AnujAroshA    schedule 14.08.2014
comment
@BhaveshLathigara, вы нашли какое-нибудь решение для этого?   -  person AnujAroshA    schedule 19.08.2014
comment
на самом деле я использую проигрыватель KXMovie для своего приложения, и через 10-15 минут он вылетает из-за нехватки памяти (получение предупреждения о памяти). но у меня нет решения прямо сейчас.   -  person Bhavesh Lathigara    schedule 19.08.2014
comment
Опубликована проблема на форуме разработчиков iOS с изменениями MPMoviePlayerController.   -  person AnujAroshA    schedule 19.08.2014
comment
Я нахожу решение своего кода, когда память оказывает давление на наш вызов -(void)didReceiveMemoryWarning, поэтому я обнуляю все объекты, влияющие на воспроизведение звука, и заново создаю объекты, когда это необходимо, так что теперь у меня все работает нормально   -  person Bhavesh Lathigara    schedule 20.08.2014
comment
Я делаю то же самое вместо того, чтобы снова создавать объект, возвращаюсь на главный экран. Итак, я установил nil для объектов в методе viewDidDisapear, а не внутри didReceiveMemoryWarning. Ваш способ тоже попробую. Большое спасибо за совет.   -  person AnujAroshA    schedule 21.08.2014
comment
добро пожаловать в любое время   -  person Bhavesh Lathigara    schedule 21.08.2014
comment
Сам имею эту проблему. Обнуление указателей на экземпляр YTPlayerView, но не освобождение памяти. На самом деле, он просто продолжает выделять память каждый раз, когда я снова открываю VC, в котором он содержится.   -  person Micrified    schedule 07.11.2015


Ответы (1)


Перенос решения Бхавеша Латигары в комментарии в ответ вики сообщества:

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

person Community    schedule 22.04.2016