objective-c - 首先 seekToTime,然后用 setVolumeRampFromStartVolume 淡入

标签 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 有关但我无法弄清楚。我希望你有个主意。 :)

最佳答案

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

关于objective-c - 首先 seekToTime,然后用 setVolumeRampFromStartVolume 淡入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14981911/

相关文章:

ios - 如何在特定索引处显示 UITabBarController?

xcode - Mac上可以有多个iOs版本吗?

ios - 用于 Xcode 托管配置文件设置的 Azure Pipelines 配置 - 可能吗?记录在案?

ios - Xcode“导航栏”字体问题

javascript - 传递和使用包含音频数据的字节数组的正确方法是什么?

ios - 如何在按下背景时以动画方式隐藏选择器 View

ios - MBProgressHUD ,多次崩溃

ios - 横向播放视频后状态栏下的导航栏

ios - 为什么 AudioOutputUnitStart() 失败并返回代码 -500?

java - 通过直接更改字节来更改音频流的音量