2017-02-01 252 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

你可以有多個音軌的組合物中,可以創建另一首曲目,將有主視頻的音頻:

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

爲了減少您需要創建使用AVAudioMix音量:

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] here inputParameters property not found。 –

+0

@ MMR-Saad我已經糾正它,inputParameters不應該在那裏。 –

+0

你試過這個嗎?仍然出現錯誤 –