i have been trying to mix an audio (recorded) with a video (.mp4) using the AVMutableComposition, which means i need the 2 files to play in parallel after mixing, here is the code i used: temporaryRecFile is the recorded file url path audiosURL is the video file url path

NSURL *audiosURL =[[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"dam3.mp4"] ofType:nil]];

        NSLog(@"SOMEDATA    IS THERE ");
        AVURLAsset* audioAsset  = [[AVURLAsset alloc]initWithURL:temporaryRecFile options:nil];
        AVURLAsset* audio2Asset = [[AVURLAsset alloc]initWithURL:audiosURL options:nil];

        AVMutableComposition* mixComposition = [AVMutableComposition composition];

    AVMutableCompositionTrack *compositionCommentary2Track = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    [compositionCommentary2Track insertTimeRange:CMTimeRangeMake(kCMTimeZero, audio2Asset.duration) ofTrack:[[audio2Asset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

        NSLog(@"audio =%@",audioAsset);
        AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] 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 = AVFileTypeQuickTimeMovie;
    //@"com.apple.quicktime-movie";
        NSLog(@"file type %@",_assetExport.outputFileType);
        _assetExport.outputURL = exportUrl;
        _assetExport.shouldOptimizeForNetworkUse = YES;



        [_assetExport exportAsynchronouslyWithCompletionHandler:
         ^(void )
         {
             switch (_assetExport.status)
             {
                 case AVAssetExportSessionStatusCompleted:
                     //   export complete

                     NSLog(@"Export Complete");
                    // From Here I want play movie using MPMoviePlayerController.<<<---------
                     NSString  *fileNamePath = @"sound_record.mov";
                     NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
                     NSString  *documentsDirectory = [paths  objectAtIndex:0];
                     NSString  *oldappSettingsPath = [documentsDirectory stringByAppendingPathComponent:fileNamePath];


                     if ([[NSFileManager defaultManager] fileExistsAtPath:oldappSettingsPath]) {

                         NSFileManager *fileManager = [NSFileManager defaultManager];
                         [fileManager removeItemAtPath: oldappSettingsPath error:NULL];

                     }
                     NSURL *documentDirectoryURL = [NSURL fileURLWithPath:oldappSettingsPath];
                     [[NSFileManager defaultManager] copyItemAtURL:exportUrl toURL:documentDirectoryURL error:nil];
                     [audioAsset release];
                     [audio2Asset release];
                     [_assetExport release];
                     [self performSelectorOnMainThread:@selector(playVideo:) withObject:documentDirectoryURL waitUntilDone:NO];

                     break;
                 case AVAssetExportSessionStatusFailed:
                     NSLog(@"Export Failed");
                     NSLog(@"ExportSessionError: %@", [_assetExport.error localizedDescription]);

                     //                export error (see exportSession.error)
                     break;
                 case AVAssetExportSessionStatusCancelled:
                     NSLog(@"Export Failed");
                     NSLog(@"ExportSessionError: %@", [_assetExport.error localizedDescription]);

                     //                export cancelled  
                     break;

             }
         }
         ];

As a result, the exported video is playing the recorded audio with the video successfully, but the sound track of the video was removed, so the exported .mov is playing the recorded audio file with the image of the video only without its sound, why is that happening?

有帮助吗?

解决方案

You will have to add the audio from the video as a separate track. So you will have one video track and two audio tracks. In your code you don't have the audio from the video being added.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top