首先使用seekToTime,然后使用setVolumeRampFromStartVolume淡入

时间:2013-02-20 14:11:11

标签: objective-c xcode audio avplayer

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

1 个答案:

答案 0 :(得分:0)

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