首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVPlayerItem从来没有准备好玩

AVPlayerItem从来没有准备好玩
EN

Stack Overflow用户
提问于 2016-06-22 00:08:57
回答 1查看 3.4K关注 0票数 0

我使用单个视图启动了一个新项目,并将此代码添加到视图控制器中:

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *videoURL;
    videoURL = [NSURL URLWithString:@"https://s3.amazonaws.com/xxxxxx.mp4"];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];

    [playerItem addObserver:self
                      forKeyPath:@"status"
                         options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                         context:@"AVPlayerStatus"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {

    if (context == @"AVPlayerStatus") {
        NSLog(@"AVPlayerStatus changed");

        if ([object isKindOfClass:[AVPlayerItem class]] && [keyPath isEqualToString:@"status"]) {
            NSLog(@"Ready to play");
        }
        else if (((AVPlayerItem *)object).status == AVPlayerStatusFailed) {
            NSLog(@"Failed to Ready");
        }
        else if (((AVPlayerItem *)object).status == AVPlayerStatusUnknown) {
            NSLog(@"Not known");
        }
    }
}

产出如下:

代码语言:javascript
复制
2016-06-21 19:57:56.911 VideoTest[5740:1334235] AVPlayerStatus changed
2016-06-21 19:57:56.911 VideoTest[5740:1334235] Not known

为什么AVPlayerItem从来不加载?我怎么才能把它装上呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-22 03:30:17

这是一个远程资产(它就在广阔的互联网上)。在您尝试使用它之前,它没有任何意义;此时,我们开始加载资产并探索其性质。你还没有试着玩它,所以它的状态只是处于未知的位置。

为什么AVPlayerItem从来不加载?我怎么才能把它装上呢?

您可以通过播放资产来加载项目。

您的代码在以下三个方面存在缺陷:

  • 您的第一个条件永远不会测试状态是否为ReadyToPlay;
  • 你从来没试过玩这个游戏。
  • 你用错了context

我用您的代码进行了测试,但像这样进行了编辑,以修复所有这三种情况:

代码语言:javascript
复制
@interface ViewController ()
@property AVPlayer* player;
@end

@implementation ViewController

- (IBAction)doLoad:(id)sender {
    NSURL *videoURL;

    videoURL = [NSURL URLWithString:@"https://s3.amazonaws.com/lookvideos.mp4/t/05093dabec6c9448f7058a4a08f998155b03cc41.mp4"];
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:nil];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];

    [playerItem addObserver:self
                 forKeyPath:@"status"
                    options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                    context:nil];


    self.player = [[AVPlayer alloc] initWithPlayerItem:playerItem];
    [self.player play];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                        change:(NSDictionary *)change context:(void *)context {

    NSLog(@"AVPlayerStatus changed");

    if (((AVPlayerItem *)object).status == AVPlayerStatusReadyToPlay) {
        NSLog(@"Ready to play");
    }
    else if (((AVPlayerItem *)object).status == AVPlayerStatusFailed) {
        NSLog(@"Failed to Ready");
    }
    else if (((AVPlayerItem *)object).status == AVPlayerStatusUnknown) {
        NSLog(@"Not known");
    }
}

@end

起初,我在控制台中看到“未知”,但一旦我尝试播放该资产,它就会更改为“准备播放”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37956551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档