2015-05-23 65 views
0

如何使用Objective-C iOS以编程方式向对话视频添加配音评论?我尝试使用AVMutableComposition类将录制音频合并到对话视频中,但似乎将它们混合在一起(视频背景音合并后完全丢失),无法使用它进行配音。如何在ios中以编程方式将视频添加到视频中?

有人可以帮忙吗?

这里是我使用的代码:

-(void)mergeAudio:(NSString *)audioPath toVideo:(NSString *)videoPath 
{ 
    AVURLAsset* videoAsset; 
    AVURLAsset* audioAsset; 

    AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

    NSURL *audio_url = [NSURL fileURLWithPath:audioPath]; 
    audioAsset = [[AVURLAsset alloc]initWithURL:audio_url options:nil]; 
    CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); 

    AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

    NSURL *video_url = [NSURL fileURLWithPath:videoPath]; 
    videoAsset = [[AVURLAsset alloc]initWithURL:video_url options:nil]; 
    CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration); 

    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *docsDir = [dirPaths objectAtIndex:0]; 
    NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"dub.mov"]]; 
    NSURL *outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]){ 
      [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 
    } 
    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
    _assetExport.outputFileType = @"com.apple.quicktime-movie"; 
    _assetExport.outputURL = outputFileUrl; 

    [_assetExport exportAsynchronouslyWithCompletionHandler: 
      ^(void) { 
        dispatch_async(dispatch_get_main_queue(), ^{ 
        // Do export finish stuff 
      }); 
    }]; 
} 
+0

“我尝试使用AVMutableComposition类将录制音频合并到对话视频中,但似乎将它们混合在一起(视频背景声音在合并后完全丢失)”然后你做错了,因为AVMutableVideoComposition正是你如何做到这一点的,如果您记得使用视频背景音,它不会丢失视频背景音。如果您需要特定帮助,请显示您的代码。 – matt

+0

@matt我更新了代码,我使用iphone摄像头捕捉视频,然后将该视频与mp3歌曲合并,结果是一个带有没有原始视频声音的mp3歌曲的新视频文件,您能告诉我哪里出了错? – UmbalaAZ

+0

是的,我当然可以。 :) – matt

回答

0

这正是我在我的意见建议。您可以在作品中创建两个音轨:配音音轨(从文件audioPath获取)和视频中的视频轨道(从videoPath的文件中获取)。

但是您忘了从视频中获取音频音轨!因此,它不在最终作品中。

+0

我从视频文件中提取音频,然后混合两个音频文件与视频,它的工作,但它的确意味着视频的声音在混合视频和第一个音频文件时丢失,因此我需要从视频中提取音频和合并他们在一起,你有更好的办法吗?而我的问题仍然是为什么视频的声音丢失了? – UmbalaAZ

+0

视频的声音不会“丢失”。它从来没有!您获取了视频轨道,但没有获取音轨。 - 你不需要合并任何东西。您将拥有两条音轨:配音音轨和从视频中获取的音轨。请参阅我书中的讨论:我完全按照您要做的操作(将视频片段添加到视频中):http://www.apeth.com/iOSBook/ch28.html#_introduction_to_av_foundation_video – matt

+0

是的,如您所说“...以及从视频中提取的音轨”是哪部分需要从视频中提取,然后将它们组合到配音轨道上? – UmbalaAZ