Как получить байты из CMSampleBufferRef, чтобы отправить по сети

Снимаю видео с помощью фрейма AVFoundation. С помощью документации Apple http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html%23//apple_ref/doc/ UID /TP40010188-СН5-SW2

Теперь я сделал следующие вещи

1.Created videoCaptureDevice
2.Created AVCaptureDeviceInput и установить videoCaptureDevice
3.Created AVCaptureVideoDataOutput и реализованный делегат
4.Created AVCaptureSession - установить вход как AVCaptureDeviceInput и установить вывод как AVCaptureVideoDataOutput

5. В методе AVCaptureVideoDataOutput Delegate

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

я получил CMSamplebuffer и преобразован в UIImage и протестирован для печати UIImageview с помощью

[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

Все дошло до этого........

Моя проблема в том, что мне нужно отправлять видеокадры через UDP Socket .even, хотя следующее - плохая идея, которую я пробовал,UIImage к NSData и отправка через UDP Pocket. Тем не менее, задержка обработки видео. Большая проблема из-за UIImage к NSDate.

Поэтому, пожалуйста, дайте мне решение для моей проблемы

1) Любой способ конвертировать CMSampleBUffer или CVImageBuffer в NSData??
2) Как Audio Queue Service и Queue for Video для хранения UIImage и выполнения UIImage для NSDate And Sending???

если я еду за неправильным алгоритмом, пожалуйста, укажите мне направление записи

Заранее спасибо

2 ответа

Решение

Вот код для получения в буфере. Этот код предполагает плоское изображение (например, BGRA).

NSData* imageToBuffer( CMSampleBufferRef source) {
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source);
    CVPixelBufferLockBaseAddress(imageBuffer,0);

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);
    void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer);

    NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height];

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
    return [data autorelease];
}

Более эффективным подходом было бы использование NSMutableData или буферного пула.

Отправка изображения 480x360 каждую секунду потребует соединения 4,1 Мбит / с с использованием 3 цветовых каналов.

Использование CMSampleBufferGetImageBuffer получить CVImageBufferRef из буфера семплов, затем получить растровые данные из него с помощью CVPixelBufferGetBaseAddress, Это позволяет избежать ненужного копирования изображения.

Другие вопросы по тегам