Estoy tratando de implementar la funcionalidad como la de abajo

Final del Video Grabado = «Capturar un vídeo de cámara frontal + Grabar un audio de un vídeo (que estoy jugando a través del reproductor de vídeo)».

Para más comprensión por favor, consulte al adjuntar la captura de pantalla.

Grabación de vídeo en iOS mediante programación

Usando mi bloques de códigos que se indican a continuación: al final lo que se obtiene es Un video pero sin audio.

Pero lo quiero intentar implementar es «Final del video grabado que debe ser combinación de: ‘Un vídeo en el cual se captura de mi cámara frontal + Grabar sólo el audio de archivo de vídeo que estoy jugando.'»

¿Cómo puedo conseguir la funcionalidad anterior?

Este es mi código.

«Grabación» haga Clic con el Botón Método es el siguiente:

-(void) startRecording
{
    [self initCaptureSession];

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                         pathForResource:@"video"
                                         ofType:@"mp4"]];
    [self playMovieAtURL:url];

    [self startVideoRecording];
}

«initCaptureSession» : el Uso de este método estoy grabar un video usando la cámara frontal utilizando
«AVCaptureSession»

-(void) initCaptureSession
{
NSLog(@"Setting up capture session");
captureSession = [[AVCaptureSession alloc] init];
NSLog(@"Adding video input");
AVCaptureDevice *VideoDevice = [self frontFacingCameraIfAvailable];
if (VideoDevice)
{
NSError *error;
videoInputDevice = [AVCaptureDeviceInput deviceInputWithDevice:VideoDevice error:&error];
if (!error)
{
if ([captureSession canAddInput:videoInputDevice])
{
[captureSession addInput:videoInputDevice];
}
else
{
NSLog(@"Couldn't add video input");
}
}
else
{
NSLog(@"Couldn't create video input");
}
}
else
{
NSLog(@"Couldn't create video capture device");
}
NSLog(@"Adding audio input");
AVCaptureDevice *audioCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeMuxed];
NSError *error = nil;
AVCaptureDeviceInput *audioInput = [AVCaptureDeviceInput deviceInputWithDevice:audioCaptureDevice error:&error];
if (audioInput)
{
[captureSession addInput:audioInput];
}
NSLog(@"Adding movie file output");
movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
movieFileOutput.minFreeDiskSpaceLimit = 1024 * 1024;    //<<SET MIN FREE SPACE IN BYTES FOR RECORDING TO CONTINUE ON A VOLUME
if ([captureSession canAddOutput:movieFileOutput])
[captureSession addOutput:movieFileOutput];
[self CameraSetOutputProperties];           //(We call a method as it also has to be done after changing camera)
NSLog(@"Setting image quality");
[captureSession setSessionPreset:AVCaptureSessionPresetMedium];
if ([captureSession canSetSessionPreset:AVCaptureSessionPreset640x480])     //Check size based configs are supported before setting them
[captureSession setSessionPreset:AVCaptureSessionPreset640x480];
[captureSession startRunning];
}
- (void) CameraSetOutputProperties
{
AVCaptureConnection *CaptureConnection = nil;
NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"5.0.0" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
//OS version >= 5.0.0
CaptureConnection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
} else {
//OS version < 5.0.0
CaptureConnection = [self connectionWithMediaType:AVMediaTypeVideo fromConnections:[movieFileOutput connections]];
}
//Set landscape (if required)
if ([CaptureConnection isVideoOrientationSupported])
{
AVCaptureVideoOrientation orientation =  AVCaptureVideoOrientationPortrait;//AVCaptureVideoOrientationLandscapeRight;      //<<<<<SET VIDEO ORIENTATION IF LANDSCAPE
[CaptureConnection setVideoOrientation:orientation];
}
}

«-(void) playMovieAtURL: (NSURL*) theURL » mediante el uso de este método que estoy jugando a un video

