使用 HLS 视频时,仅在 iOS 13 上使用 AVPlayerViewController 和 AVPlayer 时出现视频播放问题

2023-11-27

我有一个可以播放视频的应用程序。它与 iOS 11、12 和 iOS 13 兼容。在 iOS 11 和 12 上,视频播放可以正常使用AVPlayerViewController甚至只是AVPlayerLayer.

然而,在 iOS 13 上,我开始收到报告称,相当多的用户在更新 iOS 时突然无法加载视频(或仅加载音频,或仅加载第一帧)。我很难复制它,但有人提到它主要是在网络连接较差的情况下发生的,果然使用 Network Link Conditioner 我能够复制它。

它特别影响 HLS 视频(例如,Reddit 使用的一种与直播兼容的视频)。它在 MP4 上仍然可以正常工作。以下是失败的 URL 示例:https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8

这是触发它的网络链接调节器配置文件:https://i.stack.imgur.com/Q2wif.jpg

这是一个触发它的示例项目,显示 AVPlayerViewController 和 AVPlayer(点击“下载”,Google 很奇怪):https://drive.google.com/file/d/1RS5DvUypdOLFCYJe1Pt2Ig0fQljZDLs2/view

下面是使用 AVPlayerViewController 展示它的示例代码:

let assetURL = URL(string: "https://v.redd.it/gl3chx2kd4v31/HLSPlaylist.m3u8")!

// The following MP4 URL *does* work, for instance
// let assetURL = URL(string: "https://giant.gfycat.com/DependentFreshKissingbug.mp4")!

let player = AVPlayer(url: assetURL)
let playerViewController = AVPlayerViewController()
playerViewController.player = player

self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
}

如果我在 iOS 12 设备上尝试完全相同的代码,它会完美运行。

有人对如何修复它有任何建议吗?如果你擦回到开头有时您可以让视频正确播放,但不够可靠,因此似乎可以以此为基础构建解决方案。视频内容绝对不是我在 iOS 开发中的强项,所以我开始有点摸不着头脑,任何帮助将不胜感激。

注意:我很清楚这(可能)是一个 iOS 错误,我将提交一个 Radar,但我现在仍然需要处理它。


您需要了解playerItems 的状态才能知道它何时可以开始播放。然后在playerItem状态更改为准备播放调用你的player.play。

playerItem.addObserver(self,
                           forKeyPath: #keyPath(AVPlayerItem.status),
                           options: [.old, .new],
                           context: &playerItemContext)


override func observeValue(forKeyPath keyPath: String?,
                           of object: Any?,
                           change: [NSKeyValueChangeKey : Any]?,
                           context: UnsafeMutableRawPointer?) {

    // Only handle observations for the playerItemContext
    guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath,
                           of: object,
                           change: change,
                           context: context)
        return
    }

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItemStatus
        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        // Switch over status value
        switch status {
        case .readyToPlay:
            // Player item is ready to play.
        case .failed:
            // Player item failed. See error.
        case .unknown:
            // Player item is not yet ready.
        }
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HLS 视频时,仅在 iOS 13 上使用 AVPlayerViewController 和 AVPlayer 时出现视频播放问题 的相关文章

