AVAudioEngine跟踪音频进度

时间:2014-11-14 10:51:13

标签: ios objective-c avfoundation core-audio

我已经设置了我的音频引擎并连接了几个节点,以便制作一个如下所示的音频图:

//
//AVAudioPlayerNode --> AVAudioMixerNode --> AVAudioUnitVarispeed ---> AvAudioOutputNode
//       |                                                         |
// AVAudioPCMBuffer                                             AudioTap
//

一切正常,音频引擎正在运行。现在我想得到AVAudioPlayerNode / AVAudioPCMBuffer的framePosition(进度,消耗帧,%),以便更新我的UI中的当前位置。类似的东西:

[timeEffectNode installTapOnBus:0 bufferSize:4096 format:[timeEffectNode outputFormatForBus:0] block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
    //calculate the current node progress here. ???
}];

我确定必须有这样做的方法,但我似乎找不到任何关于如何实现这一目标的文档?

任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我最近创建了一个与AVAudioEngine和AVPCMBufferNode一起使用的播放器。玩家保持玩家一直玩的总时间的内部时间。要访问它,您必须获取玩家lastRenderTime然后使用(sampleTime / sampleRate)。这应该返回玩家在几秒钟内播放的总时间。

如果您想重置播放器计时器(例如,当您搜索文件或切换到新歌曲时),您必须设置使用播放器的playAtTime方法。 playAtTime不执行任何文件搜索,只是修改了播放器内部计时器,然后开始播放。

我希望这会有所帮助。

如果您想参考我如何使用它,请查看我的项目:https://github.com/danielmj/AEAudioPlayer

答案 1 :(得分:1)

只需使用

拍摄当前节点时间的快照即可
AVAudioTime *now = player.lastRenderTime;

然后问你的播放器

[player playerTimeForNodeTime:now];

当然,您可以通过一个电话

完成此操作
[player playerTimeForNodeTime:player.lastRenderTime];