c - 在 PulseAudio 中播放具有不同 sample_spec 的样本

标签 c linux audio pulseaudio

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

据我了解,流的 sample_spec 只能在流创建期间设置(pa_simple_newpa_stream_new 等),之后无法切换它.

我的问题是:在 PulseAudio 中播放这些样本的最有效方法是什么?我看到三个选项:

  1. 保留单个 PulseAudio 流,手动重新采样样本序列并在需要时混合 channel (以便为 PulseAudio 提供相同 sample_spec 的样本)
  2. 保留单个 PulseAudio 流,在规范更改时关闭并使用新的 sample_spec 重新打开它
  3. 保留多个流,一个用于我必须处理的每种样本

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

最佳答案

自己重新采样将是一种浪费。您可以选择动态更新采样率。您需要设置 PA_STREAM_VARIABLE_RATE 并使用 pa_stream_update_sample_rate()。不过,这仍然无法处理示例规范更改。

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

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

关于c - 在 PulseAudio 中播放具有不同 sample_spec 的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11048523/

相关文章:

c - 使用c中的条件声明变量的数据类型

c - read(fd, buf, N>0) == 0,但 fd 不在 EOF?

matlab - 如何使用audioread读取文件序列,然后将它们合并?

python - Jupyter 笔记本 : "RuntimeError: Permissions assignment failed for secure file: ... Got ' 0o160 0' instead of ' 0o060 0' "

user-interface - 音频软件开发的 GUI 开发?

java - 访问 Android 媒体流以进行音频可视化

c - 动态内存分配和普通内存分配有什么区别?

c - 用 C 语言读写 Txt 文件

centos 6.3 中的 python cron 作业错误

c++ - fatal error : opencv2/nonfree/nonfree. hpp:没有这样的文件或目录