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()
    

【问题讨论】:

您是否尝试将playerplayerLayer 保存为实例属性?如果你不保存它们,它们通常会在块结束时被销毁(在你调用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 流?

iOS AVPlayer 未加载大多数 HLS 流

AVPlayer 永远无法播放

带有 HLS 冗余流和不良网络的奇怪 AVPlayer 行为

在 iOS 13 上,AVPlayer 会为此 HLS 视频选择仅音频流。我可以控制这种行为,而是让它加载视频+音频吗?

AVPlayer 不播放 HLS 直播