我已经设置了我的音频引擎并连接了几个节点,以便制作一个如下所示的音频图:
//
//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. ???
}];
我确定必须有这样做的方法,但我似乎找不到任何关于如何实现这一目标的文档?
任何想法都将不胜感激。
答案 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];