首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >同时使用AVCaptureVideoDataOutput和AVCaptureMovieFileOutput

同时使用AVCaptureVideoDataOutput和AVCaptureMovieFileOutput
EN

Stack Overflow用户
提问于 2010-10-19 21:32:04
回答 1查看 12.6K关注 0票数 26

我需要能够让AVCaptureVideoDataOutputAVCaptureMovieFileOutput同时工作。下面的代码可以工作,但是视频录制不能。在调用startRecordingToOutputFileURL之后直接调用didFinishRecordingToOutputFileAtURL委托。现在,如果我只需注释掉这行代码,就可以从AVCaptureSession中删除AVCaptureVideoDataOutput

[captureSession addOutput:captureDataOutput];

视频录制可以正常工作,但是SampleBufferDelegate没有被调用(这是我需要的)。

怎样才能让AVCaptureVideoDataOutputAVCaptureMovieFileOutput同时工作呢?

代码语言:javascript
复制
- (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
}

我应该补充说,我得到了错误:

代码语言:javascript
复制
Error Domain=NSOSStatusErrorDomain Code=-12780 "The operation couldn’t be completed. (OSStatus error -12780.)" UserInfo=0x23fcd0 {AVErrorRecordingSuccessfullyFinishedKey=false}

从…

代码语言:javascript
复制
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-14 02:35:55

我联系了苹果技术支持的一位工程师,他告诉我不支持同时使用AVCaptureVideoDataOutput + AVCaptureMovieFileOutput。我不知道他们将来是否会支持它,但他用了“目前不支持”这个词。

我鼓励你填写一份关于这方面的bug报告/功能请求,就像我做的(bugreport.apple.com)一样,因为他们衡量了人们想要的东西有多难,我们可能会在不久的将来看到这一点。

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3968879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档