AVPlayer多次播放视频(10-15)获取带有交叉线的播放图标

时间:2016-10-20 09:30:14

标签: ios objective-c avplayer avplayerviewcontroller

我正在开发基于电子书阅读器的应用程序,PDF书籍包含多个PDF页面。每个页面都有视频图标来播放视频资源。我使用AVPlayer使用AVPlayerItemAVURLAsset(来自URL的流)播放视频。它可以在相同页面或不同页面播放相同或不同视频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];

});

1 个答案:

答案 0 :(得分: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;
    }


}  

发布相关参考链接:

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