C 播放具有不同样本规格的样本';他在普尔西奥

C 播放具有不同样本规格的样本';他在普尔西奥,c,linux,audio,pulseaudio,C,Linux,Audio,Pulseaudio,我正在开发一个应用程序,通过自定义UDP协议从远程服务器接收音频样本流。流由小的样本序列组成,每个序列可能有不同数量的通道和速率 据我所知,流的sample_spec只能在流的创建过程中设置(pa_simple_new,pa_stream_new,等等),之后无法切换 我的问题是:在PulseAudio中播放这些样本最有效的方法是什么?我认为有三种选择: 保留单个PulseAudio流,在需要时手动重新采样采样序列和混合通道(以便为PulseAudio提供相同样本规格的样本) 保留一个Pulse

我正在开发一个应用程序,通过自定义UDP协议从远程服务器接收音频样本流。流由小的样本序列组成,每个序列可能有不同数量的通道和速率

据我所知,流的sample_spec只能在流的创建过程中设置(
pa_simple_new
pa_stream_new
,等等),之后无法切换

我的问题是:在PulseAudio中播放这些样本最有效的方法是什么?我认为有三种选择:

  • 保留单个PulseAudio流,在需要时手动重新采样采样序列和混合通道(以便为PulseAudio提供相同样本规格的样本)
  • 保留一个PulseAudio流,当规格更改时,使用新的样本规格关闭并重新打开它
  • 保留多条流,我必须处理的每种样本都有一条流

  • 选项1似乎需要大量的手工工作,而且也消耗了大量的资源。选项2似乎效率极低。选项3看起来可能是最好的,但我担心资源消耗。有什么我可能遗漏的吗?

    重新对自己采样是徒劳的。您可以选择动态更新采样率。您需要设置PA_STREAM_VARIABLE_RATE并使用PA_STREAM_update_sample_RATE()。不过,这仍然不能处理样例规范的更改

    2和3都是有效的,显然在预先分配资源(选项3)和轻微的性能损失(选项2)之间存在权衡。老实说,创建流并没有那么昂贵,而且保存流的开销也不应该太高(除非您处于资源严重受限的环境中)


    因此,如果您有固定数量的规格/速率组合,只需预先创建流。如果规格/速率的变化很少,只需拆下并重新创建流即可。

    谢谢!spec/rate中的更改是频繁的,所以我想我会坚持使用基于流池的实现