2010-10-27 106 views
4

我想從iPhone開發人員計劃獲得的WWDC樣本的幫助下,使用AVFoundation Framework從iPhone 4的前置攝像頭錄製視頻。但我仍然無法得到它的工作..視頻沒有得到記錄或mayb保存在我的iPhone庫...這裏是我想要使用的代碼...如果有人幫助我解決問題,這將是非常有益的我有?前置攝像頭視頻錄製iPhone 4?

-(void)recordVideo 
{ 

AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:[self backFacingCamera] error:nil]; 

AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

AVCaptureSession *session = [[AVCaptureSession alloc] init]; 

[session addInput:videoInput]; 

[session addOutput:movieFileOutput]; 

[movieFileOutput release]; 


if (![session isRunning]) 
{ 
[self performSelector:@selector(startRecording) withObject:nil afterDelay:1.0]; 
[session startRunning]; 

} 

} 

- (void) startRecording 
{ 
    NSLog(@"start recording"); 


AVCaptureConnection *videoConnection = [playVideo connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]]; 
if ([videoConnection isVideoOrientationSupported]) { 
    [videoConnection setVideoOrientation:[self orientation]]; 
} 

[[self movieFileOutput] startRecordingToOutputFileURL:[self tempFileURL] 
            recordingDelegate:self]; 
} 
- (void) stopRecording 
{ 
    NSLog(@"stop recording"); 

    [[self movieFileOutput] stopRecording]; 
} 
- (NSURL *) tempFileURL 
{ 
    NSLog(@"temp file url"); 
    NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]; 
    NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:outputPath]) { 
    NSLog(@"exists"); 
    } 
    [outputPath release]; 
    return [outputURL autorelease]; 
} 
- (void) setConnectionWithMediaType:(NSString *)mediaType enabled:(BOOL)enabled; 
{ 

    [[playVideo connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self movieFileOutput] connections]] setEnabled:enabled]; 
} 

+ (AVCaptureConnection *)connectionWithMediaType:(NSString *)mediaType fromConnections:(NSArray *)connections; 
{ 
    NSLog(@"connection with media type"); 
    for (AVCaptureConnection *connection in connections) { 
     for (AVCaptureInputPort *port in [connection inputPorts]) { 
      if ([[port mediaType] isEqual:mediaType]) { 
       return [[connection retain] autorelease]; 
      } 
     } 
    } 
    return nil; 
} 
@implementation recordVideo (Internal) 

- (AVCaptureDevice *) cameraWithPosition:(AVCaptureDevicePosition) position 
{ 
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 
    for (AVCaptureDevice *device in devices) { 
     if ([device position] == position) { 
      return device; 
     } 
    } 
    return nil; 
} 
- (AVCaptureDevice *) backFacingCamera 
{ 
    NSLog(@"back"); 
    return [self cameraWithPosition:AVCaptureDevicePositionBack]; 
} 
- (AVCaptureDevice *) frontFacingCamera 
{ 
    NSLog(@"front "); 
    return [self cameraWithPosition:AVCaptureDevicePositionFront]; 
} 

@end 
@implementation recordVideo (AVCaptureFileOutputRecordingDelegate) 

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

} 

- (void)    captureOutput:(AVCaptureFileOutput *)captureOutput 
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL 
        fromConnections:(NSArray *)connections 
           error:(NSError *)error 
{ 
    NSLog(@"did finish recording output file"); 


    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) 
    { 
     [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL 
            completionBlock:^(NSURL *assetURL, NSError *error){ 
             if (error && [delegate respondsToSelector:@selector(assetLibraryError:forURL:)]) { 
              [delegate assetLibraryError:error forURL:assetURL]; 
             } 
            }]; 
    } 
    else { 

     } 

    [library release];  


} 
@end 

回答

1
  1. 你扔掉的錯誤 - 你怎麼能如果你這樣做調試?

  2. 您需要更具體地瞭解什麼是/沒有發生。哪些方法被稱爲? SDK報告了哪些錯誤(如果有)? etc ...

+0

+1。調試時不要忽略錯誤。 – JoePasq 2012-03-13 19:38:22

0

你已經發布了對movieFileOutput的引用 - (void)recordVideo; ,並且您仍然在使用發佈的movieFileOutput - (void)startRecording以及 其他函數。最好不要釋放您正在使用的對象。

相關問題