在 c++ 中使用 alsa 的 dmix 插件进行音频混合
Audio mixing with alsa's dmix plugin in c++
我试图使用alsa同时播放两个wav文件。请注意,wav文件具有不同的采样率。这是可能的,并且音频流被混合并发送到音频芯片。(我是在嵌入式linux设备上开发的。)但有一个流的播放速度是正常播放速度的几倍。所以我想重新采样有问题。
我有一个默认的设备,在/etc/asound.conf中启用了dmix插件,并将采样率设置为44100Hz。但据我所知,ALSA在内部将所有流重新采样到48khz,并在再次向下采样到我想要的输出速率之前将其混合,在我的情况下为44.1khz。
这是正确的吗?
当使用alsa-lib播放音频文件时,我需要为特定的wav文件设置所有参数吗?
例如:8000hz单声道16位
- 将snd_pcm_hw_params_set_rate()设置为8000hz
- snd_pcm_hw_params_set_format转换为16位LE/BE/有符号/无符号
- 单声道的snd_pcm_hw_params_set_channels
这会更改设备的硬件设置还是仅更改此特定音频流的硬件设置?
如有任何澄清,不胜感激。
编辑:
我可能误解了以下内容:[ALSA]
当启用软件混合时,ALSA会强制将所有内容重新采样到相同的频率(支持时默认为48000)。dmix使用了较差的重采样算法,这会产生明显的音质损失
所以需要明确的是,如果我将dmix设备的asound.conf中的速率更改为44100,那么所有的东西都应该自动重新采样到44100并混合?
因此,我的两个混合音频文件中有一个速度不正确的原因可能是使用alsa-lib的流设置不正确造成的?
因为如果我一次播放一个wav文件,两个流似乎都是正确的。只有当第一个正在播放,同时我在流中混合另一个时,第一个wav文件的速度才会改变。请注意,此时硬件设置是相同的。为什么设置流2的硬件参数(和播放)会改变流1中的某些内容?
ALSA没有固定的48 kHz重采样。
dmix
设备使用固定的采样率和格式,但所有使用它的设备通常都使用plug
插件来实现自动转换。
使用alsa-lib时,必须设置所有对您重要的参数;对于任何未明确设置的参数,alsa-lib都会选择一个有点随机的值。
不同的流可以使用不同的参数。
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 用c++阅读音频
- 为什么这个音频包络不能通过开关的情况?
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- FFMpeg库:如何在音频文件中精确查找
- 需要反转音频步进公式
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 音频插件.将 MIDI 映射到音频文件
- 如何为音频应用程序/插件模拟真空管的声音
- Juce无法在音频插件上插入按钮
- 将窗口句柄从一个进程使用到另一个进程(插件 vst 音频)
- 快板 5 + MinGW:音频插件不起作用
- 使用Juce在c++中开发spotify音频插件
- 在 c++ 中使用 alsa 的 dmix 插件进行音频混合
- VST插件导致音频失真