AVMutableComposition删除视频声轨

时间:2013-03-11 12:40:51

标签: ios objective-c xcode ios4 avmutablecomposition

我一直在尝试使用AVMutableComposition混合音频(录制)和视频(.mp4),这意味着我需要在混合后并行播放2个文件,这是我使用的代码: temporaryRecFile是记录的文件url路径 audiosURL是视频文件URL路径

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;

             }
         }
         ];

因此,导出的视频正在播放带有视频的录制音频,但视频的声道已被删除,因此导出的.mov正在播放带有视频图像的录制音频文件听起来,为什么会这样?

1 个答案:

答案 0 :(得分:1)

您必须将视频中的音频添加为单独的曲目。所以你将有一个视频轨道和两个音轨。在您的代码中,您没有添加视频中的音频。