根据采样率计算buffer duration
audio buffer的时长和timestamp在知道采样率的情况下是可以直接计算的,这里假设采样率是44100,那么以微妙为单位,1秒等于1000000微妙,一个采样的时间计算出来就是22微妙,那么1024个采样就是22528,通常一个AAC frame通常就是1024个采样。
1
秒
采样率
=
1
个采样的时间长度
\frac{1秒}{采样率} = 1个采样的时间长度
采样率1秒=1个采样的时间长度
1
个采样的时长
×
1024
=
一个
b
u
f
f
e
r
的时间长度
{1个采样的时长}\times {1024} = 一个buffer的时间长度
1个采样的时长×1024=一个buffer的时间长度
>>> 1000000/44100
22
>>> 22*1024
22528
整形计算的精度损失
如果以纳秒为单位,1秒等于1000000000纳秒 ,一个采样的时间就是22675纳秒,1024个采样就是23219200纳秒,换成微秒就是23219微秒,这样一个Audio buffer计算时间ts和duration的时候就损失691微妙,这样在经过一段时间之后,体现在av同步上就出问题了。
>>> 1000000000/44100
22675
>>> 22675*1024
23219200
📣 所以在计算的时候要特别小心使用的时间单位是否满足需求。
如果以纳秒为单位,1秒等于1000000000纳秒 ,一个采样的时间就是22675纳秒,1024个采样就是23219200纳秒,换成微秒就是23219微秒,这样一个Audio buffer计算时间ts和duration的时候就损失691微妙,这样在经过一段时间之后,体现在av同步上就出问题了。
>>> 1000000000/44100
22675
>>> 22675*1024
23219200
根据buffer大小计算audio的duration
如何计算一个buffer的采样数,因为:
s a m p l e s = b u f f e r 总字节数 每个 s a m p l e 的字节数 samples = \frac{buffer总字节数}{每个sample的字节数} samples=每个sample的字节数buffer总字节数
假设buffer大小是4096个字节,2声道16bit采样,一个采样就是4个字节,那么4096个字节就是1024个采样:
>>> 4096/4
1024
如果采样率是44100,那么这个buffer的时长就是23219.95微秒,这里1秒等于1000000.0微秒:
>>> 1000000.0/44100*1024
23219.954648526076
如果采样率是48000,那么这个buffer的时长就是21333.33微秒,这里1秒等于1000000.0微秒:
>>> 1000000.0/48000*1024
21333.333333333332