1

我一直在尝试使用 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播放录制的音频文件只有视频的图像,没有声音,为什么是这样吗?

4

1 回答 1

1

您必须将视频中的音频添加为单独的轨道。因此,您将拥有一个视频轨道和两个音频轨道。在您的代码中,您没有添加视频中的音频。

于 2013-03-28T16:40:00.887 回答