Hls 流 url 不会在 AVPlayer 中播放
Posted
技术标签:
【中文标题】Hls 流 url 不会在 AVPlayer 中播放【英文标题】:Hls stream url wont play in AVPlayer 【发布时间】:2020-02-29 02:39:55 【问题描述】:我正在尝试从如下所示的网址播放 hls 直播流:“http://ip.address:port/my%20video.m3u8”。只要 url 不涉及任何空格,视频就会正常播放,否则不会播放。播放器没有记录错误,但播放器本身只是黑屏。我启用了“允许任意负载”,但仍然没有骰子。当我尝试在 Safari 中加载带有空格的网址时,视频将播放。这是我加载和播放视频的代码:
DispatchQueue.main.async
var player = AVPlayer(url: url!)
var playerLayer: AVPlayerLayer!
playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = .resize
self.videoView.layer.addSublayer(playerLayer)
playerLayer.frame = self.videoView.bounds
player.play()
我还觉得奇怪的是,当我尝试将流发送到 AVPlayerViewController 时,播放器会弹出但不播放。这是我将它发送到视图控制器的方式:
DispatchQueue.main.async
let player = AVPlayer(url: urlTwo)
let playerController = AVPlayerViewController()
playerController.player = player
present(playerController, animated: true)
player.play()
【问题讨论】:
您是否尝试将player
和playerLayer
保存为实例属性?如果你不保存它们,它们通常会在块结束时被销毁(在你调用player.play()
之后)。
我该怎么做?
用新发现更新了问题。
请阅读有关 ARC 的内容,例如:raywenderlich.com/966538-arc-and-memory-management-in-swift
能否提供原网址进行测试?
【参考方案1】:
请检查 m3u8 文件可能是 m3u8 中的内容有一些目录问题。 m3u8 文件中提到了 .ts 段和 .key 文件。当您将 m3u8 传递给 avplayer 时,它会自动获取密钥和 .ts 文件并使用上述密钥解密 .ts。只需交叉检查您 m3u8 的密钥和 .ts 文件即可。
此外,.key 和 .ts 文件需要与 m3u8 位于同一文件夹中,否则它将无法获取并且播放器会继续寻找密钥和 ts。
#EXTM3U
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-VERSION:4
#EXT-X-KEY:METHOD=AES-128,URI="title.key"
#EXTINF:10.0100,
#EXT-X-BYTERANGE:943584@0
title.ts
类似的东西。
注意:有时 m3u8 和密钥文件有额外的加密,您需要在运行时解密。我建议在文本编辑器中打开它,看看你是否能看到类似上面给定结构的东西。如果它有一些不可读的东西,那么您需要在运行时首先对其进行解密。如果您使用本地服务器并从缓存加载文件,则在解密后使用 Encoding.utf8 保存 m3u8 文件,并使用 Encoding.macOSRoman 保存 .key 文件。否则它将无法正常工作。干杯。
【讨论】:
以上是关于Hls 流 url 不会在 AVPlayer 中播放的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS SDK - AVPlayer 中手动选择视频质量的 HLS 流?
带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为
在 iOS 13 上,AVPlayer 会为此 HLS 视频选择仅音频流。我可以控制这种行为,而是让它加载视频+音频吗?