如何正确处理AVPlayer HTTP错误?

问题描述 投票:0回答:1

当请求从Web服务器播放mp3文件时,如果该服务器返回403禁止,则在检查AVPlayer当前项错误时不清楚如何处理错误。

来自AVPlayer的错误消息并不表示它是403 ...

2019-01-05 13:08:33.908316-0500 Runner [84043:3269818]可选(错误域= AVFoundationErrorDomain代码= -11828“无法打开”UserInfo = {NSLocalizedFailureReason =不支持此媒体格式。,NSLocalizedDescription =无法打开, NSUnderlyingError = 0x600000781290 {错误域= NSOSStatusErrorDomain代码= -12847“(null)”}})

错误说媒体不受支持,但媒体从未到过。反正有没有看到AVPlayer请求的HTTP错误代码?

在Android上测试同一个文件时,我能够正确地看到来自Android原生MediaPlayer的403错误代码(来自Android的错误比iOS的AVPlayer更好,更有用)。

缺少正确的错误消息传递使得向用户正常显示准确错误非常困难。

任意代码示例:

    let url = URL(string: "some 403 server url")
    let playerItem:AVPlayerItem = AVPlayerItem(url: url!)
    player = AVPlayer(playerItem: playerItem)
    player.play()

检查错误将打印上面引用的消息。

NSLog("\(String(describing: player.currentItem?.error))")
ios swift avplayer
1个回答
1
投票

这是一个可能的解决方案,而不是用url初始化AVPlayerItem

你可以尝试这种方法

  1. 使用AVURLAsset并设置AVAssetResourceLoaderDelegate
  2. 使用委托方法func resourceLoader(_ resourceLoader:AVAssetResourceLoader, didCancel authenticationChallenge: URLAuthenticationChallenge)
  3. 继续创建播放器并播放音频,委托方法会在出现403错误时通知您。

这是示例代码

class ResourceLoadingDelegate:NSObject, AVAssetResourceLoaderDelegate {
      func resourceLoader(_ resourceLoader: AVAssetResourceLoader,
                    didCancel authenticationChallenge:  URLAuthenticationChallenge) {
    /// handle the authentication challenge
    print(authenticationChallenge.error.debugDescription)
   }
}

   let asset = AVURLAsset(url: URL(string: "some 403 url")!)

   asset.resourceLoader.setDelegate(ResourceLoadingDelegate(), queue:  DispatchQueue.global(qos: .userInitiated))
© www.soinside.com 2019 - 2024. All rights reserved.