ios - 使用 1080p 复制 CVPixelBufferRef 时 memcpy 崩溃

标签 ios objective-c

当我获取帧的视频分辨率为 1080p 时,尝试复制 CVPixelBufferRef 时发生崩溃。 (1920x1080) EXC_BAD_ACCESS(代码=1,地址=0x114af8000)

代码在使用 1280x720 视频时完美运行,没有崩溃。

它在执行 memcpy 时在倒数第二行崩溃。

*编辑 根据要求,原始 CVImageBufferRef(image) 和新的 CVImageBufferRef(image) 的数据大小(pixelBufferCopy)

工作的 720p 分辨率:'image' 的数据大小:1388224 'pixelBufferCopy' 的数据大小:1385288

崩溃的 1080p 分辨率:'image' 的数据大小:3140704 'pixelBufferCopy' 的数据大小:3114728

CVPixelBufferLockBaseAddress(image, 0);

int bufferWidth = (int)CVPixelBufferGetWidth(image);
int bufferHeight = (int)CVPixelBufferGetHeight(image);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(image);
uint8_t *baseAddress = CVPixelBufferGetBaseAddress(image);

OSType typ = CVPixelBufferGetPixelFormatType(image);

CVImageBufferRef pixelBufferCopy = NULL;

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithBool:YES],       kCVPixelBufferCGImageCompatibilityKey,
                            [NSNumber numberWithBool:YES],    kCVPixelBufferCGBitmapContextCompatibilityKey, nil];

double dataSize = CVPixelBufferGetDataSize(image);


CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault,  bufferWidth, bufferHeight, typ, (__bridge CFDictionaryRef) options,  &pixelBufferCopy);

uint8_t *copyBaseAddress = CVPixelBufferGetBaseAddress(pixelBufferCopy);

memcpy(copyBaseAddress, baseAddress, dataSize);
CVPixelBufferUnlockBaseAddress(image, 0);

这是来自崩溃的 CVPixelBufferRef 的数据。

