13

Вопрос по avplayer, ios, objective-c – AVPlayer падает после нескольких воспроизведений

Я пытаюсь создать приложение, которое воспроизводит видео из файла, используяAVFoundation, Видео отображаются в виде, доступ к которому осуществляется нажатием на строку в родительском табличном представлении. Реальное приложение будет иметь видео для каждой строки, но на данный момент я использую только одно для тестирования.

При запуске на симуляторе приложение в порядке, но при запуске на устройстве (под ios 5.1) видео воспроизводится нормально около 5 раз, а затем непредсказуемо вылетает различными способами. Обычно просмотр видео загружается, но само видео не воспроизводится, но иногда Я получаюEXC_BAD_ACCESS наcoremedia.remote поток, жалующийся на объекты, размещенные без пула автоматического выпуска. Я добавил@autoreleasepool блокировать перенос кода, запускающего AVPlayer, но это, похоже, не помогает.

Мне интересно, происходит ли то, что GCD создает несколько потоков в основной очереди для воспроизведения элементов, но они не завершаются.

Итак, ключевой вопрос - как очистить лишние потоки GCD, на которых работает AVPlayer если пользователь нажимает кнопку назад в просмотре видео Насколько это возможно, я следовал примеру кода, предоставленному Apple.AVFoundation документацияВот Я добавил некоторые записи и (как упоминалось выше)@autoreleasepool блок внутри одного из блоков GCD, кроме того, что я не изменил код.

viewDidLoad Метод заключается в следующем:

-(void)viewDidLoad{   
[super viewDidLoad];

NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"TestLapCar2Vid" withExtension:@"m4v"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
NSString *tracksKey = @"tracks";

[asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
 ^{
     dispatch_async(dispatch_get_main_queue(),
     ^{
         @autoreleasepool {
         NSError *error = nil;
             AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];

             if(status == AVKeyValueStatusLoaded){
                 avPlayerItem = [AVPlayerItem playerItemWithAsset:asset];
                 [avPlayerItem addObserver:self forKeyPath:@"status"
                                   options:0  context:&ItemStatusContext];

                 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerItemDidReachEnd:)
                                                             name:AVPlayerItemDidPlayToEndTimeNotification object:avPlayerItem];

                 avPlayer = [AVPlayer playerWithPlayerItem:avPlayerItem];
                 [videoView setPlayer:avPlayer];
                 NSLog(@"Asset loaded");
                 [avPlayer play];
             }
             else{
                 NSLog(@"The asset's tracks were not loaded");
             }

         }
     });
 }];    

}

viewWillDisappear метод это:

-(void)viewWillDisappear:(BOOL)animated{
NSLog(@"view will disappear called");
[super viewWillDisappear:animated];
dispatch_async(dispatch_get_main_queue(), 
    ^{
        [avPlayer pause];
        [avPlayerItem removeObserver:self forKeyPath:@"status"];
        [[NSNotificationCenter defaultCenter]removeObserver:self];
        NSLog(@"Race timeline nav controller has %d sub controllers",self.navigationController.childViewControllers.count);
        avPlayerItem = nil;
        avPlayer = nil;
        videoView = nil;
        dataStore = nil;
        pkReader = nil;
        receivedData = nil;
        revDial = nil;
        speedDial = nil;
        mapView = nil;
        throttle = nil;
        NSLog(@"releasing stuff");
    });

}

Я боролся с этим на протяжении большей части сегодняшнего дня - любая помощь будет принята с благодарностью

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededviewDidLoadError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Спасибо за вопрос!

    от headkit
  • 15

    Сначала вы должны удалить из superview

    так как это уменьшит количество сохранений на 1, а ARC позаботится о выпуске вашего кода.

    как это

    [videoView removeFromSuperview];
    [self setVideoView:nil];
    

  • 5

    Может быть

    вы оставите свое видео в сохраненном виде в каком-то месте? Потому что если вы это сделаете, ваши avPlayerItem и avPlayer остаются в живых и в соответствии сэтот тема, к которой вы пришли из-за ограничения iOS для «рендеринга конвейера» с 4 видео, оставаясь в памяти.

    Помните, что установка var в nil на самом деле не освобождает базовый объект. Так что ваши

    videoView = nil;
    

    может иметь нулевой эффект.