2010-10-19 44 views
18

我需要能夠讓AVCaptureVideoDataOutputAVCaptureMovieFileOutput同時工作。下面的代碼工作,但是,視頻錄製不。調用startRecordingToOutputFileURL後,直接調用didFinishRecordingToOutputFileAtURL代表。現在,如果我只需註釋掉行刪除從 AVCaptureSessionAVCaptureVideoDataOutput同時AVCaptureVideoDataOutput和AVCaptureMovieFileOutput

[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 

乾杯

+1

有做這個證明工作方式。更多在這個問題: http://stackoverflow.com/questions/4944083/can-use-avcapturevideodataoutput-and-avcapturemoviefileoutput-at-the-same-time – 2012-06-17 11:49:32

回答

29

我在蘋果公司的支持接觸的工程師,他告訴我,同時AVCaptureVideoDataOutput + AVCaptureMovieFileOutput不支持使用。我不知道他們將來是否會支持它,但他使用了「此時不支持」這個詞。

我鼓勵你填寫一個bug報告/功能請求,就像我一樣(bugreport.apple.com),因爲它們衡量人們想要什麼東西的難度,我們也許可以在不久的將來看到這一點。

+2

請務必在工作解決方案上面看到Oded的評論:http: //stackoverflow.com/questions/4944083/can-use-avcapturevideodataoutput-and-avcapturemoviefileoutput-at-the-same-time – 2014-06-06 20:56:08

+0

@StanJames今天仍然如此oded的解決方法是同時使用AVCaptureVideoDataOutput + AVCaptureMovieFileOutput的最佳方法? – Crashalot 2016-02-06 23:18:34

+0

@StanJames如果目標是同時創建兩個視頻,可以使用兩個AVAssetWriters(僅限AVCaptureVideoDataOutput)而不是AVCaptureVideoDataOutput和AVCaptureMovieFileOutput? – Crashalot 2016-02-06 23:34:53

2

雖然你不能使用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); 
+0

以及如何從AVCaptureVideoPreviewLayer獲取原始幀緩衝區?... – user924 2018-02-06 09:55:46

相關問題