当我获取帧的视频的分辨率为1080p时,我在尝试复制CVPixelBufferRef时遇到了崩溃。 (1920×1080) EXC_BAD_ACCESS(代码= 1,地址= 0x114af8000)
使用1280x720视频且没有崩溃时,代码可以正常工作。
在执行memcpy时,它在最后一行崩溃。
*编辑 根据要求,原始CVImageBufferRef(图像)和新的(pixelBufferCopy)
的数据量工作720p分辨率:'image'的数据大小:'pixelBufferCopy'的1388224数据大小: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 =>
}
>
我很欣赏有关这里可能出现的问题的任何建议。
谢谢, 代码
答案 0 :(得分:1)
尝试使用:
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。