【问题标题】:First seekToTime, then fade in with setVolumeRampFromStartVolume首先 seekToTime,然后用 setVolumeRampFromStartVolume 淡入
【发布时间】:2013-02-20 14:11:11
【问题描述】:

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

【问题讨论】:

    标签: objective-c xcode audio avplayer


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,@amergin。我尝试了你的两个建议,但不幸的是没有任何效果。我仍然认为它与我在 CMTimeRangeMake 中设置的开始时间有关...
    • 你有没有试过在创建 currentTime 后检查它的内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多