感谢stackoverflow user我可以淡入或淡出一个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];
或其他行,则此方法有效。但我不能同时拥有两个输入参数。
答案 0 :(得分:3)
我发现了这个问题。我不需要两个audioInputParams。事实上,似乎他们以某种方式覆盖。
如果我删除了新的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试图帮助我。
答案 1 :(得分:1)
您只能设置一次启动音量斜坡。这有点合乎逻辑,对吧?
如果您想稍后再次更改音量,请使用
setVolume:atTime:
此方法会在时间开始添加音量斜坡。除非您将不同的音量设置为稍后启动,否则此音量设置将一直有效,直到音轨结束。
修改强>
也许这个答案并不完全正确。文档中没有任何内容可以表明这种限制。
但是我注意到你遍历了轨道并根据fadeOutStratTime
设置了myAVPlayerItem
- 可能存在导致错误的逻辑错误。