【问题标题】:Is there a method that uses less memory than NSKeyedArchiver to archive an object?有没有比 NSKeyedArchiver 使用更少内存来归档对象的方法?
【发布时间】:2019-08-26 15:15:51
【问题描述】:

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

我正在对广播流进行采样,以通过 CFMessagePortSendRequest 调用发送这些图像。由于该函数只接受 CFData 类型,我需要将我的多平面图像转换为数据。

NSKeyedArchiver.archivedObject() 似乎超过了这 50 MB。在通话之前断线,我可以看到大约 6 MB 的内存消耗。然后,执行 archivedObject 调用,我的扩展崩溃导致它超出内存限制。

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

【问题讨论】:

    标签: ios objective-c swift replaykit


    【解决方案1】:

    我能够通过以下方式将 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];
    

    【讨论】:

    • 如问题中所述,我有多平面图像,但是是的,这是我必须走的路,但必须读取所有平面的字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多