使用 AVAssetReader 读取视频文件时由于内存利用率高而导致应用程序崩溃

2024-03-27

我正在尝试使用此问题中接受的答案中的方法来读取视频帧:使用 AVPlayer 访问单个帧 https://stackoverflow.com/questions/39570745/accesing-individual-frames-using-av-player/.

然后,我尝试在 MetalKit MKTView 上按顺序显示这些帧(我尝试在常规 UIImage 视图上,视频根本不渲染)。问题是,这只适用于几秒钟(大约 400 帧视频),之后应用程序崩溃并且视频停止播放。

这是视图控制器中的代码:

class MetalRenderViewController: UIViewController {
    var metalView: MetalRenderView!
    
    var videoFileReader: VideoFileReader?
    var videoUrl: URL!
    override func viewDidLoad() {
        super.viewDidLoad()
        metalView = MetalRenderView(frame: view.bounds, device: MTLCreateSystemDefaultDevice())
        view.addSubview(metalView)
        videoFileReader = VideoFileReader(videoUrl: videoUrl) { (image) in
            guard let image = image else {return}
            self.metalView.image = image

        }
        videoFileReader?.beginReadingAsset()
    }
    
}

这是 videoFileReader 中的相关代码:

guard let track = asset.tracks(withMediaType: .video).first else {return}
let reader = try! AVAssetReader(asset: asset)
let output = AVAssetReaderTrackOutput(track: track, outputSettings: settings)
reader.add(output)
reader.startReading()

while let sampleBuffer = output.copyNextSampleBuffer() {
            guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
            DispatchQueue.main.async {
                let image = CIImage(cvImageBuffer: imageBuffer)
                self.callback(image)
                
            }
        }

我怀疑这个问题可能与高内存利用率有关,因为在调试器中,内存使用量飙升至约 1.5 GB,然后在崩溃后下降,尽管我没有看到任何内存警告。

这是错误日志:

