2017-02-01 10 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]; 
    }); 
} 
]; 
} 

これは私がオーディオとビデオをどのようにマージするかのコードです。あなたが使用AVAudioMixを作成する必要があり、ボリュームを減らすために

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

:あなたは、組成物中の複数のオーディオトラックを持つことができます

答えて

0

、あなたはメインのビデオのオーディオを持つことになり、別のトラックを作成することができ

をその後
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

これは試しましたか?それでもエラーが発生する –