Как изменить громкость трека в AVMutableComposition

Я пробовал разные подходы к этой проблеме, но их обработка занимает слишком много времени (изменение файла MP3 для разных объемов).

У меня есть AVMutableComposition, который заполняется несколькими AVMutableCompositionTrack для аудио и видео. Микширование работает нормально, но регулировка громкости звуковой дорожки не работает и не работает при экспорте.

Вот код, который я использую:

AVMutableComposition* mixComposition = [AVMutableComposition composition];
AVURLAsset *soundTrackAsset = [[AVURLAsset alloc]initWithURL:trackTempProcessedURL options:nil];

//ADDING AUDIO
AVMutableCompositionTrack *compositionAudioSoundTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:trackIDSoundTrack];
[compositionAudioSoundTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration) 
                                    ofTrack:[[soundTrackAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
                                     atTime:CMTimeAdd(cmTimeDifference,startTime) error:nil];

NSArray *tracksToDuck = [mixComposition tracksWithMediaType:AVMediaTypeAudio];
NSMutableArray *trackMixArray = [NSMutableArray array];
for (NSInteger i = 0; i < [tracksToDuck count]; i++) {
    AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[tracksToDuck objectAtIndex:i]];
    [trackMix setVolume:volume atTime:kCMTimeZero];   
    [trackMixArray addObject:trackMix];
 }
 audioMix = [AVMutableAudioMix audioMix];
 audioMix.inputParameters = trackMixArray;

//ADDING VIDEO
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:frontAssetURL options:nil];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                atTime:startTime error:nil];

//EXPORTING
_assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName: AVAssetExportPresetPassthrough];

_assetExport.outputFileType = AVFileTypeQuickTimeMovie; 
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;
_assetExport.audioMix = audioMix;  

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) { 
 ...

Все отлично смешивается без аудиомикшера, но когда я пытаюсь изменить громкость, экспорт выдает ошибку:

AVFoundationErrorDomain Error: 11822

person Julio Bailon    schedule 22.02.2012    source источник
comment
Я научился работать с хаком. Объедините аудиофайлы вместе без видео, затем выполните второй проход и объедините видео. Я надеюсь, что есть лучший способ.   -  person Dex    schedule 07.03.2012
comment
вы заставили это работать ..?   -  person Aatish Molasi    schedule 03.05.2012


Ответы (1)


AVMutableAudioMixInputParameters необходимо установить «trackID», чтобы указать, к какой звуковой дорожке должны применяться параметры.

for (NSInteger i = 0; i < [tracksToDuck count]; i++) {
    AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:[tracksToDuck objectAtIndex:i]];
    [trackMix setVolume:volume atTime:kCMTimeZero];   

//+++++code
    AVMutableCompositionTrack * track = [tracksToDuck objectAtIndex:i]
    [trackMix setTrackID:[track trackID]];

    [trackMixArray addObject:trackMix];
}
person haiLong    schedule 01.07.2014