在处理代码中的错误时,及时获取有关问题的信息是一种好的实践,因此让我们制作下一个错误处理程序:
class ErrorObserver: NSObject {
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
guard let player = object as? AVPlayer, let error = player.currentItem?.error, let keyPath = keyPath else {
return
}
print("Key:", keyPath)
print("Error:", error)
}
}
let errorObserver = ErrorObserver()
...
player.addObserver(errorObserver, forKeyPath: #keyPath(AVPlayer.currentItem.status), options:[.new], context: nil)
如果您运行代码,它会产生以下错误:
Key: currentItem.status
Error: Error Domain=AVFoundationErrorDomain Code=-11850 "Operation Stopped" UserInfo={NSLocalizedFailureReason=The server is not correctly configured., NSLocalizedDescription=Operation Stopped, NSUnderlyingError=0x600003bbc060 {Error Domain=NSOSStatusErrorDomain Code=-12939 "(null)"}}
"服务器配置不正确"通常与服务器端支持范围下载有关,因为播放来自互联网的媒体需要支持按范围下载。请使用
curl
检查此问题:
$ curl -I https://ipfs.moralis.io:2053/ipfs/QmUjWnQZVVNmTSVak2QDhTxMkn3dPQozxawa1sm3jE5bLr
HTTP/2 200
date: Fri, 05 Aug 2022 09:48:23 GMT
content-type: video/mp4
content-length: 4835525
cf-ray: 735e9de8d95c9290-FRA
accept-ranges: bytes
...
从响应中可以看出,服务器支持范围——“accept-ranges: bytes”。
让我们检查部分请求:
$ curl https://ipfs.moralis.io:2053/ipfs/QmUjWnQZVVNmTSVak2QDhTxMkn3dPQozxawa1sm3jE5bLr -i -H "Range: bytes=0-1023"
HTTP/2 200
date: Fri, 05 Aug 2022 09:50:05 GMT
content-type: video/mp4
content-length: 4835525
cf-ray: 735ea066cfd61649-MUC
accept-ranges: bytes
...
服务器的响应包括
HTTP/2 200
和全部内容长度,但是响应应该像这样:
HTTP/2 206 Partial Content
Accept-Ranges: bytes
Server: UploadServer
Aka-c-hit: cache-hit
Content-Range: bytes 0-1023/253755577
Content-Length: 1024
Connection: keep-alive
Content-Type: video/mp4
...
如果您的服务器不支持HTTP范围请求,AVPlayer将无法播放您的mp4视频。
您可以通过以下两种方式解决此问题:
- 更改服务器设置以支持HTTP范围请求。
- 编程下载视频并将其保存到本地文件中,然后可以从文件URL播放它。