Подтвердить что ты не робот

Как получить байты из 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  И отправка

если я верю за неправильным алгоритмом. Просьба указать меня в направлении записи

Спасибо заблаговременно

4b9b3361

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