-(void) playMovieAtURL: (NSURL*) theURL
{
player =
[[MPMoviePlayerController alloc] initWithContentURL: theURL];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
player.scalingMode = MPMovieScalingModeAspectFill;
player.controlStyle = MPMovieControlStyleNone;
[player prepareToPlay];
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(myMovieFinishedCallback:)
name: MPMoviePlayerPlaybackDidFinishNotification
object: player];
player.view.frame=CGRectMake(10, 30, 300, 200);
[self.view addSubview:player.view];
[player play];
}

«startVideoRecording» la utilización de este método que he empezado a grabar el vídeo Final.

- (void) startVideoRecording
{
//Create temporary URL to record to
NSString *outputPath = [[NSString alloc] initWithFormat:@"%@%@", NSTemporaryDirectory(), @"output.mov"];
NSURL *outputURL = [[NSURL alloc] initFileURLWithPath:outputPath];
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:outputPath])
{
NSError *error;
if ([fileManager removeItemAtPath:outputPath error:&error] == NO)
{
//Error - handle if required
NSLog(@"file remove error");
}
}
//Start recording
[movieFileOutput startRecordingToOutputFileURL:outputURL recordingDelegate:self];
}
- (void)captureOutput:(AVCaptureFileOutput *)captureOutput
didFinishRecordingToOutputFileAtURL:(NSURL *)outputFileURL
fromConnections:(NSArray *)connections
error:(NSError *)error
{
NSLog(@"didFinishRecordingToOutputFileAtURL - enter");
BOOL RecordedSuccessfully = YES;
if ([error code] != noErr)
{
//A problem occurred: Find out if the recording was successful.
id value = [[error userInfo] objectForKey:AVErrorRecordingSuccessfullyFinishedKey];
if (value)
{
RecordedSuccessfully = [value boolValue];
}
}
if (RecordedSuccessfully)
{
//----- RECORDED SUCCESSFULLY -----
NSLog(@"didFinishRecordingToOutputFileAtURL - success");
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputFileURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:outputFileURL
completionBlock:^(NSURL *assetURL, NSError *error)
{
if (error)
{
NSLog(@"File save error");
}
else
{
recordedVideoURL=assetURL;
}
}];
}
else
{
NSString *assetURL=[self copyFileToDocuments:outputFileURL];
if(assetURL!=nil)
{
recordedVideoURL=[NSURL URLWithString:assetURL];
}
}
}
}
InformationsquelleAutor Wolverine | 2013-06-14

