Как получить байты из 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
, Это позволяет избежать ненужного копирования изображения.