Как получить байты из CMSampleBufferRef, чтобы отправить по сети - PullRequest
26 голосов
/ 31 мая 2011

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

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

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

5.В методе делегата AVCaptureVideoDataOutput

-(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 И отправка ???

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

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

Ответы [ 2 ]

34 голосов
/ 01 июня 2011

Вот код для получения в буфере.Этот код предполагает плоское изображение (например, 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 цветовых каналов.

2 голосов
/ 01 июня 2011

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

...