我试图在Windows媒体基础上混合两个音频 . 在MATLAB中,我做了它从每个音频中按样本添加样本 . 在Windows Media Foundation中,我可以使用 IMFSourceReaderIMFSample 访问示例,这会在一段时间内为我提供一大块数据 . 例如,第一次调用 sourceReader->ReadSample( )首先给出了 t 数据的持续时间 . 下一次调用它会给我下一个数据管理 . 每个t持续时间的数据都在 L 的缓冲区大小 .

当我尝试使用媒体基础以这种方式访问音频样本时,我预计每次调用 ReadSample() 时,持续时间 t 和缓冲区长度 L 将相同 . 但是每次拨打音频 ReadSample() 时,我都会得到不同的t和L.例如,有时我得到缓冲区长度16384,持续时间928798(100纳秒单位),有时我得到缓冲区长度8192,持续时间为464399 .

这对我来说是个大问题,因为我不能添加两个具有不同缓冲区长度和持续时间的音频 . 是否有可能获得固定大小的缓冲区和IMFSamples的固定持续时间?如果不是如何在媒体基础上混合两个音频?

我首先将音频文件转码为44100 Hz采样率wma文件 . 然后,为了读取音频,我正在使用此代码 .

CHECK_HR(MFCreateMediaType(&spMFTypeIn));
CHECK_HR(spMFTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio));
CHECK_HR(spMFTypeIn->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, BITS_PER_SAMPLE));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, 2));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_PREFER_WAVEFORMATEX, 1));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 16 / 8 * 2));
CHECK_HR(spMFTypeIn->SetUINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 16 / 8 * 2 * 44100));