Как получить байты из CMSampleBufferRef, отправить по сети
Захват видео с использованием работы AVFoundation. С помощью Apple Documentation http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Статьи/03_MediaCapture.html% 23//apple_ref/doc/uid/TP40010188-CH5-SW2
Теперь я сделал следующие действия
1.Создано videoCaptureDevice
2.Created AVCaptureDeviceInput
и установите videoCaptureDevice
3.Создан 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];
Все хорошо подходило к этому........
Моя проблема IS,
Мне нужно отправить видеофрагменты через UDP Socket. Даже если следующая плохая идея, я попытался, UIImage в NSData и отправить через UDP Pocket. BUt получил так Delay в видео Processing.Mostly проблема из-за UIImage в NSDate
Итак, пожалуйста, GIve me Решение Для моей проблемы
1) Любой способ преобразования CMSampleBUffer или CVImageBuffer в NSData?
2) Подобно службе очереди аудио и очереди для видео для хранения UIImage и UIImage для NSDate И отправка
если я верю за неправильным алгоритмом. Просьба указать меня в направлении записи
Спасибо заблаговременно
Ответы
Ответ 1
Вот код, который нужно получить в буфере. Этот код предполагает плоское изображение (например, 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 или пула буферов.
Отправка изображения 480х360 каждую секунду потребует подключения 4,1 Мбит/с, предполагая 3 цветовых канала.
Ответ 2
Используйте CMSampleBufferGetImageBuffer
, чтобы получить CVImageBufferRef
из буфера примера, а затем получить из него растровые данные с помощью CVPixelBufferGetBaseAddress
. Это позволяет избежать ненужного копирования изображения.