AVQueuePlayer流状态?

时间:2011-04-03 13:48:46

标签: iphone objective-c

我是Obj-C和iOS开发的新手,我在这里找到了非常有用的信息,但这是一个我没有找到答案的问题。

我得到AVQueuePlayer的实例,它从网址播放音频流。

我怎么知道音频流已加载?例如,当我按下“播放”按钮时,按下按钮和实际开始流式传输之间会有几秒钟的延迟。 我查看了developer.apple.com库,但没有找到任何可用于检查AVQueuePlayer状态的方法。 AVPLayer中有一个,但就我所知,AVPlayer不支持http流。

谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定“装”是什么意思:你的意思是当物品满载或者物品准备好玩的时候?

AVQueuePlayer支持http流(HTTP Live和文件),方式与AVPlayer相同。您应该查看AVFoundation Programming Guide, Handling Different Types of Asset

最常见的情况是当一个项目准备好发挥时,我会回答那个。如果您使用的是AVQueuePlayer< 4.3,您需要通过观察AVPlayerItem状态密钥的值来检查AVPlayerItem的状态:

static int LoadingItemContext = 1;

- (void)loadExampleItem
{
    NSURL *remoteURL = [NSURL URLWithString:@"http://media.example.com/file.mp3"];
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:remoteURL];
    // insert the new item at the end
    if (item) {
        [self registerAVItemObserver:item];
        if ([self.player canInsertItem:item afterItem:nil]) {
            [self.player insertItem:item afterItem:nil];
            // now observe item.status for when it is ready to play
        }
    }
}

- (void)registerAVItemObserver:(AVPlayerItem *)playerItem
{
  [playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:(void*)&LoadingItemContext];
}

- (void)removeAVItemObserver:(AVPlayerItem *)playerItem
{
  @try {
    [playerItem removeObserver:self forKeyPath:@"status"];
  }
  @catch (...) { }
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == &LoadingItemContext) {
        AVPlayerItem *item = (AVPlayerItem*)object;
        AVPlayerItemStatus status = item.status;
        if (status == AVPlayerItemStatusReadyToPlay) {
            // now you know you can set your player to play, update your UI...
        }   else if (status == AVPlayerItemStatusFailed) {
            // handle error here, i.e., skip to next item
        }
    }   
}

这只是一个4.3之前的例子。 4.3之后,您可以使用AVFoundation Programming Guide, Preparing an Asset For Use中的代码示例loadValuesAsynchronouslyForKeys:completionHandler加载远程文件(或HTTP Live播放列表)。如果您使用loadValuesAsynchronouslyForKeys作为HTTP Live流,您应该观察@“track”属性。