【问题标题】:AVPlayer play video multiple times(10-15) getting play icon with cross lineAVPlayer 多次播放视频(10-15)得到带有十字线的播放图标
【发布时间】:2016-10-20 09:30:14
【问题描述】:

我正在开发基于电子书阅读器的应用程序,其中包含多个 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];

});

【问题讨论】:

  • 你为什么要dispatch_after
  • 我需要一些延迟来显示视频播放器。我一次又一次地尝试不派送,我也面临同样的问题。
  • 你叫它form viewDidLoad吗?
  • 为“status”添加一个观察者,并在播放失败时检查你得到的状态。
  • @abhi1992,是的,我为“状态”添加了观察者,并收到错误消息为 AVFoundationErrorDomainCode=11839“无法解码”。

标签: ios objective-c avplayer avplayerviewcontroller


【解决方案1】:
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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 2016-10-02
    相关资源
    最近更新 更多