AVPlayer 状态 AVPlayerStatusFailed 无法正常工作

Posted

技术标签:

【中文标题】AVPlayer 状态 AVPlayerStatusFailed 无法正常工作【英文标题】:AVPlayer status AVPlayerStatusFailed not working Properly 【发布时间】:2015-09-08 12:13:38 【问题描述】:

我正在实现 AVPlayer(不是 AVAudioPlayer)并尝试从 URL 播放音频。它工作正常。但正如我们所知,有时我们可能会有无效的 URL(没有音频字节的 URL)。 当我从任何 URL 播放音频时,AVPlayer 状态总是显示 AVPlayerStatusReadyToPlay,这是错误的。例如:在 URL 部分,如果提供无效 URL,例如:http://soundx.mp3slash.net/indian/jhankar_beats/1%28mp3pk.com%29.mp3(即使在您的浏览器中也不起作用),即使您提供 https://***.com/questions/ask 或任何网站URL(没有音频字节),AVPlayer 总是显示 AVPlayerStatusReadyToPlay。 我认为在这种情况下它的状态必须是 AVPlayerItemStatusUnknown 或 AVPlayerStatusFailed 请帮助,如何知道 URL 无效(AVPlayerItemStatusUnknown 或 AVPlayerStatusFailed)表明我可以向用户显示消息。 提前致谢

-(void)playButtonClicked

        NSURL *url = [NSURL URLWithString:AUDIO_URL];
        [self.audiosliderBar setMinimumValue:AUDIO_SLIDER_BAR_0];
        playerItem = [AVPlayerItem playerItemWithURL:url];
        player = [AVPlayer playerWithPlayerItem:playerItem];
        player.volume=5.0;


        [player addObserver:self forKeyPath:STATUS options:0 context:nil];

        [playerItem addObserver:self forKeyPath:PLAY_BACK_BUFFER_EMPTY options:NSKeyValueObservingOptionNew context:nil];
        [playerItem addObserver:self forKeyPath:PLAY_BACK_LIKELY_TO_KEEP_UP options:NSKeyValueObservingOptionNew context:nil];

        addObserverFlag=YES;

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

    if (object == player && [keyPath isEqualToString:STATUS])
    
        if (player.status == AVPlayerStatusFailed)
        

          [ViewUtilities showAlert:AUDIO_PLAYER :AUDIO_PLAYER_FAILED_MESSAGE];

        

        else if (player.status == AVPlayerStatusReadyToPlay)
        

            else if (player.status == AVPlayerItemStatusUnknown)
        
            [ViewUtilities showAlert:AUDIO_PLAYER :AUDIO_PLAYER_UNKNOWN];

        

        if (!player)
        
            return;
        
    
`

【问题讨论】:

你没有显示你在用 AVPlayer 做什么。 AVPlayer 在您开始播放之前不会检查任何内容,或者例如使用 preroll。 @gnasher729 ,我已经更新了我的代码,请看一下。 【参考方案1】:

AVPlayer Doc 状态

status 属性的可能值,表示是否可以成功播放items

AVPlayerStatusReadyToPlay 表示播放器已准备好播放 AVPlayerItem 实例。

所以我认为您需要通过AVPlayerItemStatus 类型的状态属性检查特定项目的状态

【讨论】:

谢谢@Yurii,你是英雄。我在错误的对象(player)上添加了观察者,它应该在 playerItem 上(在我上面的代码中)。添加到观察者 playerItem 而不是 player 后,它就像一个魅力。谢谢 请将此答案标记为分辨率。如果你想知道,我自 2011 年以来第一次阅读了关于 AVPlayer 的文档。 @ Yurii,从我这边完成(作为解决方案的答案),谢谢

以上是关于AVPlayer 状态 AVPlayerStatusFailed 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

AVPlayer状态?

swift中的AVPlayer状态监听器

处于暂停状态时如何强制 AVPlayer 暂停缓冲?

AVPlayer 处于 ReadyToPlay 状态但无法开始播放

AVPlayer 空白视频:播放声音但没有视频

AVPlayer 永远无法播放