本地文件的 AVPlayerStatus 未准备好

Posted

技术标签:

【中文标题】本地文件的 AVPlayerStatus 未准备好【英文标题】:AVPlayerStatus for local file not ready 【发布时间】:2012-05-16 11:28:28 【问题描述】:

我在播放本地 .wav 文件时遇到了一些问题。我的AVPlayerStatus 正在打印0,我假设这意味着它还没有准备好播放。我似乎无法弄清楚,但话虽如此,这是我第一次尝试使用与 AVPlayer 相关的任何东西,所以它可能很简单。我会很感激任何帮助。代码如下:

我应该补充一点,我的声音没有播放!

-(void) playWordSound:(UILabel *)label

    NSString *path;
    switch (label.tag)
    
        case 1:
            path = [[NSBundle mainBundle] pathForResource:@"humpty" ofType:@"wav"];
            break;
        case 2:
            path = [[NSBundle mainBundle] pathForResource:@"dumpty" ofType:@"wav"];
            break;
        case 3:
            path = [[NSBundle mainBundle] pathForResource:@"saty" ofType:@"wav"];
            break;
        case 4:
            path = [[NSBundle mainBundle] pathForResource:@"on 2" ofType:@"wav"];
            break;
        case 5:
            path = [[NSBundle mainBundle] pathForResource:@"a 3" ofType:@"wav"];
            break;
        case 6:
            path = [[NSBundle mainBundle] pathForResource:@"wall" ofType:@"wav"];
            break;
    
    NSURL *url = [NSURL fileURLWithPath:path];
    AVQueuePlayer *player;
    static const NSString *ItemStatusContext;
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
    [playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
    player = [AVPlayer playerWithPlayerItem:playerItem];

    NSLog(@"%d",player.status);
    [player play];


- (void)playerItemDidReachEnd:(NSNotification *)notification 
    NSLog(@"Sound finished");

【问题讨论】:

【参考方案1】:

以下是 Apple 在使用 AVPlayItem -initWithURL: 方法时指出的一些重要问题:

特殊注意事项

此方法立即返回项目,但 状态为 AVPlayerItemStatusUnknown。

如果 URL 包含播放器项目可以使用的有效数据, 状态稍后更改为 AVPlayerItemStatusReadyToPlay。

如果 URL 不包含有效数据或不能被 播放器项目,状态稍后更改为 AVPlayerItemStatusFailed。

我想正在发生的事情是,因为您在创建 AVPlayerItem 对象后不久就发送了 -play 消息,它的状态仍然是 AVPlayerItemStatusUnknown(对于 AVPlayer 对象也是如此),因为它没有收到足够的是时候加载资源并将状态更改为AVPlayerItemStatusReadyToPlay

我的建议:

要么检查 AVPlayerItem/AVPlayer 状态变化,然后在稍后阶段调用-play

或者,甚至更简单,

从 NSURL 加载 AVAsset 或 AVURLAsset 对象并使用 AVPlayerItem –initWithAsset: 方法,该方法应返回一个准备好播放的对象,然后您立即调用 call -play,如果您愿意,请.

【讨论】:

初始化为 AVAsset 修复了它!非常感谢您的帮助!【参考方案2】:

0 等同于AVPlayerStatusUnknown,我认为这是因为播放器在您实际调用play 之前不会尝试加载 URL。

来自documentation:

AVPlayerStatusUnknown

表示播放器的状态未知,因为它没有尝试加载新的媒体资源进行播放。

【讨论】:

我切换了代码,以便在 player.status 之前调用 [player play] 并且它仍在输出 0。我应该在我原来的帖子的某处用粗体提到真正的问题是声音没有播放!

以上是关于本地文件的 AVPlayerStatus 未准备好的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer状态?

SoundPool 正在加载声音,但每次我播放它时都会显示“样本___ 未准备好”?

ICDevice 未准备好

以下简单查询未完成。准备好的声明

Soundpool.builder 样本未准备好

PhoneGap/Cordova 设备未准备好