【问题标题】:Simultaneous AVCaptureVideoDataOutput and AVCaptureMovieFileOutput同时 AVCaptureVideoDataOutput 和 AVCaptureMovieFileOutput
【发布时间】:2011-04-27 12:01:31
【问题描述】:

我需要能够同时让AVCaptureVideoDataOutputAVCaptureMovieFileOutput 工作。以下代码有效,但是,视频录制无效。在调用startRecordingToOutputFileURL 之后直接调用didFinishRecordingToOutputFileAtURL 委托。现在,如果我从 AVCaptureSession 只需注释掉该行:

[captureSession addOutput:captureDataOutput];

视频录制有效,但未调用 SampleBufferDelegate(我需要)。

我怎样才能让AVCaptureVideoDataOutputAVCaptureMovieFileOutput 同时工作。

- (void)initCapture {
 AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:NULL]; 

 captureDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
 [captureDataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; 

 m_captureFileOutput = [[AVCaptureMovieFileOutput alloc] init];

 NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey; 
 NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
 NSDictionary* videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 

 [captureDataOutput setVideoSettings:videoSettings]; 

 captureSession = [[AVCaptureSession alloc] init]; 

 [captureSession addInput:captureInput];
 [captureSession addOutput:m_captureFileOutput]; 
 [captureSession addOutput:captureDataOutput]; 

 [captureSession beginConfiguration]; 
 [captureSession setSessionPreset:AVCaptureSessionPresetLow]; 
 [captureSession commitConfiguration]; 

 [self performSelector:@selector(startRecording) withObject:nil afterDelay:10.0];
 [self performSelector:@selector(stopRecording) withObject:nil afterDelay:15.0];

 [captureSession startRunning];
}


- (void) startRecording
{
    [m_captureFileOutput startRecordingToOutputFileURL:[self tempFileURL] recordingDelegate:self];

}

- (void) stopRecording
{
    if([m_captureFileOutput isRecording])
 [m_captureFileOutput stopRecording];

}


- (NSURL *) tempFileURL
{
 NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"camera.mov"];
 NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
 NSFileManager *fileManager = [NSFileManager defaultManager];
 if ([fileManager fileExistsAtPath:outputPath]) {
  [[NSFileManager defaultManager] removeItemAtPath:outputPath error:nil];
 [outputPath release];
 return [outputURL autorelease];
}



- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didStartRecordingToOutputFileAtURL:(NSURL *)fileURL fromConnections:(NSArray *)connections
{
 NSLog(@"start record video");
}

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error
{
 NSLog(@"end record");
}


- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection 
{ 
      // do stuff with sampleBuffer
}

我应该补充一下,我收到了错误:

Error Domain=NSOSStatusErrorDomain Code=-12780 "The operation couldn’t be completed. (OSStatus error -12780.)" UserInfo=0x23fcd0 {AVErrorRecordingSuccessfullyFinishedKey=false}

来自

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error

干杯

【问题讨论】:

标签: iphone ios camera video-capture record


【解决方案1】:

9 年后,Apple 显然不希望这两者一起工作。

但您可以轻松地使用 AVAssetWriter。

您不能同时使用 AVCaptureVideoDataOutput 和 AVCaptureMovieFileOutput。但是您可以使用 AVCaptureVideoDataOutput 对数据进行分析或修改,然后使用 AVAsseWriter 将帧写入文件。

来源:https://developer.apple.com/forums/thread/98113

如何使用 AVAssetWriter 保存带有输出的视频:

Save AVCaptureVideoDataOutput to movie file using AVAssetWriter in Swift

【讨论】:

    【解决方案2】:

    我联系了 Apple 支持的工程师,他告诉我不支持同时使用 AVCaptureVideoDataOutput + AVCaptureMovieFileOutput。不知道他们以后会不会支持,但是他用了“暂时不支持”这个词。

    我鼓励您像我一样 (bugreport.apple.com) 填写一份错误报告/功能请求,因为它们会衡量人们想要某样东西的难易程度,我们也许可以在不久的将来看到这一点。

    【讨论】:

    • 请务必查看上面 Oded 的评论以及可行的解决方案:stackoverflow.com/questions/4944083/…
    • @StanJames 今天仍然是 oded 的解决方法是同时使用 AVCaptureVideoDataOutput + AVCaptureMovieFileOutput 的最佳方法吗?
    • @StanJames 如果目标是同时创建两个视频,您是否可以使用两个 AVAssetWriters(只有 AVCaptureVideoDataOutput)而不是 AVCaptureVideoDataOutput 和 AVCaptureMovieFileOutput?
    • 有没有人更新这是否仍然不可能?
    • @SpaceDog 你能提供一个证明吗?
    【解决方案3】:

    虽然您不能使用AVCaptureVideoDataOutput,但您可以同时使用AVCaptureVideoPreviewLayerAVCaptureMovieFileOutput。请参阅 Apple 网站上的“AVCam”示例。

    在 Xamarin.iOS 中,代码如下所示:

    var session = new AVCaptureSession();
    
    var camera = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Video);
    var  mic = AVCaptureDevice.DefaultDeviceWithMediaType(AVMediaType.Audio);
    if(camera == null || mic == null){
        throw new Exception("Can't find devices");
    }
    
    if(session.CanAddInput(camera)){
        session.AddInput(camera);
    }
    if(session.CanAddInput(mic)){
       session.AddInput(mic);
    }
    
    var layer = new AVCaptureVideoPreviewLayer(session);
    layer.LayerVideoGravity = AVLayerVideoGravity.ResizeAspectFill;
    layer.VideoGravity = AVCaptureVideoPreviewLayer.GravityResizeAspectFill;
    
    cameraView = new UIView();
    cameraView.Layer.AddSublayer(layer);
    
    var filePath = System.IO.Path.Combine( Path.GetTempPath(), "temporary.mov");
    var fileUrl = NSUrl.FromFilename( filePath );
    
    var movieFileOutput = new AVCaptureMovieFileOutput();
    var recordingDelegate = new MyRecordingDelegate();
    session.AddOutput(movieFileOutput);
    
    movieFileOutput.StartRecordingToOutputFile( fileUrl, recordingDelegate);
    

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2017-11-19
      • 2018-12-10
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多