如何让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个通道数据后能正常工作,但这部分工作难道不该是重采样器负责的吗?
另外,修改输入或输出采样率时,预期输入输出的数据长度会变化,但实际也没有任何改变。
解决方向
规范重采样器配置流程
- 调用
SetInputType和SetOutputType时,先用MF_SET_TYPE_TEST_ONLY标志验证类型兼容性,确认兼容后再正式设置。若类型不兼容,重采样器会直接透传输入。 - 设置类型后调用
Flush方法,重置重采样器内部状态,避免残留数据干扰。
- 调用
修正媒体类型参数不一致问题
- 输入媒体类型中
MF_MT_AUDIO_VALID_BITS_PER_SAMPLE设为0,但WAVEFORMATEXTENSIBLE的wValidBitsPerSample是32,需将两者统一为32,否则重采样器无法正确识别格式。 - 确保输出的
MF_MT_AUDIO_CHANNEL_MASK与WAVEFORMATEXTENSIBLE的dwChannelMask完全匹配,重采样器依赖该参数完成通道映射。
- 输入媒体类型中
检查数据处理逻辑
- 调用
ProcessInput和ProcessOutput时,根据输出媒体类型的nBlockAlign和采样数计算缓冲区大小,确保输出缓冲区足够容纳重采样后的数据。 - 检查
ProcessOutput的返回值,若出现MF_E_NOTACCEPTING等错误码,需调整输入数据量或缓冲区配置。
- 调用
验证格式支持性
- 先使用简单格式(如16位PCM、2通道转8通道)测试重采样器是否正常工作,排除格式兼容性问题。
- 确认
KSDATAFORMAT_SUBTYPE_IEEE_FLOAT(对应给定的SubFormat)在当前环境下被CResamplerMediaObject支持。
内容的提问来源于stack exchange,提问作者Marschos
相关产品推荐
相关产品推荐

