2017-02-01 11 views
0

비디오를 다른 오디오와 잘 결합 할 수 있습니다. 그러나 최종 출력 비디오에는 메인 비디오 사운드가 필요합니다. 즉, 낮은 볼륨으로 메인 비디오 사운드를 설정하려고합니다. 어떻게해야합니까?메인 비디오 사운드와 오디오 비디오 병합

-(void)mergeAndSave 
{ 
//Create AVMutableComposition Object which will hold our multiple AVMutableCompositionTrack or we can say it will hold our video and audio files. 
AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

//Now first load your audio file using AVURLAsset. Make sure you give the correct path of your videos. 
NSURL *audio_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Asteroid_Sound" ofType:@"mp3"]]; 
AVURLAsset *audioAsset = [[AVURLAsset alloc]initWithURL:audio_url options:nil]; 
CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration); 

//Now we are creating the first AVMutableCompositionTrack containing our audio and add it to our AVMutableComposition object. 
AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

//Now we will load video file. 
NSURL *video_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Asteroid_Video" ofType:@"m4v"]]; 
AVURLAsset *videoAsset = [[AVURLAsset alloc]initWithURL:video_url options:nil]; 
CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,audioAsset.duration); 

//Now we are creating the second AVMutableCompositionTrack containing our video and add it to our AVMutableComposition object. 
AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
[a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

//decide the path where you want to store the final video created with audio and video merge. 
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docsDir = [dirPaths objectAtIndex:0]; 
NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"FinalVideo.mov"]]; 
NSURL *outputFileUrl = [NSURL fileURLWithPath:outputFilePath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath]) 
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil]; 

//Now create an AVAssetExportSession object that will save your final video at specified path. 
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(), ^{ 
     [self exportDidFinish:_assetExport]; 
    }); 
} 
]; 
} 

이것은 오디오와 비디오를 병합하는 코드입니다.

답변

0

당신은 당신은 주 비디오의 오디오있을 것입니다 다른 트랙을 만들 수 컴포지션에서 여러 오디오 트랙을 가질 수 있습니다

당신이 사용 AVAudioMix을 만들어야 볼륨 줄이기 위해
AVMutableCompositionTrack *mainVideoAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[mainVideoAudioTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 

:

를 그런 다음
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 

//Instruction for main video audio track 
AVMutableAudioMixInputParameters *mainAudioMixParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:mainVideoAudioTrack]; 
[mainAudioMixParams setVolume:0.25 atTime:kCMTimeZero]; 

//Instruction for background audio track 
AVMutableAudioMixInputParameters *b_audioMixParams = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:b_compositionAudioTrack]; 
[b_audioMixParams setVolume:1 atTime:kCMTimeZero]; 

audioMix.inputParameters = @[b_audioMixParams, mainAudioMixParams]; 

당신을 내보내는도록 수출 세션에 오디오 믹스를 추가해야합니다

_assetExport.audioMix = audioMix; 
+0

[b_audioMixParams.inputParameters, mainAudioMixParams.inputParameters] inputParameters 속성을 찾을 수 없습니다. –

+0

@ MMR-Saad 나는 그것을 고치고, inputParameters는 없어야한다. –

+0

이것을 시도 했습니까? 여전히 점점 오류가 –