当我获取帧的视频分辨率为 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/