Я пытаюсь транслировать видеоданные по одноранговому соединению, созданному с помощью 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_ACCESS:
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
[self recieveVideoFromData:data];
}
Используя отладчик, я узнал, что в этой строке происходит неправильный доступ:
CVPixelBufferLockBaseAddress(imageBuffer,0);
Я понятия не имею, почему NSData, отправленные по сети, должны отличаться от NSData, отправленного другим методом на том же устройстве. Я проверил, что данные, полученные по сети, принимаются с тем же интервалом и имеют ту же длину (336 байт), что и данные, полученные на локальном устройстве. Я также проверил, что счетчик сохранения для объекта data равен 1, прежде чем он будет использован. Кажется, переменная imageBuffer почему-то теряется.
Пара вопросов:
Является ли преобразование data.bytes в CMSampleBufferRef правильным способом распаковки NSData?
Как мне утверждать, что полученные данные на самом деле являются объектом CMSampleBuffer? Я хочу защитить свой код, но не знаю, как выполнить проверку классов для базовых классов.
Заранее спасибо!