我开始研究一个通过以太网传输G.711音频的项目,用C语言编写(不是C ++)并在Fedora 15上运行。而不是做智能事物并使用RTP,我使用UDP传输音频数据。 为了在某种程度上克服数据包重新排序的问题,我决定在每个数据包的主体中使用一个看起来有点像这样的结构:
struct payload {
char cc;
char audio_data[160];
};
变量“cc”是一个从0到15的连续性计数器,当数据包到达接收者时,它将根据cc的值放入这些结构的数组中。然后,音频输出例程循环遍历此数组并播放数据。
我的问题是,这是打包音频的最佳方式吗?输出数组最终会是二维的,肯定会慢速读取每个成员并将其写入输出?有没有办法定义一个160字节宽的类型,我可以写到另一端的音频接口?
非常感谢任何建议,以及有关ALSA的有用资源的链接(这似乎非常罕见!)
约什
答案 0 :(得分:1)
您是否担心缓存优化?我希望你在复杂化之前简要介绍一下这种简单的方法。如果缓存未命中是一个真正的问题,我建议使用ring (circular) buffer。这也是你的jitter buffer。这为您提供固定的内存占用和连续内存,以便更快地访问。
由于G.711是恒定比特率编解码器,因此您可以选择时间单位的缓冲区大小(对话为200毫秒)。您始终播放缓冲区中的最后一个数据包。例如,您收到的最后一个数据包有cc
= n
,然后您收到cc
= m
(> n
)。因此,您将n
和m
之间的所有数据包标记为缺失,并在以后收到时将其替换。