0

我正在编写一个音乐播放器应用程序,它允许用户在将曲目添加到队列之前预听曲目(我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但我无法弄清楚。我希望你有个主意。:)

4

1 回答 1

0

几个建议。首先,我会在你做 seekToTime 之前设置你的淡入淡出。其次,我会为您的 CMTimeMakeWithSeconds 使用更大的时间尺度 - 可能是 60000 左右。有关CMTime 的更多详细信息,请参阅 http://warrenmoore.net/understanding-cmtime ,时间尺度很重要,因为您的通话时间范围只会落在精确的秒边界上,而不是几分之一秒。

于 2013-02-21T12:34:20.093 回答