2010-10-27 16 views
4

J'essaie d'enregistrer une vidéo de la caméra frontale de l'iPhone 4 en utilisant AVFoundation Framework avec l'aide d'échantillons WWDC que j'ai obtenu à partir du programme développeur iPhone. Mais je n'arrive toujours pas à le faire fonctionner .. la vidéo n'est pas enregistrée ou mayb enregistrée dans ma bibliothèque iPhone ... voici le code que j'essaie d'utiliser ... il serait vraiment utile si quelqu'un culd m'aider avec le problème j'ai??Enregistrement vidéo de la caméra avant 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 

Répondre

1
  1. Vous jetez les erreurs - comment pouvez-vous déboguer si vous faites cela?

  2. Vous devez être plus précis dans ce qui est/ne se passe pas. Quelles méthodes sont appelées? Quelles erreurs sont signalées par le SDK (le cas échéant)? etc ...

+0

+1. N'ignorez pas les erreurs pendant le débogage. – JoePasq

0

vous avez publié la référence à movieFileOutput dans - (void) recordVideo; et vous utilisez encore movieFileOutput libéré dans - (void) startRecording ainsi que autres fonctions. Il vaut mieux ne pas libérer l'objet que vous utilisez.