【问题标题】:MF_MT_AUDIO_BITS_PER_SAMPLE Always Returns Zero for PCM AudioMF_MT_AUDIO_BITS_PER_SAMPLE 始终为 PCM 音频返回零
【发布时间】:2026-01-30 09:30:01
【问题描述】:

我一直在尝试在媒体基础框架中检索每个样本的位,但它总是返回 0,或者给出“未找到请求的属性”HRESULT。

这是我尝试过的代码,

DWORD streamIndex = 0, flag = 0;
LONGLONG audioTimestamp = 0;
ComPtr<IMFSample> pAudioSample = nullptr;
HRESULT result = mImpl->mAudioSourceReader->ReadSample(mImpl->mAudioStreamIndex, 0, &streamIndex, &flag, &audioTimestamp, &pAudioSample);
if (result != S_OK) {
    LogError("Failed to read audio sample..");
    return false;
} 

ComPtr<IMFMediaType> pAudioSampleMediaType;
if (S_OK != mImpl->mAudioSourceReader->GetCurrentMediaType(mImpl->mAudioStreamIndex, &pAudioSampleMediaType)) {
    LogError("Failed to set resampler input...");
    return false;
}

uint32_t inBitsPerSample;
result = pAudioSampleMediaType->GetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, &inBitsPerSample);
result = pAudioSample->GetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, &inBitsPerSample);

inBitsPerSample = MFGetAttributeUINT32(pAudioSample.Get(), MF_MT_AUDIO_BITS_PER_SAMPLE, 0);

程序正在运行,但我将值设置为 32,这可能是因为我有一个 32 位音频文件。我还需要做些什么来从音频样本中检索每个样本的比特吗?

非常感谢, 彼得

编辑:

媒体详情如下:

Video file with LPCM Audio (mp4 container)
Sample Rate 48000 Hz
Bits Per Sample 16
Channel Count 6

【问题讨论】:

    标签: c++ winapi audio ms-media-foundation ch


    【解决方案1】:

    这个问题没有很好地提出。但是,对于 32 位 PCM 音频,似乎没有设置相关属性。对于 24 或 16,则属性设置正确并且可以检索。

    如果我请求MF_MT_AUDIO_BITS_PER_SAMPLE 并得到属性未找到错误,那么我假设为 32 位,否则我使用提供的值。可能只是 Media Foundation API 的一个怪癖,但似乎可以工作。

    【讨论】:

      【解决方案2】:

      MF_MT_AUDIO_BITS_PER_SAMPLE 仅适用于媒体类型,不适用于样本。

      MF_MT_AUDIO_BITS_PER_SAMPLE 并非适用于所有媒体类型,仅适用于适用的媒体类型。如果您无法查询该值,那么它很可能对这种媒体类型没有多大意义。

      您应该按照倾倒整个媒体类型并将其附加到此问题的方式进行进一步调查。到这个时候,您可能会弄清楚为什么该特定媒体类型中缺少该值。

      【讨论】:

      • 感谢您的回答。问题在于它是 PCM 音频,每个样本的位数非常相关。例如,当使用 ffmpeg 解码时,我得到 32 或 16 作为每个样本的位,因此我可以正确转换它。我需要将每个样本的输入位提供给重采样器,否则它并不总是知道如何正确处理样本。
      • 你写的是 PCM 音频。如果您有机会验证此声明,您应该能够编辑您的问题并附加相关的媒体类型信息。问题的当前措辞不能说服您正在处理 PCM 音频。
      • 按要求添加媒体信息
      • 我的意思是你有兴趣列举pAudioSampleMediaType中的所有内容
      • 我刚刚看到 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 被分配了一个值。我可以从中获取每个样本的位数。奇怪的是,这是填充但 MF_MT_AUDIO_BITS_PER_SAMPLE 不是。无论如何,感谢您将我推向正确的方向。
      最近更新 更多