【问题标题】:How send to stream video from iOS device to server?如何将视频从 iOS 设备发送到服务器?
【发布时间】:2012-03-12 14:24:11
【问题描述】:

我必须将视频从 iPhone 实时发送到服务器。我创建捕获会话并使用 AVCaptureMovieFileOutput。

NSError *error = nil;

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]];

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 

[composition insertTimeRange:editRange ofAsset:asset atTime:composition.duration error:&editError];

AVAssetExportSession *exportSession = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetPassthrough]; exportSession.shouldOptimizeForNetworkUse = YES; NSString *name = [NSString stringWithFormat:MOVUE_SEGMENT_NAME, countMovies]; NSString *path = [NSString stringWithFormat:@"file://localhost%@", [self getMoviePathWithName:name]]; NSURL *url = [NSURL URLWithString:path]; NSLog(@"urlsegment = %@", url); exportSession.outputFileType = AVFileTypeMPEG4; exportSession.outputURL = url; [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (AVAssetExportSessionStatusCompleted == exportSession.status) { countMovies++; NSLog(@"AVAssetExportSessionStatusCompleted"); } else if (AVAssetExportSessionStatusFailed == exportSession.status) { NSLog(@"AVAssetExportSessionStatusFailed: %@", [exportSession.error localizedDescription]); } else { NSLog(@"Export Session Status: %d", exportSession.status); } }];

如果导出会话状态完成,我会将视频发送到服务器。但这很慢。获取持续时间为 10 秒的电影,然后将其发送到服务器需要 15 秒。如果胶片的大小小于 10 秒,则没有任何变化。 我怎么解决这个问题?做这个的最好方式是什么?我怎么解决这个问题?在服务器上流式传输视频有什么更好的用途?

【问题讨论】:

    标签: ios tabs http-live-streaming


    【解决方案1】:

    使用ffmpeg编码元数据,可能比AVAssetExportSession更好。但是ffmpeg编码比AVAssetExportSession困难得多;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2018-06-07
      相关资源
      最近更新 更多