<CVPixelBuffer 0x1c4327b20 width=1920 height=1080 pixelFormat=420v iosurface=0x1c420dd30 planes=2>
<Plane 0 width=1920 height=1080 bytesPerRow=1920>
<Plane 1 width=960 height=540 bytesPerRow=1920>
<attributes=<CFBasicHash 0x1c5679280 [0x1b4a43310]>{type = immutable dict, count = 5,
entries =>
    0 : <CFString 0x1ad86d708 [0x1b4a43310]>{contents = "PixelFormatDescription"} = <CFBasicHash 0x1c5676600 [0x1b4a43310]>{type = immutable dict, count = 12,
entries =>
    1 : <CFString 0x1ad86dd08 [0x1b4a43310]>{contents = "FillExtendedPixelsCallback"} = <CFData 0x1c44b66e0 [0x1b4a43310]>{length = 24, capacity = 24, bytes = 0x00000000000000004804e686010000000000000000000000}
    5 : <CFString 0x1ad86d9c8 [0x1b4a43310]>{contents = "ContainsAlpha"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
    6 : <CFString 0x1ad86dba8 [0x1b4a43310]>{contents = "ContainsYCbCr"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    7 : <CFString 0x1ad86d688 [0x1b4a43310]>{contents = "OpenGLESCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    9 : <CFString 0x1ad86d648 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESTextureCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    10 : <CFString 0x1ad86dc08 [0x1b4a43310]>{contents = "ComponentRange"} = <CFString 0x1ad86dc28 [0x1b4a43310]>{contents = "VideoRange"}
    12 : <CFString 0x1ad86d628 [0x1b4a43310]>{contents = "IOSurfaceCoreAnimationCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    13 : <CFString 0x1ad86d668 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESFBOCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    15 : <CFString 0x1ad86d968 [0x1b4a43310]>{contents = "PixelFormat"} = <CFNumber 0xb000000343230762 [0x1b4a43310]>{value = +875704438, type = kCFNumberSInt32Type}
    18 : <CFString 0x1ad86db88 [0x1b4a43310]>{contents = "BitsPerComponent"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
    21 : <CFString 0x1ad86dbc8 [0x1b4a43310]>{contents = "ContainsRGB"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
    22 : <CFString 0x1ad86d9e8 [0x1b4a43310]>{contents = "Planes"} = (
        {
        BitsPerBlock = 8;
        BlackBlock = <10>;
    },
        {
        BitsPerBlock = 16;
        BlackBlock = <8080>;
        HorizontalSubsampling = 2;
        VerticalSubsampling = 2;
    }
)
}

    2 : <CFString 0x1ad86d4e8 [0x1b4a43310]>{contents = "ExtendedPixelsRight"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
    3 : <CFString 0x1ad86d4c8 [0x1b4a43310]>{contents = "ExtendedPixelsTop"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
    4 : <CFString 0x1ad86d4a8 [0x1b4a43310]>{contents = "ExtendedPixelsLeft"} = <CFNumber 0xb000000000000002 [0x1b4a43310]>{value = +0, type = kCFNumberSInt32Type}
    5 : <CFString 0x1ad86d508 [0x1b4a43310]>{contents = "ExtendedPixelsBottom"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
}
 propagatedAttachments=<CFBasicHash 0x1c5679540 [0x1b4a43310]>{type = mutable dict, count = 7,
entries =>
    0 : <CFString 0x1ad86d268 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationTopField"} = Left
    1 : <CFString 0x1ad86cfa8 [0x1b4a43310]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1c4622960 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    2 : <CFString 0x1c445d820 [0x1b4a43310]>{contents = "FrameMetadataDictionary"} = <CFBasicHash 0x1c5675700 [0x1b4a43310]>{type = mutable dict, count = 1,
entries =>
    0 : <CFString 0x10f3d8540 [0x1b4a43310]>{contents = "FrameBitsPerPixel"} = <CFNumber 0x1c4622c20 [0x1b4a43310]>{value = +0.01191023284313725422, type = kCFNumberFloat64Type}
}

    5 : <CFString 0x1ad86d088 [0x1b4a43310]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x1c4622cc0 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    8 : <CFString 0x1ad86d108 [0x1b4a43310]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x1c4622e60 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    10 : <CFString 0x1ad86d288 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationBottomField"} = Left
    12 : <CFString 0x1ad86ce28 [0x1b4a43310]>{contents = "CVFieldCount"} = <CFNumber 0xb000000000000012 [0x1b4a43310]>{value = +1, type = kCFNumberSInt32Type}
}
 nonPropagatedAttachments=<CFBasicHash 0x1c5679500 [0x1b4a43310]>{type = mutable dict, count = 0,
entries =>
}
>

这里是不会崩溃的CVPixelBufferRef

<CVPixelBuffer 0x1c4135c20 width=1280 height=720 pixelFormat=420v iosurface=0x1c4412490 planes=2>
<Plane 0 width=1280 height=720 bytesPerRow=1280>
<Plane 1 width=640 height=360 bytesPerRow=1280>
<attributes=<CFBasicHash 0x1c5669600 [0x1b4a43310]>{type = immutable dict, count = 1,
entries =>
    0 : <CFString 0x1ad86d708 [0x1b4a43310]>{contents = "PixelFormatDescription"} = <CFBasicHash 0x1c1c77a80 [0x1b4a43310]>{type = immutable dict, count = 12,
entries =>
    1 : <CFString 0x1ad86dd08 [0x1b4a43310]>{contents = "FillExtendedPixelsCallback"} = <CFData 0x1c04a4aa0 [0x1b4a43310]>{length = 24, capacity = 24, bytes = 0x00000000000000004804e686010000000000000000000000}
    5 : <CFString 0x1ad86d9c8 [0x1b4a43310]>{contents = "ContainsAlpha"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
    6 : <CFString 0x1ad86dba8 [0x1b4a43310]>{contents = "ContainsYCbCr"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    7 : <CFString 0x1ad86d688 [0x1b4a43310]>{contents = "OpenGLESCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    9 : <CFString 0x1ad86d648 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESTextureCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    10 : <CFString 0x1ad86dc08 [0x1b4a43310]>{contents = "ComponentRange"} = <CFString 0x1ad86dc28 [0x1b4a43310]>{contents = "VideoRange"}
    12 : <CFString 0x1ad86d628 [0x1b4a43310]>{contents = "IOSurfaceCoreAnimationCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    13 : <CFString 0x1ad86d668 [0x1b4a43310]>{contents = "IOSurfaceOpenGLESFBOCompatibility"} = <CFBoolean 0x1b4a43868 [0x1b4a43310]>{value = true}
    15 : <CFString 0x1ad86d968 [0x1b4a43310]>{contents = "PixelFormat"} = <CFNumber 0xb000000343230762 [0x1b4a43310]>{value = +875704438, type = kCFNumberSInt32Type}
    18 : <CFString 0x1ad86db88 [0x1b4a43310]>{contents = "BitsPerComponent"} = <CFNumber 0xb000000000000082 [0x1b4a43310]>{value = +8, type = kCFNumberSInt32Type}
    21 : <CFString 0x1ad86dbc8 [0x1b4a43310]>{contents = "ContainsRGB"} = <CFBoolean 0x1b4a43878 [0x1b4a43310]>{value = false}
    22 : <CFString 0x1ad86d9e8 [0x1b4a43310]>{contents = "Planes"} = (
        {
        BitsPerBlock = 8;
        BlackBlock = <10>;
    },
        {
        BitsPerBlock = 16;
        BlackBlock = <8080>;
        HorizontalSubsampling = 2;
        VerticalSubsampling = 2;
    }
)
}

}
 propagatedAttachments=<CFBasicHash 0x1c5a6a440 [0x1b4a43310]>{type = mutable dict, count = 7,
entries =>
    0 : <CFString 0x1ad86d268 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationTopField"} = Left
    1 : <CFString 0x1ad86cfa8 [0x1b4a43310]>{contents = "CVImageBufferYCbCrMatrix"} = <CFString 0x1c462c820 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    2 : <CFString 0x15de15900 [0x1b4a43310]>{contents = "FrameMetadataDictionary"} = <CFBasicHash 0x1c5c73dc0 [0x1b4a43310]>{type = mutable dict, count = 1,
entries =>
    0 : <CFString 0x15de077a0 [0x1b4a43310]>{contents = "FrameBitsPerPixel"} = <CFNumber 0x1c462c9a0 [0x1b4a43310]>{value = +0.00331380208333333353, type = kCFNumberFloat64Type}
}

    5 : <CFString 0x1ad86d088 [0x1b4a43310]>{contents = "CVImageBufferColorPrimaries"} = <CFString 0x1c462bb20 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    8 : <CFString 0x1ad86d108 [0x1b4a43310]>{contents = "CVImageBufferTransferFunction"} = <CFString 0x1c462b8e0 [0x1b4a43310]>{contents = "ITU_R_709_2"}
    10 : <CFString 0x1ad86d288 [0x1b4a43310]>{contents = "CVImageBufferChromaLocationBottomField"} = Left
    12 : <CFString 0x1ad86ce28 [0x1b4a43310]>{contents = "CVFieldCount"} = <CFNumber 0xb000000000000012 [0x1b4a43310]>{value = +1, type = kCFNumberSInt32Type}
}
 nonPropagatedAttachments=<CFBasicHash 0x1c5673240 [0x1b4a43310]>{type = mutable dict, count = 0,
entries =>
}
>

对于此处可能出现的问题的任何建议,我将不胜感激。

谢谢, 代码

最佳答案

尝试使用:

int bufferWidth = (int)CVPixelBufferGetWidthOfPlane(image, 0);
int bufferHeight = (int)CVPixelBufferGetHeightOfPlane(image, 0);
size_t bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(image, 0);
uint8_t *baseAddress = CVPixelBufferGetBaseAddressOfPlane(image, 0);

而不是它们的非平面对应物。这些似乎是双平面 CVPixelBuffers。

关于ios - 使用 1080p 复制 CVPixelBufferRef 时 memcpy 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50743733/

相关文章:

objective-c - NSMutableArray containsObject 返回 true,但它不应该

ios - 无法将类型 'UIView' (0x112484eb0) 的值转换为 'SKView' (0x111646718)

ios - 无法通过 GPUImage 播放录像机

ios - UINavigationbar 通过外观设置阴影不起作用

ios - Xcode 6 - 存档提交失败并出现错误

ios - Nib 装好, socket 不见了

ios - 如何将用户链接到 Game Center 中的特定排行榜?

iphone - 在不引发警告的情况下以动画方式进出 iAd

objective-c - 搜索数组中对象的属性

c# - MonoTouch - 检测 UITableView 滚动