2021-06-28 16:13:22.491431-0400 WorkoutApp[10844:2837856] [xpc] XPC error talking to pkd: Connection interrupted
2021-06-28 16:13:22.773817-0400 WorkoutApp[10844:2837835] [ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke
2021-06-28 16:13:28.057141-0400 WorkoutApp[10844:2837857] [lifecycle] [u 5485F2DA-5C8A-40DD-91A5-F248E652AA58:m (null)] [com.apple.mobileslideshow.photo-picker(1.0)] Connection to plugin interrupted while in use.
2021-06-28 16:13:28.075489-0400 WorkoutApp[10844:2838140] [lifecycle] [u 5485F2DA-5C8A-40DD-91A5-F248E652AA58:m (null)] [com.apple.mobileslideshow.photo-picker(1.0)] Connection to plugin invalidated while in use.

如果有人可以帮助我减少内存利用率,或者建议一种更好的方法来完全做到这一点,我将不胜感激。

Edit

更新标题以更具体地描述错误,删除金属渲染类,这是一个转移注意力的类。


通过确认删除 ViewController 和 Metal 渲染类后问题仍然存在,我能够将此问题与 VideoFileReader 类中的 while 循环隔离。通过计算崩溃前读取的帧数并与调试器中的内存使用增长进行比较,我还能够确认崩溃确实是由于高内存利用率造成的。

最终解决这个问题的方法是将 while 循环体包装在 autoreleasepool 块中。似乎图像缓冲区正在创建但未释放,这就是内存峰值和随后崩溃的原因。

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

使用 AVAssetReader 读取视频文件时由于内存利用率高而导致应用程序崩溃 的相关文章

随机推荐

  • 使用 itextsharp 将 Pdf 文件页面转换为图像

    我想使用 ItextSharp 库转换图像中的 Pdf 页面 知道如何转换图像文件中的每个页面 iText iTextSharp 可以生成和 或修改现有的 PDF 但它们不执行您正在寻找的任何渲染 我建议检查一下鬼脚本 https stac
  • .exp有什么用,.lib和.dll有什么区别?

    在编译和链接过程中 exp有什么用 lib 和 dll 有什么区别 我知道运行程序时会使用 lib 而链接和 dll将被使用 但 lib 和 dll 之间到底有什么区别呢 lib 文件是否不包含来自 dll 文件的函数的代码 使用两个单独的
  • 将静态库转换为共享库(从 libsome.a 创建 libsome.so):我的符号在哪里?

    这个问题的标题是精确的欺骗 https stackoverflow com questions 655163 convert a static library to a shared library 但该问题的答案对我没有帮助 我有一堆目标
  • 用java打开chm文件

    我想从我的 java 应用程序打开 CHM 帮助 文件 我的代码如下所示 Runtime getRuntime exec hh exe myhelpfile chm 可以用 但是如何用特定页面打开它 谢谢 汤姆 尝试这个 是否可以从 Hh
  • 在 Python 中对元组字典进行排序

    我知道已经有很多关于 python 排序列表 字典的问题了 但我似乎找不到对我的情况有帮助的问题 而且我正在寻找最有效的解决方案 因为我要对一个相当大的数据进行排序数据集 我的数据目前基本上是这样的 a a 1 2 3 b 3 2 1 我基
  • RMarkdown - 使用 kable 的表格中的不同字体类型?

    我正在使用 RMarkdown 生成 pdf 文档 是否可以使用 kable styling 更改表格中的字体类型 如果没有 您能推荐其他包吗 library dplyr library kableExtra kable mtcars al
  • 将转义字符发送到打印机

    我正在开发一个 C 应用程序 用于从 SATO 热转印打印机 CG408 TT 打印标签 为此 我使用 SBPL SATO 编程语言 看起来像下面这样
  • C++ 使用不同的流读取和写入同一文件

    我有两个流指向同一个文件 第一个是std ofstream os第二个是std ifstream is 都以二进制模式打开 我在用着os创建一个新文件 文件创建过程需要我 有时 读取写入文件的数据os The is流寻找所需的位置 读取一些
  • 实体框架一对零或一对关系,没有导航属性

    由于 FK 限制 我在尝试删除记录时遇到了问题 因此 我回到了绘图板 并试图指定这种关系应该如何运作 这是我的代码第一类 public class MemberDataSet Key DatabaseGeneratedAttribute D
  • 如何在 Linux 中打开程序的多个实例

    例如 要打开多个实例gedit编辑器我写了一个像这样的shell脚本 gedit gedit gedit gedit 但是在我运行我的 shell 脚本之后 example sh 我只能找到一个 gedit 实例 我什至用过 运算符 以便
  • ObjectSpace.count_objects 中每个哈希值的含义是什么?

    在 ruby 1 9 3 中 我使用 ObjectSpace 来检查内存问题 ObjectSpace count objects 返回一个哈希值 如下所示 TOTAL gt 1004232 FREE gt 258543 T OBJECT g
  • 锁定 MongoDB 中的文档

    我在网络应用程序中使用 pymongo 并且想要执行以下形式的操作 doc collection find document doc array1 append foo for y in doc array2
  • Analysis_options.yaml 中包含多个内容?

    我想组合两个 或更多 analysis options yaml我的项目的文件 但无法找到如何做到这一点的方法 这有效 include package pedantic analysis options yaml 这也有效 include
  • 错误:‘.’令牌之前需要有不合格的 id //(结构)

    我需要制作一个程序 从用户那里获取一小部分 然后对其进行简化 我知道如何做到这一点 并且已经完成了大部分代码 但我不断收到此错误 错误 令牌之前预期有不合格的 id 我已经声明了一个名为 ReducedForm 的结构 它包含简化的分子和分
  • Python,Matplotlib,散点图,更改单击点的颜色

    我有一个带有选择器事件的简单散点图 我想更改用鼠标单击的数据点的颜色 我的代码将改变整个数组的颜色 我怎样才能改变一个特定的点 import sys import numpy as np import matplotlib pyplot a
  • 匹配集的数据结构

    我有一个应用程序 其中有很多组 一套可能是 4 7 12 18 唯一编号且全部小于 50 然后我有几个数据项 1 1 2 4 7 8 12 18 23 29 2 3 4 6 7 15 23 34 38 3 4 7 12 18 4 1 4 7
  • 二叉搜索树验证的空间复杂度

    验证二叉树是否为 BST 的最佳算法如下 IsValidBST root infinity infinity bool IsValidBST BinaryNode node int MIN int MAX if node null retu
  • 检查包含数十万张图像的目录中损坏的文件的速度逐渐变慢

    所以我有 600 000 多张图像 我估计其中大约 5 10 已损坏 我正在生成一个日志 准确记录与该图像相关的图像 使用Python 到目前为止我的方法是这样的 def img validator source files get pat
  • Android 4.1.2 对话框被调用两次

    当我调用显示对话框时 我的应用程序遇到了这个问题 不知何故它被调用了两次 这只发生在 android 4 1 及以上版本 较低版本工作正常 所以我不认为这是任何代码问题 您以前听说过 遇到过这个问题吗 这里是代码 Button edit B
  • 使用 AVAssetReader 读取视频文件时由于内存利用率高而导致应用程序崩溃

    我正在尝试使用此问题中接受的答案中的方法来读取视频帧 使用 AVPlayer 访问单个帧 https stackoverflow com questions 39570745 accesing individual frames using