播放本地端 m3u8
發佈於 2022-07-13
2026-05-05 更新
AVPlayer 可以直接以 file:// URL 播放本地影片,但對於 .m3u8 playlist,它會在解析完 manifest 後,直接嘗試以原始路徑載入每一個 segment。這個過程完全繞過了 AVAssetResourceLoaderDelegate,導致無法攔截並自訂載入行為。
簡單說:file:// URL 太「正常」了,AVPlayer 自己就處理掉,不給你插手的機會。
Demo
解法:自訂 Scheme
AVAssetResourceLoaderDelegate 只對 AVPlayer 不認識的 scheme 生效。
做法是在建立 AVURLAsset 時,把 file:// 替換成自訂的 local://:
file:///var/mobile/.../video.m3u8
↓ 替換 scheme
local:///var/mobile/.../video.m3u8
AVPlayer 看到 local://,不知道怎麼處理,就把請求轉交給 AVAssetResourceLoaderDelegate。
關鍵
AVAssetResourceLoaderDelegate
1 2 3func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool { } func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool { }