我正在编写一个音乐播放器应用程序,它允许用户在将轨道添加到队列之前预听轨道(为此我使用 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
有关但我无法弄清楚。我希望你有个主意。 :)
最佳答案
几个建议。首先,我会在你做 seekToTime 之前设置你的淡入淡出。其次,我会为您的 CMTimeMakeWithSeconds 使用更大的时间尺度 - 可能是 60000 左右。见 http://warrenmoore.net/understanding-cmtime有关 CMTime 的更多详细信息,时间刻度很重要,因为您的通话时间范围只会落在精确的秒边界上,而不是几分之一秒。
关于objective-c - 首先 seekToTime,然后用 setVolumeRampFromStartVolume 淡入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14981911/