2010-10-27 1 views
4

Я пытаюсь записать видео с передней камеры iPhone 4 с помощью AVFoundation Framework с помощью образцов WWDC, которые я получил от программы разработчиков iPhone. Но я все еще не могу заставить его работать. Видео не записывается или сохраняется в моей библиотеке 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 (если есть)? и т. д.

+0

+1. Не игнорируйте ошибки при отладке. – JoePasq

0

Вы выпустили ссылку на movieFileOutput in - (void) recordVideo; , и вы по-прежнему используете освобожденный файл movieFileOutput in - (void) startRecording, а также других функций. Лучше не освобождать объект, который вы используете.

 Смежные вопросы

  • Нет связанных вопросов^_^