2015-06-24 15 views
5

Ho un'app che quando una vista viene caricata, inizia a catturare video e audio e, al completamento, la registra in entrambi i documenti della cartella, insieme al Rullino foto dell'iPad che sta funzionando. Mi sono assicurato e aggiunto l'input alla sessione sia per audio che per video, ma quando vado a vedere il video salvato, non c'è audio con esso. Qualcuno può individuare qualcosa nel mio codice che indicherebbe dove si trova il problema?L'audio non viene registrato in AVCaptureSession

AGGIORNAMENTO: nessun messaggio di errore mai visualizzato. Tuttavia, ho trovato un comune denominatore. L'audio registrerà, ma solo se la registrazione è 10 secondi o più breve. Se colpisce 11 secondi, l'audio non registra.

NSLog mostra

Finished with error: (null)

-(void)viewWillAppear:(BOOL)animated { 
    NSDate *today = [NSDate date]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"MMM d hh:mm:ss a"]; 
    // display in 12HR/24HR (i.e. 11:25PM or 23:25) format according to User Settings 
    NSString *currentTime = [dateFormatter stringFromDate:today]; 
    NSError* error4 = nil; 
    AVAudioSession* audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryAmbient error:&error4]; 
    OSStatus propertySetError = 0; 
    UInt32 allowMixing = true; 
    propertySetError |= AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(allowMixing), &allowMixing); 

    // Activate the audio session 
    error4 = nil; 
    if (![audioSession setActive:YES error:&error4]) { 
     NSLog(@"AVAudioSession setActive:YES failed: %@", [error4 localizedDescription]); 
    } 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectoryPath = [paths objectAtIndex:0]; 

    session = [[AVCaptureSession alloc] init]; 
    [session beginConfiguration]; 
    session.sessionPreset = AVCaptureSessionPresetMedium; 
    self.navigationController.navigationBarHidden = YES; 

    NSError *error = nil; 

    AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
    NSError *error2 = nil; 
    AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error2]; 


    AVCaptureDevice *device; 
    AVCaptureDevicePosition desiredPosition = AVCaptureDevicePositionBack; 
    // find the front facing camera 

    device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 


    // get the input device 
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 




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

    NSString *archives = [documentsDirectoryPath stringByAppendingPathComponent:@"archives"]; 
    NSString *editedfilename = [[@"ComeOnDown" lastPathComponent] stringByDeletingPathExtension]; 
    NSString *datestring = [[editedfilename stringByAppendingString:@" "] stringByAppendingString:currentTime]; 
    NSLog(@"%@", datestring); 
    NSString *outputpathofmovie = [[archives stringByAppendingPathComponent:datestring] stringByAppendingString:@".mp4"]; 
    NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputpathofmovie]; 
    [session addInput:audioInput]; 
    [session addInput:deviceInput]; 
    [session addOutput:movieFileOutput]; 
    [session commitConfiguration]; 
    [session startRunning]; 




    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
    previewLayer.backgroundColor = [[UIColor blackColor] CGColor]; 
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    previewLayer.connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight; 

    CALayer *rootLayer = [vImagePreview layer]; 
    [rootLayer setMasksToBounds:YES]; 
    [previewLayer setFrame:[rootLayer bounds]]; 
    [rootLayer addSublayer:previewLayer]; 

    [movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self]; 



    //session = nil; 
    if (error) { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: 
            [NSString stringWithFormat:@"Failed with error %d", (int)[error code]] 
                  message:[error localizedDescription] 
                  delegate:nil 
                cancelButtonTitle:@"Dismiss" 
                otherButtonTitles:nil]; 
     [alertView show]; 

    } 
    [super viewWillAppear:YES]; 

} 

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

} 
-(void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ 
    NSLog(@"Finished with error: %@", error); 
} 
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL fromConnections:(NSArray *)connections error:(NSError *)error { 
    //finished 
    NSLog(@"Finished"); 
    NSString *proud = [[NSString alloc] initWithString:[outputFileURL path]]; 
    UISaveVideoAtPathToSavedPhotosAlbum(proud, self, @selector(video:didFinishSavingWithError: contextInfo:), (__bridge void *)(proud)); 
} 
+0

Davvero non vedo il bisogno di sarcasmo. Assegnate 'audioInput' ma non controllate mai' error2'. Dato che 'audioInput' è dove si sta avendo un problema non è un suggerimento ragionevole? – jaket

+0

Nessun messaggio di errore mai visualizzato. Tuttavia, ho trovato un comune denominatore. L'audio registrerà, ma solo se la registrazione è 10 secondi o più breve. Se colpisce 11 secondi, l'audio non registra. – user717452

risposta

7

La risposta è movieFileOutput.movieFragmentInterval = kCMTimeInvalid; A quanto pare è impostato su 10 default, e qualcosa dopo, l'audio non registrerà. Riferito a AVCaptureSession audio doesn't work for long videos

stato facile trovare risposta una volta ho capito il tempo è stato coinvolto con il problema

+0

grazie per la risposta. ma questo non ha alcun senso. –

0
videoFileOutput.movieFragmentInterval = kCMTimeInvalid 

risolto questo per me.

Tuttavia, ho accidentalmente impostato il filmFragmentInterval dopo aver chiamato startRecordingToOutputFileURL. Un'ora dolorosa dopo mi resi conto del mio errore. Per i neofiti come me - annota QUESTA SEQUENZA OBVIZIOSA.

videoFileOutput.movieFragmentInterval = kCMTimeInvalid 
videoFileOutput.startRecordingToOutputFileURL(filePath, recordingDelegate: recordingDelegate)