You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让CResamplerMediaObject按预期工作?音频重采样异常排查

使用CResamplerMediaObject重采样音频时未生效的问题

我尝试用CResamplerMediaObject对从默认音频端点捕获的音频进行重采样,再克隆到其他任意选定的音频端点,但不管怎么设置输入/输出类型,它都直接透传输入内容,完全没做修改。

输入/输出类型信息如下:

inputType()
 WAVEFORMATEXTENSIBLE:
    wFormatTag = 65534
    cbSize = 22
    nAvgBytesPerSec = 384000
    nBlockAlign = 8
    nChannels = 2
    nSamplesPerSec = 48000
    wBitsPerSample = 32
    ext->dwChannelMask = 3
    ext->Samples.wValidBitsPerSample = 32
    ext->Samples.wSamplesPerBlock = 32
    ext->SubFormat = {00000003-0000-0010-8000-00AA00389B71}

 Properties of the media type: 
    MF_MT_AUDIO_NUM_CHANNELS = 2
    MF_MT_AUDIO_SAMPLES_PER_SECOND = 48000
    MF_MT_AUDIO_BLOCK_ALIGNMENT = 8
    MF_MT_AUDIO_AVG_BYTES_PER_SECOND = 384000
    MF_MT_AUDIO_BITS_PER_SAMPLE = 32
    MF_MT_ALL_SAMPLES_INDEPENDENT = 1
    MF_MT_AUDIO_CHANNEL_MASK = 3
    MF_MT_AUDIO_VALID_BITS_PER_SAMPLE = 0

outputType()
 WAVEFORMATEXTENSIBLE:
    wFormatTag = 65534
    cbSize = 22
    nAvgBytesPerSec = 1536000
    nBlockAlign = 32
    nChannels = 8
    nSamplesPerSec = 48000
    wBitsPerSample = 32
    ext->dwChannelMask = 1599
    ext->Samples.wValidBitsPerSample = 32
    ext->Samples.wSamplesPerBlock = 32
    ext->SubFormat = {00000003-0000-0010-8000-00AA00389B71}

 Properties of the media type:
    MF_MT_AUDIO_NUM_CHANNELS = 8
    MF_MT_AUDIO_SAMPLES_PER_SECOND = 48000
    MF_MT_AUDIO_BLOCK_ALIGNMENT = 32
    MF_MT_AUDIO_AVG_BYTES_PER_SECOND = 1536000
    MF_MT_AUDIO_BITS_PER_SAMPLE = 32
    MF_MT_ALL_SAMPLES_INDEPENDENT = 1
    MF_MT_AUDIO_CHANNEL_MASK = 1599
    MF_MT_AUDIO_VALID_BITS_PER_SAMPLE = 0

按预期,每个8字节的输入帧(计算方式:(wBitsPerSample/8)*nChannels),输出帧应该是32字节,但实际输出还是8字节。手动补全缺失的6个通道数据后能正常工作,但这部分工作难道不该是重采样器负责的吗?

另外,修改输入或输出采样率时,预期输入输出的数据长度会变化,但实际也没有任何改变。


解决方向

  1. 规范重采样器配置流程

    • 调用SetInputType和SetOutputType时,先用MF_SET_TYPE_TEST_ONLY标志验证类型兼容性,确认兼容后再正式设置。若类型不兼容,重采样器会直接透传输入。
    • 设置类型后调用Flush方法,重置重采样器内部状态,避免残留数据干扰。
  2. 修正媒体类型参数不一致问题

    • 输入媒体类型中MF_MT_AUDIO_VALID_BITS_PER_SAMPLE设为0,但WAVEFORMATEXTENSIBLE的wValidBitsPerSample是32,需将两者统一为32,否则重采样器无法正确识别格式。
    • 确保输出的MF_MT_AUDIO_CHANNEL_MASK与WAVEFORMATEXTENSIBLE的dwChannelMask完全匹配,重采样器依赖该参数完成通道映射。
  3. 检查数据处理逻辑

    • 调用ProcessInput和ProcessOutput时,根据输出媒体类型的nBlockAlign和采样数计算缓冲区大小,确保输出缓冲区足够容纳重采样后的数据。
    • 检查ProcessOutput的返回值,若出现MF_E_NOTACCEPTING等错误码,需调整输入数据量或缓冲区配置。
  4. 验证格式支持性

    • 先使用简单格式(如16位PCM、2通道转8通道)测试重采样器是否正常工作,排除格式兼容性问题。
    • 确认KSDATAFORMAT_SUBTYPE_IEEE_FLOAT(对应给定的SubFormat)在当前环境下被CResamplerMediaObject支持。

内容的提问来源于stack exchange,提问作者Marschos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:49