随机推荐

  • 如何将保存图像更改为文件默认名称?

    我有一个由 Caman js 创建的画布 HTML5 标签 当我在 FF 中单击右键并保存到文件时 文件的默认名称是 canvas png 由于我创建了很多文件并需要保存它们 这很不幸 因为我需要为每个文件设置不同的名称 我想要完成的是 当
  • 如何在 SQLExpress 文本字段中插入中文字符?

    如何在 SQLExpress 文本字段中插入中文字符 我使用的是 VS 2008 中的 SQL Express 当我添加中文字符时 无论是通过我编写的导入应用程序还是从 Visual Studio 内的数据视图粘贴它们 它们最终都会变成问号
  • View.OnClickListener() 函数或接口

    View OnClickListener 是函数还是接口 当我们尝试在 android 中设置 onclicklistener 方法时 我们使用 new View OnClickListener 据我所知 它让我感到烦恼 我们不需要初始化包
  • 回调函数的用处

    在 Javascript 中 可以定义一个函数 X 并将其作为参数传递给另一个函数 Y 这样的函数 X 称为callback function 您能否解释为什么在一些清晰的示例中使用回调函数很有用 例如发送一些带有演示的小提琴链接 我可以看
  • 根据文本区域的宽度计算文本大小

    我有一个文本应该设置为具有指定宽度的 TextView 它需要计算文本大小以适合 TextView 换句话说 有没有办法让文本适合 TextView 区域 就像 ImageView 比例类型功能一样 这应该是一个简单的解决方案 public
  • 如何使用 Objective-C++ 在 C++ 类中添加观察者到 NSNotificationCenter?

    我有一个 C 类 最近从 cpp 重命名为 mm 以支持 Objective C 所以我可以添加以下 Objective C 代码 NSNotificationCenter defaultCenter addObserver self se
  • 使用 Razor 的条件 HTML 属性

    变量 strCSSClass 通常有一个值 但有时为空 我不想在此输入元素的 HTML 中包含空的 class 这意味着如果 strCSSClass 为空 我根本不需要 class 属性 以下是执行条件 HTML 属性的一种方法
  • Spring@计划于每天凌晨 4:00 至 4:30 之间的随机分钟开始

    正如问题标题所述 我需要设置 Spring Scheduler 它将运行方法以每天凌晨 4 点左右将某些内容从数据库加载到内存中 问题是我有该服务器的多个实例 我不希望所有实例同时开始执行 因为它会减慢数据库的速度 所以我希望时间是 4 0
  • 如何将 UWP 目标添加到现有 Xamarin Forms 项目?

    我有一个现有的 Xamarin Forms 应用程序 设置为针对 Android 和 iOS 构建 我想添加 UWP 目标 以便可以查看应用程序在 Windows 上的执行情况 我想我可以做到这一点 而无需为 Windows 创建新的 UI
  • Egit 将 Eclipse 项目文件夹添加到 git 存储库

    我在 BitBucket 上创建了一个新的空 git 存储库 现在我想将其链接到 Eclipse 我将存储库添加到 Git Repositories 视图中 并创建了一个同名的新项目 我选择 团队 gt 共享项目 然后提交并推送到上游 现在
  • 更新 RestKit 'lcl_RK.h' 文件在 RKLog.h 中找不到

    我在 Xcode 7 1 中安装 RestKit v0 25 0 和 CocoaPods v0 39 并遇到导入问题 当我使用 CocoaPods v0 38 2 时 一切都很棒 找不到 RKHTTPUtilities h 文件 它在 PO
  • numpy数组赋值问题

    我在使用 Numpy 的 Python 2 6 5 中遇到了一个奇怪的问题 我分配一个 numpy 数组 然后将一个新变量等同于它 当我对新数组执行任何操作时 原始数组的值也会发生变化 这是为什么 请看下面的例子 请启发我 因为我对 Pyt
  • R 求和向量列表中的元素 X

    我刚刚开始做一些 R 脚本 但我无法解决这个问题 我有一个向量列表可以说 myListOfVector lt list c 1 2 c 1 2 c 1 2 c 1 2 我想要的是列表中每个向量的每个 X 元素的总和 基于元素的位置 这样 如
  • 在c中生成具有特定分布的随机数

    我需要一个具有生成随机数 给定平均值 标准差以及使用三种分布之一 指数分布 正态分布或统一分布 的函数的库 即使三者之一也会有帮助 我正在寻找这样的东西 http www codeproject com KB recipes zigurat
  • 在 moment.js 中获取该月的最后一个星期一

    有没有办法使用 moment js 获取该月的最后一个星期一 我知道我可以通过以下方式得到月底 moment endOf month 但上周一怎么样 你快到了 您只需要添加一个简单的循环来逐天向后移动 直到找到星期一 result mome
  • BeginAccept 方法后无法关闭套接字

    我有一个 C 程序 在其中创建一个套接字 绑定它 开始监听 然后使用 beginaccept 但是当我尝试关闭 关闭套接字时 我从 beginaccept AsyncCallback 方法中得到异常 private void start l
  • 为什么我的 Java 中 char 和 int 之间的比较不起作用?

    char c 0 int i 0 System out println c i 为什么这总是返回 false 虽然这个问题很不清楚 但我很确定发帖者想知道为什么会这样打印false char c 0 int i 0 System out p
  • 使用扭曲和试用启动两个等效单元测试时,ReactorNotRestartable

    我有两个测试班 TrialTest1 and TrialTest2 写在两个文件中 test trial1 py and test trial2 py 基本相同 唯一的区别是类名 from twisted internet import r
  • javascript中引用和实例的区别

    有时我听到人们说 对象的引用 有些人说 对象的实例 有什么不同 A variable将举行参考 to an instance一个物体的 实际的对象是一个instance 用于访问对象的一个 或多个变量保存参考 to it
  • 使用 HLS 视频时,仅在 iOS 13 上使用 AVPlayerViewController 和 AVPlayer 时出现视频播放问题

    我有一个可以播放视频的应用程序 它与 iOS 11 12 和 iOS 13 兼容 在 iOS 11 和 12 上 视频播放可以正常使用AVPlayerViewController甚至只是AVPlayerLayer 然而 在 iOS 13 上