微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MF_MT_AUDIO_BITS_PER_SAMPLE 始终为 PCM 音频返回零

如何解决MF_MT_AUDIO_BITS_PER_SAMPLE 始终为 PCM 音频返回零

我一直在尝试在 Media Foundation Framework 中检索每个样本的位数,但它始终返回 0,或者给出“未找到请求的属性”HRESULT。

这是我试过的代码

DWORD streamIndex = 0,flag = 0;
LONGLONG audioTimestamp = 0;
ComPtr<IMFSample> pAudioSample = nullptr;
HRESULT result = mImpl->mAudioSourceReader->ReadSample(mImpl->mAudioStreamIndex,&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

解决方法

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

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

您的进一步调查应该是转储整个媒体类型并将其附加到这个问题上。此时,您可能会弄清楚为什么该特定媒体类型缺少该值。

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。