2 Comentarios

  1. 4

    //Añadir algo de código adicional para los siguientes métodos de «1er Método»

      -(void) playMovieAtURL: (NSURL*) theURL
    {
    [player play];
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *err = nil;
    [audioSession setCategory :AVAudioSessionCategoryPlayAndRecord error:&err];
    if(err)
    {
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo]     description]);
    return;
    }
    [audioSession setActive:YES error:&err];
    err = nil;
    if(err){
    NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    return;
    }
    recordSetting = [[NSMutableDictionary alloc] init];
    [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
    [recordSetting setValue:[NSNumber numberWithFloat:16000.0] forKey:AVSampleRateKey];
    [recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
    recorderFilePath = [NSString stringWithFormat:@"%@/MySound.caf", DOCUMENTS_FOLDER];
    NSLog(@"recorderFilePath: %@",recorderFilePath);
    audio_url = [NSURL fileURLWithPath:recorderFilePath];
    err = nil;
    NSData *audioData = [NSData dataWithContentsOfFile:[audio_url path] options: 0 error:&err];
    if(audioData)
    {
    NSFileManager *fm = [NSFileManager defaultManager];
    [fm removeItemAtPath:[audio_url path] error:&err];
    }
    err = nil;
    recorder = [[ AVAudioRecorder alloc] initWithURL:audio_url settings:recordSetting error:&err];
    if(!recorder)
    {
    NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]);
    UIAlertView *alert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
    message: [err localizedDescription]
    delegate: nil
    cancelButtonTitle:@"OK"
    otherButtonTitles:nil];
    [alert show];
    return;
    }
    //prepare to record
    [recorder setDelegate:self];
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    BOOL audioHWAvailable = audioSession.inputAvailable;
    if (! audioHWAvailable)
    {
    UIAlertView *cantRecordAlert =
    [[UIAlertView alloc] initWithTitle: @"Warning"
    message: @"Audio input hardware not available"
    delegate: nil
    cancelButtonTitle:@"OK"
    otherButtonTitles:nil];
    [cantRecordAlert show];
    return;
    }
    }

    //2º método

    -(void) stopVideoRecording
    {
    [player.view removeFromSuperview];
    [player stop];
    [movieFileOutput stopRecording];
    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audio_url options:nil];
    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:outputURL options:nil];
    mixComposition = [AVMutableComposition composition];
    AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
    preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
    ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
    atTime:kCMTimeZero error:nil];
    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
    preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
    ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
    atTime:kCMTimeZero error:nil];
    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
    presetName:AVAssetExportPresetPassthrough];
    AVAssetTrack *videoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    [compositionVideoTrack setPreferredTransform:videoTrack.preferredTransform];
    }

    //Final De Juego De Vídeo

    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:mixComposition];
    AVPlayer *player1 = [AVPlayer playerWithPlayerItem:playerItem];
    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player1];
    [playerLayer setFrame:CGRectMake(0, 0, 320, 480)];
    [[[self view] layer] addSublayer:playerLayer];
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    [player1 play];
    player1.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    • puede usted por favor enviar todo el código en github ..? así que será fácil para nosotros para conseguir exacta de demostración para el uso
  2. 1

    Creo que esto puede ayudar a usted..

    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];
    AVMutableComposition* mixComposition = [AVMutableComposition composition];
    AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
    preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
    ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
    atTime:kCMTimeZero error:nil];
    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
    preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
    ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
    atTime:kCMTimeZero error:nil];
    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
    presetName:AVAssetExportPresetPassthrough];   
    NSString* videoName = @"export.mov";
    NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
    NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
    {
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
    }
    _assetExport.outputFileType = @"com.apple.quicktime-movie";
    DLog(@"file type %@",_assetExport.outputFileType);
    _assetExport.outputURL = exportUrl;
    _assetExport.shouldOptimizeForNetworkUse = YES;
    [_assetExport exportAsynchronouslyWithCompletionHandler:
    ^(void ) {      
    //your completion code here
    }       
    }
    ];

    Cortesía:-https://stackoverflow.com/a/3456565/1865424

    y también se puede comprobar el código para la grabación de vídeo de la cámara frontal.

    -(IBAction)cameraLibraryButtonClick:(id)sender{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {              
    UIImagePickerController *videoRecorder = [[UIImagePickerController alloc]init];  
    videoRecorder.delegate = self;
    NSArray *sourceTypes = [UIImagePickerController availableMediaTypesForSourceType:videoRecorder.sourceType];
    NSLog(@"Available types for source as camera = %@", sourceTypes);
    if (![sourceTypes containsObject:(NSString*)kUTTypeMovie] ) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil 
    message:@"Device Not Supported for video Recording."                                                                       delegate:self 
    cancelButtonTitle:@"Yes" 
    otherButtonTitles:@"No",nil];
    [alert show];
    [alert release];
    return;
    }
    videoRecorder.cameraDevice=UIImagePickerControllerCameraDeviceFront;
    videoRecorder.sourceType = UIImagePickerControllerSourceTypeCamera;
    videoRecorder.mediaTypes = [NSArray arrayWithObject:(NSString*)kUTTypeMovie];           
    videoRecorder.videoQuality = UIImagePickerControllerQualityTypeLow;
    videoRecorder.videoMaximumDuration = 120;
    self.imagePicker = videoRecorder;                 
    [videoRecorder release];
    [self presentModalViewController:self.imagePicker animated:YES];
    newMedia = YES;
    }
    else {
    [self displaysorceError];
    }
    }

    Cortesía:-https://stackoverflow.com/a/14154289/1865424

    Si estos no funcionan para usted..dejenme saber..Pero creo que esto va a ayudarte..

    • Queremos implementar de vídeo y grabación de audio en la pantalla del iphone ,gracias
    • esto le ayudará a [email protected]

Dejar respuesta

Please enter your comment!
Please enter your name here