Ответ 1
То, как я это делаю, - это реализовать AVCaptureSession, у которого есть делегат с обратным вызовом, который выполняется на каждом кадре. Этот обратный вызов отправляет каждый кадр по сети на сервер, у которого есть пользовательская настройка для его получения.
Здесь поток:
И вот какой-то код:
// make input device
NSError *deviceError;
AVCaptureDevice *cameraDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:cameraDevice error:&deviceError];
// make output device
AVCaptureVideoDataOutput *outputDevice = [[AVCaptureVideoDataOutput alloc] init];
[outputDevice setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
// initialize capture session
AVCaptureSession *captureSession = [[[AVCaptureSession alloc] init] autorelease];
[captureSession addInput:inputDevice];
[captureSession addOutput:outputDevice];
// make preview layer and add so that camera view is displayed on screen
AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];
previewLayer.frame = view.bounds;
[view.layer addSublayer:previewLayer];
// go!
[captureSession startRunning];
Затем делегат устройства вывода (здесь, self) должен выполнить обратный вызов:
-(void) captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
CGSize imageSize = CVImageBufferGetEncodedSize( imageBuffer );
// also in the 'mediaSpecific' dict of the sampleBuffer
NSLog( @"frame captured at %.fx%.f", imageSize.width, imageSize.height );
}
Отправка необработанных кадров или отдельных изображений никогда не будет достаточно хорошо для вас (из-за количества данных и количества кадров). Вы также не можете разумно обслуживать что-либо с телефона (сети WWAN имеют всевозможные брандмауэры). Вам нужно будет закодировать видео и передать его на сервер, скорее всего, в стандартном потоковом формате (RTSP, RTMP). На iPhone >= 3GS есть чип кодировщика H.264. Проблема в том, что она не ориентирована на потоки. То есть он выводит метаданные, необходимые для синтаксического разбора видео. Это оставляет вам несколько вариантов.
1) Получите необработанные данные и используйте FFmpeg для кодирования на телефоне (будет использовать тонну процессора и аккумулятора).
2) Напишите свой собственный парсер для вывода H.264/AAC (очень сложно).
3) Запись и процесс в кусках (добавит задержки равна длине кусков, и падение около 1/4 секунды видео между каждым блоком, как запускать и останавливать сеансы).