问题描述
我一直在尝试在 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 的一个怪癖,但似乎有效。