我正在编写一个音乐播放器应用程序,它允许用户在将曲目添加到队列之前预听曲目(我AVQueuePlayer
用于此)。
如果用户选择了他想要预听的歌曲,当前歌曲将随之淡出,setVolumeRampFromStartVolume
所选歌曲将开始播放。这工作正常。
用户完成预听后,中断的歌曲将被恢复,我会通过以下方式回溯到它被预听曲目中断的时间seekToTime:completionHandler
:
我的代码看起来有点像这样:
- (void)stopPreview
{
if (previewInterruptedItem) {
[self addMediaItemToUserQueue:previewInterruptedItem afterCurrentItem:YES];
previewInterruptedItem = nil;
[[self queuePlayer] advanceToNextItem];
[[[self queuePlayer] currentItem] seekToTime:previewInterruptedTime
completionHandler:^(BOOL finished){
if (finished) {
[self fadeVolumeIn:YES];
}
}];
}
}
- (void)fadeVolumeIn:(BOOL)fadeIn
{
float startVolume = 0.1;
float endVolume = 1.0;
if (!fadeIn) {
startVolume = 1.0;
endVolume = 0.0;
}
AVAssetTrack *audioTrack = [[[self queuePlayer].currentItem.asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
AVMutableAudioMixInputParameters *params = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:audioTrack];
CMTime currentTime = [[[self queuePlayer] currentItem] currentTime];
[params setVolumeRampFromStartVolume:startVolume
toEndVolume:endVolume
timeRange:CMTimeRangeMake(currentTime, CMTimeMakeWithSeconds(1, 1))];
AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix];
audioMix.inputParameters = [NSArray arrayWithObject:params];
[self queuePlayer].currentItem.audioMix = audioMix;
}
这不是出于某种原因。如果我删除这seekTime
条线,它会很好地淡入,但我真的希望轨道能从暂停的地方恢复。
我认为它与该有关,timeRange
但我无法弄清楚。我希望你有个主意。:)