4

感谢stackoverflow 用户,我能够淡入或淡出一个 AVPlayerTrack。但我找不到在一条轨道上同时完成这两项的方法。

这就是我想要使用的:

-(void)fadeOutVolume
{
    AVPlayerItem *myAVPlayerItem = self.songPlayer.currentItem;

    AVAsset *myAVAsset = myAVPlayerItem.asset;
    NSArray *audioTracks = [myAVAsset tracksWithMediaType:AVMediaTypeAudio];

    NSMutableArray *allAudioParams = [NSMutableArray array];
    for (AVAssetTrack *track in audioTracks) {

       AVMutableAudioMixInputParameters *audioInputParams = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

       CMTime fadeDuration = CMTimeMakeWithSeconds(5, 600);
       CMTime fadeOutStartTime = 
         CMTimeMakeWithSeconds(CMTimeGetSeconds(myAVPlayerItem.duration)-5, 600);
       CMTime fadeInStartTime = CMTimeMakeWithSeconds(0, 600);


       [audioInputParams setVolumeRampFromStartVolume:1.0 
                                           toEndVolume:0 
                      timeRange:CMTimeRangeMake(fadeOutStartTime, fadeDuration)];

       AVMutableAudioMixInputParameters *audioInputParams2 = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];

       [audioInputParams2 setVolumeRampFromStartVolume:0.0 
                                           toEndVolume:1.0  
                        timeRange:CMTimeRangeMake(fadeInStartTime, fadeDuration)];


        [allAudioParams addObject:audioInputParams];
        [allAudioParams addObject:audioInputParams2];

    }

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];

    [audioMix setInputParameters:allAudioParams];
    [myAVPlayerItem setAudioMix:audioMix];

}

如果我评论[allAudioParams addObject:audioInputParams];或其他行,这将起作用。但我不能同时拥有两个输入参数。

4

2 回答 2

3

我发现了问题。我不需要两个音频输入参数。实际上,它们似乎以某种方式覆盖。

如果我删除新的 audioInputParam 并执行两个设置坡道,则一切正常。其实这有点误导。SetRamp 似乎要被覆盖,而“addObject”就是被覆盖的那个。我最终在 for 部分得到了这段代码:

AVMutableAudioMixInputParameters *audioInputParams = 
        [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track];


CMTime fadeDuration = CMTimeMakeWithSeconds(5, 600);
CMTime fadeOutStartTime = CMTimeMakeWithSeconds(CMTimeGetSeconds(myAVPlayerItem.duration)-5, 600);
CMTime fadeInStartTime = CMTimeMakeWithSeconds(0, 600);

[audioInputParams setVolumeRampFromStartVolume:1.0 toEndVolume:0 timeRange:CMTimeRangeMake(fadeOutStartTime, fadeDuration)];

[audioInputParams setVolumeRampFromStartVolume:0.0 toEndVolume:1.0 timeRange:CMTimeRangeMake(fadeInStartTime, fadeDuration)];

[allAudioParams addObject:audioInputParams];

感谢@Mundi 尝试帮助我。

于 2013-07-29T15:51:45.107 回答
1

您只能设置一次启动音量斜坡。这有点合乎逻辑,对吧?

如果您想稍后再次更改音量,请使用

setVolume:atTime:

此方法添加从时间开始的音量斜坡。此音量设置在曲目结束之前一直有效,除非您设置不同的音量级别以便稍后开始。

编辑:

也许这个答案并不完全正确。文档中没有任何内容表明此限制。

但我注意到您遍历轨道并设置fadeOutStratTime基于myAVPlayerItem- 可能存在导致错误的逻辑错误。

于 2013-07-29T14:43:37.260 回答