iOS - изменить громкость для каждого AVAssetTrack

У меня есть несколько аудиофайлов, которые мне нужно вставить в файл AVMutableComposition. Каждый звук имеет разную громкость. Для этого я создал AVMutableTrackComposition и AVAssetTrack для каждого аудиофайла. Поэтому я изменяю громкость для каждой дорожки, используя экземпляр AVMutableAudioMix.

let composition = AVMutableComposition()
var trackMixArray = NSMutableArray()

for audio in layer{
   let trackAudio:AVMutableCompositionTrack = composition.addMutableTrackWithMediaType(AVMediaTypeAudio, preferredTrackID: CMPersistentTrackID())

   let file = project.stringByAppendingPathComponent(audio.name)
   let soundAsset = AVURLAsset(URL: NSURL(fileURLWithPath: file), options: option as [NSObject : AnyObject])
   let sounds = soundAsset.tracksWithMediaType(AVMediaTypeAudio)
   var sound:AVAssetTrack = sounds[0] as! AVAssetTrack
   let duration:CMTime = sound.timeRange.duration

   let audioTimeRange:CMTimeRange = CMTimeRangeFromTimeToTime(kCMTimeZero, duration)
   let start:CMTime = CMTimeMakeWithSeconds(audio.start.toDouble()!, 600)
   let stop:CMTime = CMTimeMakeWithSeconds(audio.stop.toDouble()!, 600)

   let trackMix = AVMutableAudioMixInputParameters(track: trackAudio)
   trackMix.setVolume(audio.volume, atTime: kCMTimeZero)
   trackMixArray.addObject(trackMix)

   trackAudio.insertTimeRange(audioTimeRange, ofTrack: sound, atTime: start, error: nil)
 }

let audioMix = AVMutableAudioMix()
audioMix.inputParameters = trackMixArray as [AnyObject]

Использование одного AVMutableCompositionTrack с несколькими связанными с ним AVAssetTrack не позволяет мне изменять громкость для каждой дорожки.

 let trackMix = AVMutableAudioMixInputParameters(track: sound)
 trackMix.setVolume(audio.volume, atTime: kCMTimeZero)
 trackMixArray.addObject(trackMix)

Можно ли изменить громкость прямо из AVAssetTrack?


person Marco    schedule 12.05.2015    source источник
comment
Что вы имеете в виду под не позволяет мне изменить громкость для каждой дорожки? Что вы подразумеваете под изменением громкости напрямую? Четко объясните, что вы пытаетесь сделать.   -  person matt    schedule 12.05.2015
comment
Я могу изменить громкость для каждого AVMutableCompositionTrack, но не для каждого AVAssetTrack. Для этого мне нужно назначить каждый AVAssetTrack AVMutableCompositionTrack и изменить громкость с AVMutableCompositionTrack.   -  person Marco    schedule 14.05.2015
comment
Моя цель состоит в том, чтобы использовать одну причину AVMutableCompositionTrack, используя большую ее часть для замедления объявления AVPlayerItem.   -  person Marco    schedule 14.05.2015
comment
Я все еще не вижу проблемы. Вы прекрасно объяснили, как установить предпочтительную громкость дорожки активов, перейдя к подклассу изменчивой дорожки композиции, где она является изменяемой. Так что просто сделай это. Изменяемая дорожка композиции является дорожкой объекта; вы можете использовать первое везде, где можно использовать последнее.   -  person matt    schedule 14.05.2015
comment
Учебный класс. Подкласс. Ты видишь?   -  person matt    schedule 14.05.2015
comment
Вы когда-нибудь догадывались об этом?   -  person Becky Hansmeyer    schedule 12.11.2017
comment
Может ли кто-нибудь предложить мне, как мы можем установить громкость для каждого видеоклипа?   -  person Anand Gautam    schedule 28.02.2019


Ответы (1)


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

    ... 
    AVAssetExportSession Magic
    ...
    generalExporter = [[AVAssetExportSession alloc] initWith...
    generalExporter.audioMix = audioMix;

Это должно помочь вам изменить громкость в каждой дорожке, просто измените ее на быструю.

РЕДАКТИРОВАТЬ: у каждого AVMutableCompositionTrack есть сегменты, у каждого сегмента есть startTime и продолжительность, вы можете использовать AVMutableAudioMixInputParameters для изменения громкости для каждого CMTimeRange

 - (void)setVolumeRampFromStartVolume:(float)startVolume
                         toEndVolume:(float)endVolume
                           timeRange:(CMTimeRange)timeRange
person DimaC    schedule 12.05.2015
comment
это изменяет громкость для каждого AVMutableCompositionTrack, а не для каждого AVAssetTrack - person Marco; 14.05.2015