Joe's Blog

iOS 開發筆記

播放本地端 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
3
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool { }

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

參考