iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

2024-05-22

我正在将图像制作成视频。但总是因为内存警告而崩溃,分配太多CVPixelBufferCreate。我不知道如何正确处理。我看过很多类似的主题,但没有一个能解决我的问题。

这是我的代码:

- (void) writeImagesArray:(NSArray*)array asMovie:(NSString*)path
{
    NSError *error  = nil;
    UIImage *first = [array objectAtIndex:0];
    CGSize frameSize = first.size;
    AVAssetWriter *videoWriter = [[AVAssetWriter alloc] initWithURL:
                                  [NSURL fileURLWithPath:path] fileType:AVFileTypeQuickTimeMovie
                                                              error:&error];
    NSParameterAssert(videoWriter);
    
    NSDictionary *videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                   AVVideoCodecH264, AVVideoCodecKey,
                                   [NSNumber numberWithDouble:frameSize.width],AVVideoWidthKey,
                                   [NSNumber numberWithDouble:frameSize.height], AVVideoHeightKey,
                                   nil];
    
    AVAssetWriterInput* writerInput = [AVAssetWriterInput
                                       assetWriterInputWithMediaType:AVMediaTypeVideo
                                       outputSettings:videoSettings];
    
    self.adaptor = [AVAssetWriterInputPixelBufferAdaptor assetWriterInputPixelBufferAdaptorWithAssetWriterInput:writerInput
                                                     sourcePixelBufferAttributes:nil];
    
    [videoWriter addInput:writerInput];
    
    //Start Session
    [videoWriter startWriting];
    [videoWriter startSessionAtSourceTime:kCMTimeZero];
    
    int frameCount = 0;
    CVPixelBufferRef buffer = NULL;
    for(UIImage *img in array)
    {
        buffer = [self newPixelBufferFromCGImage:[img CGImage] andFrameSize:frameSize];
        if (self.adaptor.assetWriterInput.readyForMoreMediaData)
        {
            CMTime frameTime =  CMTimeMake(frameCount,FPS);
            [self.adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
        }
        if(buffer)
            CVPixelBufferRelease(buffer);
        
        frameCount++;
    }
    
    [writerInput markAsFinished];
    [videoWriter finishWritingWithCompletionHandler:^{
        
        if (videoWriter.status == AVAssetWriterStatusFailed) {
            
            NSLog(@"Movie save failed.");
            
        }else{
            
            NSLog(@"Movie saved.");
        }
    }];
    
    NSLog(@"Finished.");
}

        
- (CVPixelBufferRef)newPixelBufferFromCGImage: (CGImageRef) image andFrameSize:(CGSize)frameSize
{
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
                             [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
                             nil];
    
    CVPixelBufferRef pxbuffer = NULL;
    
    CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,
                                          frameSize.width,
                                          frameSize.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options,
                                          &pxbuffer);
    
    NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL);
    
    CVPixelBufferLockBaseAddress(pxbuffer, 0);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);
    NSParameterAssert(pxdata != NULL);
    
    CGBitmapInfo bitmapInfo = (CGBitmapInfo) kCGImageAlphaNoneSkipFirst;
    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pxdata,
                                                 frameSize.width,
                                                 frameSize.height,
                                                 8,
                                                 4*frameSize.width,
                                                 rgbColorSpace,
                                                 bitmapInfo);
    
    NSParameterAssert(context);
    CGContextConcatCTM(context, CGAffineTransformMakeRotation(0));
    CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image),
                                           CGImageGetHeight(image)), image);
    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(pxbuffer, 0);

    return pxbuffer;
}

UPDATES:

我把视频分成小片段。 添加[NSThread sleepForTimeInterval:0.00005]后;在循环。 记忆就神奇地被释放了。

但是,这导致我的 UI 由于这一行而卡住了几秒钟。有更好的解决办法吗?

for(UIImage *img in array)
{
    buffer = [self newPixelBufferFromCGImage:[img CGImage] andFrameSize:frameSize];
    //CVPixelBufferPoolCreatePixelBuffer(kCFAllocatorDefault, adaptor.pixelBufferPool, &buffer);
    if (adaptor.assetWriterInput.readyForMoreMediaData)
    {
        CMTime frameTime =  CMTimeMake(frameCount,FPS);
        [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime];
    }
    
    if(buffer)
        CVPixelBufferRelease(buffer);
    
    frameCount++;
    
    [NSThread sleepForTimeInterval:0.00005];
}

这是记忆:


通过对代码的快速审查,我看不出 CVBuffer 本身的管理有任何问题。
我认为问题的根源可能是 UIImages 数组。
UIImage 具有这种行为,在您请求 CGImage 属性或绘制它之前,附加图像不会在内存中解码,因此未使用图像对内存的影响很低。
您的枚举调用每个图像上的 CGImage 属性,并且您永远不会删除它们,这可以解释内存分配的持续增加。

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

iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放 的相关文章

  • 是否可以在无需升级 iOS 企业应用程序的情况下更新配置文件?

    新生成的配置文件似乎不再与同一应用程序的旧版本兼容 新应用程序确实适用于新配置文件 但是我们不想升级链接到旧版本后端且并非全部与最新应用程序兼容的所有应用程序 我们确实需要尽快更新配置文件 以保持旧应用程序正常运行 我们之前已经这样做过 但
  • PhoneGap/Cordova:如何使用cookies(iOS)?

    我有一个适用于 iOS 的 PhoneGap Corodova 项目 在 iOS 模拟器上构建时 我使用了 Jquery Cookies 它们很好 但是 既然我的设备上有该应用程序用于测试 它们就不再工作了 我猜这只是 iOS 不支持的东西
  • UITextField 文本更改事件

    如何检测文本字段中的任何文本更改 委托方法shouldChangeCharactersInRange适用于某些东西 但它并不能完全满足我的需求 因为在它返回 YES 之前 textField 文本不可用于其他观察者方法 例如在我的代码中ca
  • Xcode 推送通知:用于生产模式的 APNS 服务器

    我正在实现我的第一个带有推送通知的应用程序 我已经完成了以下所有调试雷 万德利奇教程 http www raywenderlich com 3443 apple push notification services tutorial par
  • 带 ModalPresentationStyle 的弹出框在 iOS 7 iPad 中不居中

    我在使用 iOS 7 时遇到了一个问题 这似乎是一个错误 或者只是我没有做正确的事情 我有 modalViewController 它在 iPad 上以 ModalPresentationStyle 的形式显示为弹出窗口 而且它不是标准尺寸
  • iOS:调用 Objective-C 方法的处理开销是多少?

    我正在编写一些实时音频处理代码 该代码将在音频单元的渲染回调中执行 该线程处于系统识别的最高优先级 Apple 指示最大限度地减少此调用中进行的处理量 他们的建议之一是避免 Objective C 方法调用 But why 调用 Objec
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • UISegmentedControl 中的自定义字体禁用调整FontSizeToFitWidth

    我已经为我的 UISegmentedControl 设置了自定义字体 但它似乎禁用了默认字体自动调整字体大小以适合宽度范围 Before After 这是我用来设置自定义字体的代码 UISegmentedControl segmentedC
  • BUG - 在 IOS 中没有选择标签的完成按钮

    我正在使用最新的离子并有一个简单的选择标签
  • 将 UITableViewDataSource 与具有子视图的自定义单元格结合使用

    在 UITableView 中使用自定义单元格时 我遇到了奇怪的表格重叠 Problem 向下滚动 最后两行上面画有顶部两行 向上滚动 前两行上面画有下面两行 这是 UITableViewDataSource 的代码 func tableV
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • CLLocation Manager如何在一定距离后更新

    我正在使用 CLLocationManager didupdatelocations 如下所示 func locationManager manager CLLocationManager didUpdateLocations locati
  • 在 Android 上使用 opus 剪辑从 IOS 发送的声音

    我正在 IOS 中从 audioUnit 录制音频 用 opus 编码字节并通过 UDP 将其发送到 android 端 问题是播放的声音有点削波 我还通过将原始数据从 IOS 发送到 Android 来测试声音 效果非常完美 我的 Aud
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 从数组中获取随机字符串[重复]

    这个问题在这里已经有答案了 我试图从数组 firstArray 中获取随机字符串并将其打印在 UILabel label 中 我似乎无法弄清楚并且出现错误 感谢您的帮助 我尝试搜索但找不到任何最新的教程 方法 import UIKit cl
  • 如何建立辅助NSSortDescriptor排序键?

    我已成功按排序键对数据进行排序lastName 但我想知道如何排序lastName 然后由firstName 这是我用来排序的代码lastName NSSortDescriptor sortDescriptor NSSortDescript
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • 选择更新后不起作用

    我有一个选择的下拉菜单 我更改了选项内容并调用触发器选择 更新但选择不重建下拉列表 这是我更新的
  • grep 的贪婪行为

    我认为在正则表达式中 贪婪 适用于量词而不是整个匹配 然而 我观察到 grep E color auto a ab lt printf aab returns aab而不是aab 这同样适用于 sed 另一方面 在 pcregrep 和其他
  • python 根据日期创建目录结构

    我使用以下函数根据今天的日期创建目录 usr bin python import time datetime os today datetime date today todaystr today isoformat os mkdir to
  • 如何使用 jest 测试 Web 组件 (lit-element)

    有人有一个很好的设置来使用 jest jsdom 或类似工具测试自定义元素吗 我一直在使用 Puppeteer 和 Selenium 但它们使测试运行速度减慢太多 jsdom 的任何其他替代方案或修复程序可以使下面的测试运行吗 import
  • 如何将 Jekyll 帖子分成两个不同的文件夹?

    我有一个 posts文件夹 我只是想要一种简单的方法将文件夹中的帖子分成两个不同的文件夹 并且出于纯粹的组织原因而没有任何永久链接更改 只需在您的目录中创建子目录即可 posts目录 当 Jekyll 生成永久链接时 子目录将被忽略
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn
  • Python google云函数部署失败-Madmom pip包

    我正在尝试使用 madmom python pip 包部署 Python3 7 Google Cloud Function 但是指定madmom 0 16 1requirements txt 中的内容导致部署失败 当我从requiremen
  • 如何使用 scipy.odr 估计拟合优度?

    我使用 scipy odr 将数据与权重拟合 但我不知道如何获得拟合优度或 R 平方的度量 有人对如何使用函数存储的输出来获取此度量有建议吗 The res var的属性Output http docs scipy org doc scip
  • 使用来自Processing-JS的JSON

    我想使用编写一个应用程序处理 JS http processingjs org 并且我希望能够使用服务器端数据加载它 我还没有编写服务器端 所以我可以使用任何东西 但似乎明显的 AJAX 事情是使用 JSON 将数据上传到页面中 如何从我的
  • 如何插入包含“&”的字符串

    如何编写包含 字符的插入语句 例如 如果我想将 J J Construction 插入数据库的列中 我不确定这是否有什么不同 但我正在使用 Oracle 9i 我总是忘记这一点 然后又回到它 我认为最好的答案是迄今为止提供的答复的组合 首先
  • @WebServlet 注释不适用于 Tomcat 8

    我想使用 WebServlet在 Tomcat 8 上运行的 Java EE web 应用程序中添加注释 我读到我需要在我的中声明 Servlet 版本 3 1web xml我的 Servlet 需要扩展HttpServlet 我做了所有这
  • 使用自动布局时 UIScrollview 的中心内容

    我在项目中使用自动布局 并且有一个滚动视图 其中有一个居中的按钮 我已经让滚动视图滚动 但不占据整个屏幕 我尝试按照此处的教程进行操作 https developer apple com library ios technotes tn21
  • 从 NDK 获取应用程序名称

    我需要从本机端获取我的 Android 应用程序的名称 如下所示 android content context context android content context this current activiy Resources
  • 重叠的回收和Application_Start

    我有一个使用 AppFabric 进行分布式缓存的 asp net Web 应用程序 在 Application Start 上 我初始化与 AppFabric 的连接 这通常需要几毫秒 这是完全可以接受的 有时可能需要长达30秒连接 在回
  • 在 Android 上提取/修改视频帧

    我有一个视频文件 我想获取视频的每一帧并对帧进行一些修改 例如在其中绘制另一个位图 放置一些文本等 Android 中是否有任何 API 框架可用于从视频中获取帧 我在 iOS 中使用他们的 AVFramework 做了类似的事情 如果可以
  • 如何在没有 DROP 数据库权限的情况下从命令行删除所有 MySQL 表? [复制]

    这个问题在这里已经有答案了 如何使用命令提示符删除 Windows MySQL 中的所有表 我想这样做的原因是我们的用户有权访问数据库删除 但无权重新创建数据库本身 因此我们必须手动删除表 有没有办法一次删除所有表 请记住 大多数表都与外键
  • 开源机器翻译引擎?

    我们正在寻找一个可以合并到我们的本地化工作流程中的开源机器翻译引擎 我们正在考虑以下选项 Moses http www statmt org moses C Joshua http www computing dcu ie mforcada
  • Spring验证非空元素的字符串列表

    我有一个模型类 其中包含字符串列表 该列表可以为空 也可以包含元素 如果它有元素 这些元素不能为空 举个例子 假设我有一个名为 QuestionPaper 的类 它有一个 QuestionId 列表 其中每个都是一个字符串 class Qu
  • Django 多个外键,相同的相关名称

    我想创建一个模型 1 其中具有相同其他模型 2 的多个外键 我希望这些外键具有相同的related name因为每个外键将指向 model 2 的不同实例 因为我需要所有外键的一个反向关系 也许一个例子会更明确 class Parent M
  • iOS-将图像转为视频时,CVPixelBufferCreate内存无法正确释放

    我正在将图像制作成视频 但总是因为内存警告而崩溃 分配太多CVPixelBufferCreate 我不知道如何正确处理 我看过很多类似的主题 但没有一个能解决我的问题 这是我的代码 void writeImagesArray NSArray