ios - 是否有一种方法比 NSKeyedArchiver 使用更少的内存来归档对象?

标签 ios objective-c swift replaykit

我创建了一个 ReplayKit 广播扩展,因此我可以使用的最大内存量是 50 MB。

我正在获取广播流的样本,以通过 CFMessagePortSendRequest 调用发送这些图像。由于该函数仅接受 CFData 类型,因此我需要将多平面图像转换为数据。

NSKeyedArchiver.archivedObject() 似乎超过了 50 MB。在调用之前断开线路,我可以看到约 6 MB 的内存消耗。然后,执行 archivedObject 调用时,我的扩展程序崩溃,因为它超出了内存限制。

是否有一种内存消耗更少的方法将 CVPixelBuffer 的 CIImage 转换为 Data?当然,然后又回来了。

最佳答案

我能够通过以下方式将 CMSampleBufferRef 转换为 NSData。此方法使用 1-5~MB 内存。我希望这能解决您的问题。

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBufferType);
UInt8* bap0 = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); 
CVPixelBufferLockBaseAddress(imageBuffer,0);

int byteperrow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
int height = CVPixelBufferGetHeight(imageBuffer);
NSData *data = [NSData dataWithBytes:bap0 length:byteperrow * height];

关于ios - 是否有一种方法比 NSKeyedArchiver 使用更少的内存来归档对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57660662/

相关文章:

javascript - 从哪里 Javascript 错误 "ReferenceError: Can' t 找到变量 : imenu_title"?

ios - Objective-C++ : Call Objective C method from C++

iOS 消息之类的功能 - 滑动以显示消息时间?

ios - 如何使用 UIImagePNGRepresentation - iOS 压缩图像大小?

ios - 如何使用 swift 在 iOS 中的一个项目中使用多个导航 Controller

iphone - 如何将变量添加到url中

iphone - 我在 iOS 6 中获得了 Facebook 的格式错误的访问 token

c++ - 我应该为 memcpy 和 realloc 包含什么标题?

arrays - 如何通过位置循环合并数组中的值

ios - UITableView 单元格中没有出现任何内容