请教音频渲染缓冲区 audiounit 的一个问题

2018-09-17 18:41:22 +08:00
 sppl
最近刚做音视频,遇到一个问题,想请教下各位

audiounit 通过 callback,由用户来提供渲染音频的数据给系统

当前在真机上,回调里需要填充的缓冲区数据大小,多于我从流上拉取的数据量,而查阅相关文档,表示并不能够直接控制缓冲区的大小

那么这时候,我是要求服务端提升速率,还是对音频做重采样以填充缓冲区呢?
2744 次点击
所在节点    iOS
7 条回复
wohenyingyu03
2018-09-17 21:56:13 +08:00
为什么会多,你的流是从网络 socket 来的?采样率在初始化的时候已经确定,怎么可能中途改? audio unit 多要的数据直接填 0 即可。如果是从网络来的,要建立自己的 jitter buffer,不然填 0 声音没法听。
sppl
2018-09-18 00:37:19 +08:00
谢谢,我是从网络读取的 pcm 流数据,直接放入 buffer 中,在模拟器上,是能够正常播放的
在真机上,我延时了 20s 再开始播放,会发现有跳帧现象,我猜测是 pcm 可能模拟器上读取 pcm 数据是以 UInt16 的格式去读取数据,而真机上采用 float 的方式,直接导致我的流有跳帧的现象
如果我的猜测正确,那我下一步是自己对数据进行填充,还是有其他的方案呢?
sppl
2018-09-18 00:38:30 +08:00
@wohenyingyu03 不好意思,回复在上面,忘了 @你了
hgwang1215
2018-09-18 09:10:22 +08:00
网络上的 pcm,不编码就传输吗?
wohenyingyu03
2018-09-18 11:04:19 +08:00
@sppl pcm 数据什么格式没关系……你说的是流数据,难道还用 tcp ?等你握手确认完,audio unit 时间早就过去了,肯定会乱序延时,UDP 了解下?居然直接用 pcm,G711 编码了解下?
sppl
2018-09-18 22:13:16 +08:00
@wohenyingyu03 好的,我去查下相关资料,谢谢
wohenyingyu03
2018-09-18 23:06:18 +08:00
@sppl 之前说错了,tcp 不会乱序,主要还是其握手消耗的时间导致你的流不能及时收到足够的数据来满足 audio unit,最后导致跳帧,而且你用 pcm 直接传会大大增加网络上数据包的流量导致丢包概率增加。一般用 udp 可以完全避免握手耽误的时间,但是避免不了丢包延时乱序,这部分问题一般叫抖动,也会造成跳帧。一般用编码压缩 pcm 来解决流量过大的问题,并在本地建立 jitter buffer 来解决抖动的问题,现在有很多算法可以动态调整 jitter buffer 大小自动适应不同网络,也有很多算法可以补偿跳帧。一般用 tcp 传输的语音都是用在非实时场景,在数据量不够是会暂停进行缓冲,而实时场景一般用 udp,但是两种方案都需要有本地 buffer 缓冲。不太清楚你的需求,只是一点建议。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/490185

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX