【问题标题】:Can’t observe AVPlayerItem for @“status” key无法观察 @“status”键的 AVPlayerItem
【发布时间】:2014-03-05 02:40:17
【问题描述】:

我正在尝试从 URL 播放流,但这里有一个问题。 ObserveValueForKeyPath:ofObject:change:context 只是不执行。据我了解,它不依赖于streamURL,它是否正确。它必须将状态从 AVPlayerItemStatusUnknown 更改为 AVPlayerItemStatusReadyToPlay 或 AVPlayerItemStatusFailed。但尽管如此,我在浏览器中检查了该 URL,它工作正常。所以有什么问题?我看过关于它的 WWDC 视频,它说,如果你有音频流,请使用 AVPLayerItem before AVAsset。

这是我的代码:

- (void) prepare
{
    NSURL * trackStreamURL = [NSURL URLWithString:streamURL];
    NSLog(@"STREAM URL: %@",trackStreamURL);
    _playerItem = [AVPlayerItem playerItemWithURL:trackStreamURL];
    [_playerItem addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"KEY PATH    : %@", keyPath);
    NSLog(@"CHANGE      : %@", change);
}

提前致谢!

【问题讨论】:

    标签: ios objective-c avfoundation


    【解决方案1】:

    我一直在AVPlayer 上观察status 属性,而不是AVPlayerItem,因为无论如何你都需要一个玩家来播放玩家物品。事实上,我什至从未看过播放器项目的状态属性。

    播放器项目的状态可能永远不会改变,因为没有准备好播放它的播放器。因此,使用播放器项目创建一个播放器并观察播放器的状态(或者可能仍然是播放器项目的状态)。

    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    

    【讨论】:

    • 我关注了 wwdc 视频,它说我可以观察 playerItem 属性。苹果文档也这么说。但是您的解决方案有效。谢谢。
    • 播放器物品具有状态属性是对的,但我一直在观察播放器的状态。我将编辑我的答案以反映这一点。
    • 视频中说,但也说您应该在等待状态更改之前添加播放器。如上所述,设置播放器将开始加载过程。
    • 我也面临同样的问题。我正在尝试在离线模式下播放 HLS 包。我已经为 playerItem 和玩家状态设置了观察者,但没有调用观察者。你能为此提出一些建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多