一个AVPlayerItem中如何实现两个音频的淡入淡出效果?

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];这行或者另一行的话,它就可以工作。但是我不能同时拥有这两个输入参数。


setVolumeRampFromStartVolume 只能被设置一次。尝试找到不同的参数设置。 - Mundi
我也这么想 :/。我不能添加两个不同的输入参数来设置音量渐变?:/。 - Tiago Almeida
2个回答

3
我已经找到了问题。我不需要两个audioInputParams。实际上,它们似乎以某种方式被覆盖。
如果我删除新的audioInputParam并执行两个set ramps,一切都可以正常工作。实际上,这有点误导人。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试图帮助我。

1

您只能设置起始音量渐变一次。这在某种程度上是合理的,不是吗?

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

setVolume:atTime:

这个方法在指定时间开始添加音量渐变。除非您在稍后的时间设置不同的起始音量级别,否则此音量设置将一直有效到曲目结束。

有了那个解决方案,一切都变得混乱不堪。我需要一个定时器,在 delta 时间间隔内设置,以在 alfa 秒内将音量从 0 变为 1。渐变是更干净的解决方案。这是唯一的方法吗? - Tiago Almeida
也许我错了。我看了文档,现在不太确定为什么它不起作用。你有崩溃信息吗?另外,请参见我上面的编辑,有另一个想法。 - Mundi
我没有任何崩溃信息。此外,淡出和淡入可以单独工作。如果我注释掉其中一行 [allAudioParams addObject:audioInputParams]; 另一个就可以工作。两个都可以单独工作。这就是为什么它很奇怪 :/. - Tiago Almeida
我已经找到了问题所在。只是API名称混淆让我以为我不能做两个setRamps。感谢@Mundi的帮助 ;) - Tiago Almeida

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接