2017-02-01 2 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] здесь свойство inputParameters не найдено. –

+0

@ MMR-Saad Я исправил его, inputParameters не должно быть там. –

+0

Вы попробовали это? все еще его ошибка получения –