¿Cómo enviar el video capturado desde la camera del iPhone a un server para transmisión en vivo?

Tengo un código en línea que captura el video de la camera del iPhone y luego lo almacena en un file de video y funciona bien. Pero mi propósito no es savelo en la memory, sino enviarlo a un corte. Me he enterado de que hay un server de medios gratuito llamado WOWZA que permite la transmisión y Apple también tiene la function HTTP Live Streaming (HSL) y que los serveres esperan que el video esté en formatting h.264 para video y en mp3 para audio. Al leer algunos de los documentos sobre Apple HSL, también supe que proporciona una url diferente en el file de list de reproducción para cada segmento del file multimedia que luego se reproduce en el order correcto en un dispositivo a través del browser. No estoy seguro de cómo get pequeños segmentos del file que está grabado por la camera del teléfono y también cómo convertirlo en el formatting requerido. El siguiente es el código para capturar video:

Archivo de implementación

#import "THCaptureViewController.h" #import <AVFoundation/AVFoundation.h> #import "THPlayerViewController.h" #define VIDEO_FILE @"test.mov" @interface THCaptureViewController () @property (nonatomic, strong) AVCaptureSession *captureSession; @property (nonatomic, strong) AVCaptureMovieFileOutput *captureOutput; @property (nonatomic, weak) AVCaptureDeviceInput *activeVideoInput; @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer; @end @implementation THCaptureViewController - (void)viewDidLoad { [super viewDidLoad]; #if TARGET_IPHONE_SIMULATOR self.simulatorView.hidden = NO; [self.view bringSubviewToFront:self.simulatorView]; #else self.simulatorView.hidden = YES; [self.view sendSubviewToBack:self.simulatorView]; #endif // Hide the toggle button if device has less than 2 cameras. Does 3GS support iOS 6? self.toggleCameraButton.hidden = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count] < 2; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [self setUpCaptureSession]; }); } #pragma mark - Configure Capture Session - (void)setUpCaptureSession { self.captureSession = [[AVCaptureSession alloc] init]; NSError *error; // Set up hardware devices AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if (videoDevice) { AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if (input) { [self.captureSession addInput:input]; self.activeVideoInput = input; } } AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; if (audioDevice) { AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; if (audioInput) { [self.captureSession addInput:audioInput]; } } //Create a VideoDataOutput and add it to the session AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; [self.captureSession addOutput:output]; // Setup the still image file output AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; [stillImageOutput setOutputSettings:@{AVVideoCodecKey : AVVideoCodecJPEG}]; if ([self.captureSession canAddOutput:stillImageOutput]) { [self.captureSession addOutput:stillImageOutput]; } // Start running session so preview is available [self.captureSession startRunning]; // Set up preview layer dispatch_async(dispatch_get_main_queue(), ^{ self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; self.previewLayer.frame = self.previewView.bounds; self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; [[self.previewLayer connection] setVideoOrientation:[self currentVideoOrientation]]; [self.previewView.layer addSublayer:self.previewLayer]; }); } #pragma mark - Start Recording - (IBAction)startRecording:(id)sender { if ([sender isSelected]) { [sender setSelected:NO]; [self.captureOutput stopRecording]; } else { [sender setSelected:YES]; if (!self.captureOutput) { self.captureOutput = [[AVCaptureMovieFileOutput alloc] init]; [self.captureSession addOutput:self.captureOutput]; } // Delete the old movie file if it exists //[[NSFileManager defaultManager] removeItemAtURL:[self outputURL] error:nil]; [self.captureSession startRunning]; AVCaptureConnection *videoConnection = [self connectionWithMediaType:AVMediaTypeVideo fromConnections:self.captureOutput.connections]; if ([videoConnection isVideoOrientationSupported]) { videoConnection.videoOrientation = [self currentVideoOrientation]; } if ([videoConnection isVideoStabilizationSupported]) { videoConnection.enablesVideoStabilizationWhenAvailable = YES; } [self.captureOutput startRecordingToOutputFileURL:[self outputURL] recordingDelegate:self]; } // Disable the toggle button if recording self.toggleCameraButton.enabled = ![sender isSelected]; } - (AVCaptureConnection *)connectionWithMediaType:(NSString *)mediaType fromConnections:(NSArray *)connections { for (AVCaptureConnection *connection in connections) { for (AVCaptureInputPort *port in [connection inputPorts]) { if ([[port mediaType] isEqual:mediaType]) { return connection; } } } return nil; } #pragma mark - AVCaptureFileOutputRecordingDelegate - (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { if (!error) { [self presentRecording]; } else { NSLog(@"Error: %@", [error localizedDescription]); } } #pragma mark - Show Last Recording - (void)presentRecording { NSString *tracksKey = @"tracks"; AVAsset *asset = [AVURLAsset assetWithURL:[self outputURL]]; [asset loadValuesAsynchronouslyForKeys:@[tracksKey] completionHandler:^{ NSError *error; AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error]; if (status == AVKeyValueStatusLoaded) { dispatch_async(dispatch_get_main_queue(), ^{ UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; THPlayerViewController *controller = [mainStoryboard instantiateViewControllerWithIdentifier:@"THPlayerViewController"]; controller.title = @"Capture Recording"; controller.asset = asset; [self presentViewController:controller animated:YES completion:nil]; }); } }]; } #pragma mark - Recoding Destination URL - (NSURL *)outputURL { NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSLog(@"documents Directory: %@", documentsDirectory); NSString *filePath = [documentsDirectory stringByAppendingPathComponent:VIDEO_FILE]; NSLog(@"output url: %@", filePath); return [NSURL fileURLWithPath:filePath]; } @end 

Encontré este enlace que muestra cómo capturar el video en fotogtwigs. Pero no estoy seguro de si capturar el video en fotogtwigs me ayudará a enviar el video en formatting h.264 al server. ¿Se puede hacer esto? Si es así, ¿cómo?

Aquí, la persona que ha hecho la pregunta dice (en los comentarios a continuación la pregunta) que fue capaz de hacerlo con éxito, pero no mencionó cómo capturó el video.

Por favor, dígame qué tipo de datos debe usarse para get pequeños segmentos del video capturado y también cómo convertir los datos capturados en el formatting requerido y enviarlos al server.

Puede usar sdk en vivo. Debe configurar el server de transmisión con alimentación nginx. Por favor, siga este enlace. Lo he usado y es una solución muy eficiente. https://github.com/ltebean/Live