菜鸟教程小白 发表于 2022-12-11 16:47:40

ios - AVAssetResourceLoaderDelegate 和 HLS 不起作用?


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

<pre><code>import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController, AVAssetResourceLoaderDelegate {

    override func viewDidLoad() {
      super.viewDidLoad()

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

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

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

    func resourceLoader(resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -&gt; Bool {

      NSLog(&#34;This method is never called in case of m3u8 url&#34;)

      return true
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好的,我找到了解决方法,但仍然不明白为什么它只发生在“m3u8”链接上。</p>

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

<pre><code>import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController, AVAssetResourceLoaderDelegate {
    var player: AVPlayer! // &lt;-- the fix

    override func viewDidLoad() {
      super.viewDidLoad()

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

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

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

    func resourceLoader(resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -&gt; Bool {

      NSLog(&#34;This method is never called in case of m3u8 url&#34;)

      return true
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - AVAssetResourceLoaderDelegate 和 HLS 不起作用?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37962564/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37962564/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - AVAssetResourceLoaderDelegate 和 HLS 不起作用?