Android Audio代码分析2 - 函数getMinBufferSize (补充)

最近在看android audio部分代码时,对getMinBufferSize有了一点新体会,之前的疙瘩终于解开了。
也要感谢ldh_123456兄弟的回复,帮助我对此进行了理解。
详细的调用过程就不说了,简单说一下下面几行代码的理解。
    // Ensure that buffer depth covers at least audio hardware latency 
    // 下面这行代码的功能,就是上面英文注释。afFrameCount是硬件缓冲区的大小,单位是frame。
 // 为什么单位是frame呢,因为采样率指的是1秒钟有多少个采样点,一个采样点其实就是一个frame,其大小为:声道数×采样深度。
 // 例如,双声道,格式即采样深度为16bit的数据,其frame size为:2×2=4.
 // afSampleRate是硬件播放时真正的采样率。
 // 解释到这儿,下面这行代码的意思基本明了了。
 // afFrameCount / afSampleRate得出来是一个硬件缓冲区能播放多长时间,单位是 frame / (frame / s),也就是秒了。
 // afLatency是硬件要求的延迟,单位是ms,所以,afFrameCount / afSampleRate的结果为了与afLatency单位一致,就乘了个1000.
 // ((1000 * afFrameCount) / afSampleRate)如果能写成(1000×(afFrameCount / afSampleRate))就好理解多了。
 // 这行代码得出的结果就是为了满足硬件延迟,软件上至少要创建几个buffer。注意这儿只是算出来个数,还没涉及每个buffer的size。
    uint32_t minBufCount = afLatency / ((1000 * afFrameCount) / afSampleRate); 
 // 这行代码的意思是软件层至少应该有两块buffer
    if (minBufCount < 2) minBufCount = 2; 
 
    // 上面计算出了buffer的个数,下面就该计算每个buffer的大小了。
 // 每个buffer应该多大呢,应该与硬件buffer对应,这样刚好一个软件buffer的数据塞给一个硬件buffer。
 // 这样说的话,是不是软件buffer的大小和硬件buffer一样,为afFrameCount就OK了?
 // 当然不是那么简单,因为中间会涉及采样率转换的问题,硬件的采样率是固定的(一般如此),而播放的音乐的采样率各种各样,这样就需要进行采样率转换。
 // 软件buffer保存的是转换之前的数据,硬件buffer保存的是转换后的数据。
 // 为了保证软件buffer与硬件buffer中数据播放时长对应,需要:(单个软件buffersize / sampleRate) = (afFrameCount / afSampleRate)。
 // 也就是单个软件buffersize = (afFrameCount * sampleRate) / afSampleRate。
 // 总的软件buffer size(单位为frame)为:minBufCount * (afFrameCount * sampleRate) / afSampleRate。
 // google写成下面这个样子,是不是故意迷惑人的???
    *frameCount = (sampleRate == 0) ? afFrameCount * minBufCount : 
              afFrameCount * minBufCount * sampleRate / afSampleRate;
         
 // 知道了以frame为单位的buffer size,又知道frame的定义,求以byte为单位的buffer size自然不是什么难事。
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值