我正在编写一个音乐播放器应用程序,允许用户在将曲目添加到队列之前预先跟踪曲目(我使用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
有关,但我无法弄明白。我希望你有个主意。 :)
答案 0 :(得分:0)
一些建议。首先,我会在你做seekToTime之前设置你的淡入淡出。其次,我会为你的CMTimeMakeWithSeconds使用更大的时间刻度 - 可能是60000左右。有关CMTime的更多详细信息,请参阅http://warrenmoore.net/understanding-cmtime,时间刻度非常重要,因为您的调用时间范围只会落在确切的第二个边界而不是一秒钟。