2010-10-14 6 views
4

Je développe une application avec l'aide de l'exemple de code de l'exemple AVCamDemo WWDC 2010. Dans l'application, j'ai besoin d'enregistrer une vidéo de la caméra frontale de l'iPhone, mais comme le nouvel iPhone 4 n'est pas disponible chez moi, je ne suis pas en mesure de tester le code correctement.Enregistrement vidéo en utilisant AVFoundation Framework iPhone?

Je serais vraiment reconnaissant si quelqu'un peut me donner une tête si je vais dans la bonne direction ou non. Le code limité que je pouvais tester sur mon iPhone 3G (mis à niveau vers iOS 4.1) se bloque quand je mis le AVCaptureSession, comme indiqué dans le code ci-dessous:

- (void)recordVideo 
{ 
    NSLog(@"video recording on"); 

    AVCaptureDevice *videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:nil]; 
    AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 

    [movieFileOutput release]; 

    AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    [session addInput:videoInput]; 
    [session addOutput:movieFileOutput]; 
    [self setSession:session]; // crashes 

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


- (void)startRecording 
{ 

    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 
{ 

    NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"]; 
    NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if ([fileManager fileExistsAtPath:outputPath]) { 
     NSLog(@"file saved"); 
    } 
    [outputPath release]; 
    return [outputURL autorelease]; 
} 

+ (AVCaptureConnection *)connectionWithMediaType:(NSString *)mediaType fromConnections:(NSArray *)connections; 
{ 
    for (AVCaptureConnection *connection in connections) { 
     for (AVCaptureInputPort *port in [connection inputPorts]) { 
      if ([[port mediaType] isEqual:mediaType]) { 
       return [[connection retain] autorelease]; 
      } 
     } 
    } 
    return nil; 
} 

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput 
didStartRecordingToOutputFileAtURL:(NSURL *)fileURL 
        fromConnections:(NSArray *)connections 
{ 

} 

- (void)captureOutput:(AVCaptureFileOutput *)captureOutput 
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL 
        fromConnections:(NSArray *)connections 
           error:(NSError *)error 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 

    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL]) 
    { 
     [library writeVideoAtPathToSavedPhotosAlbum:outputFileURL 
            completionBlock:^(NSURL *assetURL, NSError *error)]; 
    } 

    [library release];  
} 

Répondre

4

movieFileOutput est libéré immédiatement après qu'il a été alloué. (ligne 9)

Questions connexes