Iphone 游戏套件上的NSData和EXC_坏_访问奇怪的问题
我正在尝试通过GameKit创建的点对点连接来传输视频数据。我有一个方法接收NSData对象,并使用它在CALayer上绘制视频流:Iphone 游戏套件上的NSData和EXC_坏_访问奇怪的问题,iphone,objective-c,c,nsdata,gamekit,Iphone,Objective C,C,Nsdata,Gamekit,我正在尝试通过GameKit创建的点对点连接来传输视频数据。我有一个方法接收NSData对象,并使用它在CALayer上绘制视频流: - (void)recieveVideoFromData:(NSData *)data; 以下是该方法的前几行,它们将NSData转换为CMSampleBufferRefs并开始处理: CMSampleBufferRef imgData = (CMSampleBufferRef)data.bytes; CVImageBufferRef imageBuffer =
- (void)recieveVideoFromData:(NSData *)data;
以下是该方法的前几行,它们将NSData转换为CMSampleBufferRefs并开始处理:
CMSampleBufferRef imgData = (CMSampleBufferRef)data.bytes;
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imgData);
CVPixelBufferLockBaseAddress(imageBuffer,0);
现在,当我将本地摄像机的视频流按如下方式输入此方法时,一切正常,视频流显示在屏幕上:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
NSData *data = [[NSData alloc] initWithBytes:sampleBuffer length:malloc_size(sampleBuffer)];
[self recieveVideoFromData:data];
}
但是,当我通过对等连接发送这些NSData数据包流并以以下方式接收它们时,会出现EXC_BAD_访问错误:
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
[self recieveVideoFromData:data];
}
使用调试器,我了解到错误访问发生在以下行:
CVPixelBufferLockBaseAddress(imageBuffer,0);
我不知道为什么通过网络发送的NSData与通过同一设备上的另一种方法发送的NSData有任何不同。我已检查通过网络接收的数据是否以相同的间隔接收,并且与本地设备上生成的数据长度相同(336字节)。我还检查了数据对象在使用前的保留计数为1。似乎imageBuffer变量不知何故丢失了
有几个问题:
提前谢谢 这可能不是全部答案,但您使用的
malloc_size
对我来说似乎是一个巨大的危险信号。这似乎是一个不可移植的扩展,不受ANSI、ISO或POSIX之类的任何东西的控制,如果传递的缓冲区不是来自malloc
,我对它的行为有一些怀疑。这似乎是一个粗略的依靠。(我想说,如果要调用malloc_size
,作为一名C程序员,你已经做错了一些事情,因为C就是要事先知道你的缓冲区有多大,而不是依靠不可移植的libc函数来跟踪你的缓冲区大小。)这可能不是全部答案,但是你使用的malloc_size
对我来说似乎是一个巨大的危险信号。这似乎是一个不可移植的扩展,不受ANSI、ISO或POSIX之类的任何东西的控制,如果传递的缓冲区不是来自malloc
,我对它的行为有一些怀疑。这似乎是一个粗略的依靠。(我想说,如果要调用malloc_size
,作为一名C程序员,你已经做错了一些事情,因为C就是要事先知道你的缓冲区有多大,而不是依靠不可移植的libc函数来为你做缓冲区大小跟踪工作。)你为什么要“解包”(这不是解包)您的CMSampleBuffer
是通过强制转换NSData
的字节来实现的吗?这是行不通的,因为CMSampleBuffer
不是内存中的连续块
在发送之前,您必须自己从CMSampleBuffer
中检索所有相关数据,将其填充到和NSData
对象中,并通过
OSStatus CMSampleBufferCreate (
CFAllocatorRef allocator,
CMBlockBufferRef dataBuffer,
Boolean dataReady,
CMSampleBufferMakeDataReadyCallback makeDataReadyCallback,
void *makeDataReadyRefcon,
CMFormatDescriptionRef formatDescription,
CMItemCount numSamples,
CMItemCount numSampleTimingEntries,
const CMSampleTimingInfo *sampleTimingArray,
CMItemCount numSampleSizeEntries,
const size_t *sampleSizeArray,
CMSampleBufferRef *sBufOut
);
此函数中的数据类型可能会提示您在打包数据时要从CMSampleBuffer
中提取什么。为什么要通过强制转换NSData
的字节来“解包”(这不是解包)您的CMSampleBuffer
?这是行不通的,因为CMSampleBuffer
不是内存中的连续块
在发送之前,您必须自己从CMSampleBuffer
中检索所有相关数据,将其填充到和NSData
对象中,并通过
OSStatus CMSampleBufferCreate (
CFAllocatorRef allocator,
CMBlockBufferRef dataBuffer,
Boolean dataReady,
CMSampleBufferMakeDataReadyCallback makeDataReadyCallback,
void *makeDataReadyRefcon,
CMFormatDescriptionRef formatDescription,
CMItemCount numSamples,
CMItemCount numSampleTimingEntries,
const CMSampleTimingInfo *sampleTimingArray,
CMItemCount numSampleSizeEntries,
const size_t *sampleSizeArray,
CMSampleBufferRef *sBufOut
);
此函数中的数据类型可能会提示您在打包数据时要从
CMSampleBuffer
中提取什么。老实说,我对C不太了解,我尝试将我能做的工作拼凑起来,包括复制代码和猜测malloc\u大小等。有没有可靠的方法来检查CMSampleBuffer的大小?老实说,我对C不太了解,我试着把我能做的事情拼凑起来,包括复制代码和猜测malloc_大小。是否有可靠的方法来检查CMSampleBuffer的大小?您是否可以提供相关的示例或教程?谢谢你能提供任何关于这方面的示例或教程吗?谢谢