Как отправить потоковое видео с устройства iOS на сервер? - PullRequest
5 голосов
/ 22 февраля 2012

Я должен отправлять видео в реальном времени с iPhone на сервер.Я создаю сеанс захвата и использую AVCaptureMovieFileOutput.

NSError *error = nil;</p> <pre><code>captureSession = [[AVCaptureSession alloc] init]; // find, attach devices AVCaptureDevice *muxedDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeMuxed]; if (muxedDevice) { NSLog (@"got muxedDevice"); AVCaptureDeviceInput *muxedInput = [AVCaptureDeviceInput deviceInputWithDevice:muxedDevice error:&error]; if (muxedInput) { [captureSession addInput:muxedInput]; } } else { AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; if (videoDevice) { NSLog (@"got videoDevice"); AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if (videoInput) { [captureSession addInput: videoInput]; } } AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeAudio]; if (audioDevice) { NSLog (@"got audioDevice"); AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; if (audioInput) { [captureSession addInput: audioInput]; } } } // create a preview layer from the session and add it to UI AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; previewLayer.frame = view.layer.bounds; previewLayer.videoGravity = AVLayerVideoGravityResizeAspect; previewLayer.orientation = AVCaptureVideoOrientationPortrait; [view.layer addSublayer:previewLayer]; // create capture file output captureMovieOutput = [[AVCaptureMovieFileOutput alloc] init]; if (! captureMovieURL) { captureMoviePath = [[self getMoviePathWithName:MOVIE_FILE_NAME] retain]; captureMovieURL = [[NSURL alloc] initFileURLWithPath:captureMoviePath]; } NSLog (@"recording to %@", captureMovieURL); [captureSession addOutput:captureMovieOutput];

Я использую AVAssetExportSession для получения видео продолжительностью 10 секунд.

     AVURLAsset *asset = [AVURLAsset URLAssetWithURL:captureMovieURL options:[NSDictionary  dictionaryWithObject:@"YES" forKey:AVURLAssetPreferPreciseDurationAndTimingKey]];</p>

<pre><code>AVMutableComposition *composition = [AVMutableComposition composition];

CMTime endTime;
CMTime duration = CMTimeMake(6000, 600);
if (asset.duration.value - startFragment.value < 6000)
{
    endTime = asset.duration;
}
else
{
    endTime = CMTimeMake(startFragment.value + 6000, 600);        
}
CMTimeRange editRange = CMTimeRangeMake(startFragment, duration);
startFragment = CMTimeMake(endTime.value, 600);
  NSError *editError = nil;
// and add into your composition 

[композиция* Я отправляю видео на сервер, если экспортная сессия завершена.Но это очень медленно.Чтобы получить фильм продолжительностью 10 секунд, а затем отправить его на сервер, необходимо 15 секунд.Если размер фильма меньше 10 секунд, то ничего не меняется.Как я могу решить эту проблему?Каков наилучший способ сделать это?Как я могу решить эту проблему?Что лучше использовать для потоковой передачи видео на сервер?

1 Ответ

0 голосов
/ 10 апреля 2012

с использованием ffmpeg для кодирования метаданных, это может быть лучше, чем AVAssetExportSession. Но кодирование ffmpeg намного сложнее, чем AVAssetExportSession;

...