XAudio2 采样率转换

如果 XAudio2 语音的输入采样率与其输出语音的输入采样率不同,则可以执行自动采样率转换。

采样率转换遵循以下规则:

  • 语音输入采样率是固定的。

    语音只能处理创建时指定的输入采样率。 对于掌握语音子混合语音,输入采样率是使用 IXAudio2::CreateMasteringVoice 和 IXAudio2::CreateSubmixVoice 函数的 InputSampleRate 参数指定的。 对于源语音,语音的输入采样率由 IXAudio2::CreateSourceVoice 函数的 pSourceFormat 参数指定。

  • 所有语音的输出语音必须具有相同的输入采样率。

    语音可以从其输入采样率转换为任何输出采样率,但所有语音的输出语音必须具有相同的输入采样率。 例如,语音可以输出到任意数量的语音,输入采样率为 22 kHz。 但是,如果同一语音有多个输出语音,每个语音的输入采样率不同,则音频图将无效。

  • 采样率转换处理仅在必要时进行。

    将音频数据转换为不同的采样率会产生更多的处理开销,最好避免这种开销。 如果语音的输入采样率与其输出语音的输入采样率匹配,则不会完成此转换并缩短处理时间。

  • 输出采样率可能因语音的生命周期而异。

    语音的输出采样率不是固定的。 只要其所有输出语音具有相同的输入采样率,音频图就会有效。 如果语音更改为输出到具有不同输入采样率的新语音,则语音将转换为新语音的输入采样率。

在某些情况下,需要添加子混合语音以在语音之间执行采样率转换。 如果语音需要输出到具有各种输入采样率的语音,则只有一个语音可以直接输出原始语音。 由于所有语音的输出语音必须具有相同的输入采样率,因此其他语音间接接收输出。 原始语音和预期输出语音之间必须有一个具有正确输入采样率的子混合语音。

例如,假设输入采样率为 22 kHz 的源语音,该语音需要输出到输入采样率为 11 kHz 的子混合语音和输入采样率为 44.1 kHz 的主语音。 由于两个输出语音具有不同的输入采样率,因此需要在原始语音与其预期输出语音之间插入更多子混合语音。 若要保持源语音的保真度,并避免对更高采样率进行不必要的昂贵转换,需要在图中插入两个采样输入速率为 22 khz 的子混合语音。 一个子混合语音以 11 khz 输出到具有混响效果的子混合语音,另一个子混合语音将输出到主语音的 44.1 khz。

音频图中的采样率转换示例

所有语音具有相同的采样输入速率;音频图中未执行采样率转换。音频图中未执行采样率转换。

除主语音外,所有语音的采样输入速率相同;仅对转到主语音的数据执行采样率转换。 仅对转到主语音的数据执行采样率转换。

语音具有不同的采样输入速率,需要更多的子混合语音来执行采样率转换;采样率转换在音频图中的多个位置执行。 采样率转换在音频图中的多个位置执行。

语音

XAudio2 编程指南