AVPlayer 没有从本地文件播放 m3u8
Posted
技术标签:
【中文标题】AVPlayer 没有从本地文件播放 m3u8【英文标题】:AVPlayer not playing m3u8 from local file 【发布时间】:2017-04-27 23:50:51 【问题描述】:我正在尝试让 AVPlayer 播放本地文件的 m3u8 播放列表。
我使用 Apple 的一个示例播放列表将其缩小为一个简单的测试用例:
https://tungsten.aaplimg.com/VOD/bipbop_adv_fmp4_example/master.m3u8
如果我从远程 url 播放这个播放列表,AVPlayer 播放得很好。但是,如果我将此播放列表下载到本地文件,然后将本地文件 URL 交给 AVPlayer,AVPlayer 将不会播放它。它只显示划掉的播放符号。
有趣的是,这也可以用 Safari 复制。 Safari 将播放远程播放列表,但不播放本地文件。另外值得注意的是,AVPlayer 的这种行为在 ios 10.2 和 macOS 10.12.1 上是相同的。此外,直接播放 mp4 媒体文件(不包含在播放列表中)似乎没有这个问题,因为它既可以从远程 URL 播放,也可以从本地文件播放。
检查 AVPlayerItem.error 也不会产生任何有用的信息:
An unknown error occurred (-12865)
The operation could not be completed
有人知道 AVPlayer 不能播放本地播放列表的任何限制吗?
谢谢。
【问题讨论】:
【参考方案1】:m3u/m3u8 文件必须存储在服务器上并流式传输才能播放(我知道这听起来不合理,但 Apple 又这样做了)。您必须使用HLS,这基本上意味着您应该将文件存储在服务器上并从那里直接访问它。您也可以使用 GCD WebServer 之类的框架在您的应用中创建本地服务器。
【讨论】:
【参考方案2】:从 iOS 10 开始,您可以使用 AVAssetDownloadURLSession 下载 HLS 流。这将产生一个可以离线播放的本地资产路径。
如果您尝试在应用程序包中嵌入视频,最好只创建 MP4。
【讨论】:
如何创建m3u8转mp4?以上是关于AVPlayer 没有从本地文件播放 m3u8的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 GCDWebServer 在 iOS 上播放本地 M3u8 文件
本地文件使用 AVAudioPlayer 播放,但不使用 AVPlayer?
m3u8 音频流在 MPMoviePlayerController 中播放但不是 AVPlayer?
在 android 上播放本地 m3u8 文件,显示 setDataSourceFD 失败。:状态 = 0x80000000