Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 游戏套件上的NSData和EXC_坏_访问奇怪的问题_Iphone_Objective C_C_Nsdata_Gamekit - Fatal编程技术网

Iphone 游戏套件上的NSData和EXC_坏_访问奇怪的问题

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 =

我正在尝试通过GameKit创建的点对点连接来传输视频数据。我有一个方法接收NSData对象,并使用它在CALayer上绘制视频流:

- (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变量不知何故丢失了

有几个问题:

  • data.bytes转换为CMSampleBufferRef是否是解包NSData的正确方法

  • 我如何断言接收的数据实际上是一个CMSampleBuffer对象?我想保护我的代码,但我不知道如何为核心基础类完成类验证。


  • 提前谢谢

    这可能不是全部答案,但您使用的
    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的大小?您是否可以提供相关的示例或教程?谢谢你能提供任何关于这方面的示例或教程吗?谢谢