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

Как получить видеоролик в реальном времени с камеры iphone и отправить его на сервер?

Я использую AVCaptureSession для захвата видео и получения реального времени с камеры iPhone, но как я могу отправить его на сервер с мультиплексированием кадра и звука и как использовать ffmpeg для выполнения этой задачи, если у кого-нибудь есть какой-либо учебник о ffmpeg или любом примере, пожалуйста, поделитесь здесь.

4b9b3361

Ответ 1

То, как я это делаю, - это реализовать AVCaptureSession, у которого есть делегат с обратным вызовом, который выполняется на каждом кадре. Этот обратный вызов отправляет каждый кадр по сети на сервер, у которого есть пользовательская настройка для его получения.

Здесь поток:

http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2

И вот какой-то код:

// 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 секунды видео между каждым блоком, как запускать и останавливать сеансы).

Ответ 2

Смотри здесь, и здесь

Попробуйте захватить видео, используя платформу AV Foundation. Загрузите его на свой сервер с потоковой передачей HTTP.

Также проверьте стек другой пост ниже

(Пост ниже был найден по этой ссылке здесь)

Вы, скорее всего, уже знаете....

 1) How to get compressed frames and audio from iPhone camera?

Ты не сможешь это сделать. API AVFoundation предотвратил это со всех сторон. Я даже пробовал именованные каналы и какой-нибудь другой подлый fix. Нет такой удачи. У вас нет выбора, кроме как записать его в файл. В вашей связанной публикации пользователь предлагает настроить обратный вызов для доставки закодированных кадров. Насколько я знаю, это невозможно для потоков H.264. Делегат захвата доставит изображения, закодированные в определенном пиксельном формате. Это авторы фильмов и AVAssetWriter, которые делают кодирование.

 2) Encoding uncompressed frames with ffmpeg API is fast enough for
 real-time streaming?

Да, это. Тем не менее, вам придется использовать libx264, который доставит вас на территорию GPL. Это не совсем совместимо с магазином приложений.

Я бы предложил использовать AVFoundation и AVAssetWriter по соображениям эффективности.

Ответ 3

Существует длинная и короткая история.

Это короткий: посмотрите https://github.com/OpenWatch/H264-RTSP-Server-iOS

это начальная точка.

вы можете получить его и посмотреть, как он извлекает фрейм. Это небольшой и простой проект.

Затем вы можете посмотреть на kickflip, у которого есть определенная функция "encodedFrame", ее вызванная обратная связь и закодированный кадр прибывают с этого момента, и вы можете делать то, что хотите, отправить через websocket. Существует куча очень жесткого кода, доступного для чтения атомов mpeg.