作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用多个 AVAudioPlayerNode
在 AVAudioEngine
混合音频文件进行播放。
完成所有设置后(引擎准备好、启动、音频文件段已安排),我将调用 play()
每个播放器节点上的方法开始播放。
因为遍历所有播放器节点需要时间,所以我拍摄了第一个节点的 lastRenderTime
的快照。值并使用它来计算节点 play(at:)
的开始时间方法,以保持节点之间的播放同步:
let delay = 0.0
let startSampleTime = time.sampleTime // time is the snapshot value
let sampleRate = player.outputFormat(forBus: 0).sampleRate
let startTime = AVAudioTime(
sampleTime: startSampleTime + AVAudioFramePosition(delay * sampleRate),
atRate: sampleRate)
player.play(at: startTime)
seekTime
是我跟踪的值,以防我们寻找玩家。它是
0.0
开始时:
private var _currentTime: TimeInterval {
guard player.engine != nil,
let lastRenderTime = player.lastRenderTime,
lastRenderTime.isSampleTimeValid,
lastRenderTime.isHostTimeValid else {
return seekTime
}
let sampleRate = player.outputFormat(forBus: 0).sampleRate
let sampleTime = player.playerTime(forNodeTime: lastRenderTime)?.sampleTime ?? 0
if sampleTime > 0 && sampleRate != 0 {
return seekTime + (Double(sampleTime) / sampleRate)
}
return seekTime
}
lastRenderTime
一旦我调用
play(at:)
立即开始前进,并且必须有某种处理/缓冲时间偏移。
prepare(withFrameCount:)
一旦我安排了音频数据,就在每个播放器节点上。
AVAudioPlayerNode
上安装水龙头 block 时, 使用长度为
4410
的缓冲区调用 block , 采样率为
44100 Hz
,这意味着 0.1s 的音频数据。我应该依靠它来计算延迟吗?
最佳答案
来自 theanalogkid 在 Apple 开发者论坛上的帖子:
在系统上,延迟通过以下方式测量:
音频设备 I/O 缓冲区帧大小 + 输出安全偏移 + 输出流延迟 + 输出设备延迟
如果您尝试计算总往返延迟,您可以添加:
上述输入延迟 + 输入安全偏移。
您在渲染过程中看到的时间戳。考虑缓冲区帧大小和安全偏移,但不考虑流和设备延迟。
iOS 让您可以通过 AVAudioSession 访问上述最重要的信息,如上所述,您还可以使用“首选” session 设置 - setPreferredIOBufferDuration
和 preferredIOBufferDuration
以便进一步控制。
/ The current hardware input latency in seconds. */
@property(readonly) NSTimeInterval inputLatency NS_AVAILABLE_IOS(6_0);
/ The current hardware output latency in seconds. */
@property(readonly) NSTimeInterval outputLatency NS_AVAILABLE_IOS(6_0);
/ The current hardware IO buffer duration in seconds. */
@property(readonly) NSTimeInterval IOBufferDuration NS_AVAILABLE_IOS(6_0);
音频单元也有
kAudioUnitProperty_Latency
可以查询的属性。
关于ios - AVAudioPlayerNode lastRenderTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42386497/
我使用多个 AVAudioPlayerNode在 AVAudioEngine混合音频文件进行播放。 完成所有设置后(引擎准备好、启动、音频文件段已安排),我将调用 play()每个播放器节点上的方法开
我是一名优秀的程序员,十分优秀!