2016-10-20 7 views
1

Я разрабатываю приложение для чтения электронных книг с книгой PDF, состоящей из нескольких страниц PDF. На каждой странице есть значок видео для воспроизведения видеоизображений. Я использовал AVPlayer для воспроизведения видео, используя AVPlayerItem и AVURLAsset (поток от URL). Он работает отлично в 10-15 раз от воспроизведения одного и того же или другого видео с той же страницы или другой страницы. Но через некоторое время видео не воспроизводится, а показывает значок воспроизведения с перекрестной линией.AVPlayer воспроизводит видео несколько раз (10-15) Получение значка воспроизведения с перекрестной линией

Я использовал приведенный ниже код.

NSURL *videoUrl = [NSURL URLWithString:@"http://WWW.google.com/media/test_1.mp4"] 
    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; 

NSDictionary *optionsDic = @{AVURLAssetHTTPCookiesKey : cookies}; 

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoUrl options:optionsDic]; 

AVPlayerItem *playeritem = [AVPlayerItem playerItemWithAsset:asset]; 

AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:playeritem]; 

AVPlayerViewController *moviePlayerVC = [[AVPlayerViewController alloc]init]; 

moviePlayerVC.player = player; 


dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 

    [self presentViewController:moviePlayerVC animated:NO completion:nil]; 

}); 
+0

почему вы делаете 'dispatch_after'? –

+0

Мне нужна задержка для представления видеопроигрывателя. Я попытался с отправкой после и снова также я столкнулся с той же проблемой. –

+0

Вы называете это формой viewDidLoad? –

ответ

2
Finally from the Apple AVPlayerDemo sample code I have found the code changes required. And replaced this code with the existing and its worked for me. 


@interface VideoViewController : UIViewController { 

    AVPlayerViewController *playerVC; 
    AVPlayer* mPlayer; 
    AVPlayerItem * mPlayerItem; 
} 
@property (strong) AVPlayerItem* mPlayerItem; 
@property (readwrite, strong, setter=setPlayer:, getter=player) AVPlayer* mPlayer; 
@end 

@implementation VideoViewController 
@synthesize mPlayer,mPlayerItem; 


-(void)viewDidLoad{ 
    playerVC = [[AVPlayerViewController alloc]init]; 
} 


- (void)presentVideoViewController:(NSURL*)linkUrl{ 


    NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; 

    NSDictionary *optionsDic = @{AVURLAssetHTTPCookiesKey : cookies}; 

    AVURLAsset * asset = [AVURLAsset URLAssetWithURL:linkUrl options:optionsDic]; 

    NSArray *requestedKeys = @[@"playable"]; 

    [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler: 
    ^{ 
     dispatch_async(dispatch_get_main_queue(), 
         ^{ 

          for (NSString *thisKey in requestedKeys) 
          { 
           NSError *error = nil; 
           AVKeyValueStatus keyStatus = [asset statusOfValueForKey:thisKey error:&error]; 
           if (keyStatus == AVKeyValueStatusFailed) 
           { 
            //Show failed error message without presenting AVPlayerViewController// 
            return; 
           } 

          } 


          if (!asset.playable) 
          { 
           //Show failed error message without presenting AVPlayerViewController// 
           return; 
          } 
          if (self.mPlayerItem) 
          { 

           [self.mPlayerItem removeObserver:self forKeyPath:@"status"]; 

          } 
          [self.mPlayerItem addObserver:self 
               forKeyPath:@"status" 
                options:0 
                context:nil]; 


          if (!self.mPlayer) 
          { 

           [self setPlayer:[AVPlayer playerWithPlayerItem:self.mPlayerItem]]; 

          } 

          if (self.player.currentItem != self.mPlayerItem) 
          { 
           [self.mPlayer replaceCurrentItemWithPlayerItem:self.mPlayerItem]; 

          } 


          playerVC.player = self.mPlayer; 
          [self presentViewController:playerVC animated:NO completion:nil]; 
         }); 
    }]; 


} 

- (void)dealloc{ 

if (mPlayer) { 
     [mPlayer.currentItem removeObserver:self forKeyPath:@"status"]; 
     [self.mPlayer pause]; 

     self.mPlayer = nil; 
     self.mPlayerItem = nil; 
     playerVC = nil; 
    } 


} 

связанные Issue ссылки ссылки:

AVPlayerItem fails with AVStatusFailed and error code "Cannot Decode" Error Domain=AVFoundationErrorDomain Code=-11821 "Cannot Decode"