ios - AVAssetResourceLoaderDelegate 和 HLS 不起作用?

标签 ios http-live-streaming avasset avurlasset

对我来说,它不能在模拟器和真实设备(iPhone 5S)上使用“m3u8”url。 同时,Apple demo 运行良好,但我看不出有什么不同。 对于其他 url 扩展也可以(例如,url 末尾的“m3u9”)

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController, AVAssetResourceLoaderDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        // if I change m3u8 to different file extension, it's working good
        let url = NSURL(string: "cplp://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8") 

        let asset = AVURLAsset(URL: url!, options: nil)
        asset.resourceLoader.setDelegate(self, queue: dispatch_queue_create("AVARLDelegateDemo loader", nil))

        let item = AVPlayerItem(asset: asset)
        let player = AVPlayer(playerItem: item)
        player.play()
    }

    func resourceLoader(resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {

        NSLog("This method is never called in case of m3u8 url")

        return true
    }
}

最佳答案

好的,我已经找到了修复方法,但仍然不明白为什么它只发生在“m3u8”链接上。

需要保存强大的player 或至少item 引用。 谢谢 Apple 提供的文档。 :讽刺:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController, AVAssetResourceLoaderDelegate {
    var player: AVPlayer! // <-- the fix

    override func viewDidLoad() {
        super.viewDidLoad()

        // if I change m3u8 to different file extension, it's working good
        let url = NSURL(string: "cplp://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8") 

        let asset = AVURLAsset(URL: url!, options: nil)
        asset.resourceLoader.setDelegate(self, queue: dispatch_queue_create("AVARLDelegateDemo loader", nil))

        let item = AVPlayerItem(asset: asset)
        player = AVPlayer(playerItem: item) // <-- the fix
        player.play()
    }

    func resourceLoader(resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {

        NSLog("This method is never called in case of m3u8 url")

        return true
    }
}

关于ios - AVAssetResourceLoaderDelegate 和 HLS 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962564/

相关文章:

ios - CoreData & RestKit - 从多个来源获取相同的实体类型

ios - 事件应用程序缺少 iCloud 容器

ios - NSURLErrorDomain error -1 尝试下载 http Live Streaming Video 时

json - Swift 中的 CURL 到 URLRequest。 (MUX 直播 API)

ios - 来自 AVMetadataItem objective-c 的 ISRC 代码

ios - 如何循环一段轨道?

ios - 将数据发送到服务器/在后台重试请求的选项

java - Linux 服务器上的 HTTP 直播

ios - 在表格 View 中缓存视频

ios - 从图像数组创建视频并将其保存到相机胶卷