2

我开始研究一个通过以太网传输 G.711 音频的项目,用 C(不是 C++)编写并在 Fedora 15 上运行。我没有做聪明的事情并使用 RTP,而是使用 UDP 传输音频数据。为了在一定程度上克服数据包重新排序的问题,我决定在每个数据包的主体中使用一个看起来有点像这样的结构:

struct payload {
  char cc;
  char audio_data[160];
};

变量“cc”是一个从 0-15 运行的连续性计数器,当数据包到达接收方时,它会根据 cc 的值放入这些结构的数组中。然后音频输出例程循环遍历这个数组并播放数据。

我的问题是,这是打包音频的最佳方式吗?输出数组最终将是二维的,并且肯定会很慢地读取每个成员并将其写入输出?有没有办法定义一个 160 字节宽的类型,我可以将其写入另一端的音频接口?

非常感谢任何建议,以及指向 ALSA 上有用资源的链接(这似乎非常罕见!)

乔什

4

1 回答 1

1

你担心缓存优化吗?我希望你在把它复杂化之前介绍了这个更简单的方法。如果缓存未命中是一个真正的问题,我建议使用ring (circular) buffer。它也将是您的抖动缓冲区。这为您提供了固定的内存占用和连续的内存,以便更快地访问。

由于 G.711 是恒定比特率编解码器,您可以选择以时间为单位的缓冲区大小(对话为 200 毫秒)。您总是播放缓冲区中的最后一个数据包。例如,您收到的最后一个数据包有cc= n,然后您收到cc= m(> n)。因此,您将 和 之间的所有数据包标记nm丢失,并在以后收到它们时替换它们。

于 2011-12-10T22:29:05.490 回答