UWP 上的 Windows Media Foundation 是不是有重采样器?如果是这样,我该如何使用它?

Posted

技术标签:

【中文标题】UWP 上的 Windows Media Foundation 是不是有重采样器?如果是这样,我该如何使用它?【英文标题】:Does Windows Media Foundation on UWP have a resampler? If so how do I use it?UWP 上的 Windows Media Foundation 是否有重采样器?如果是这样,我该如何使用它? 【发布时间】:2020-11-18 14:32:24 【问题描述】:

使用 Win32,我可以访问 CLSID_CResamplerMediaObject,这意味着我可以将我的频道数从 6 个减少到 2 个。

在 UWP 上,这不再定义,我能找到的对重采样器的唯一引用是 CLSID_AudioResamplerMediaObject。但是,当我创建此类的实例并将其传递给我的 MFMediaType_FloatMFMediaType_PCM 类型时,它表示不支持提供的类型...

ComPtr<IUnknown> pTransformUnknown = nullptr;
DxUtil::ThrowIfFailed(CoCreateInstance(CLSID_AudioResamplerMediaObject, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, &pTransformUnknown));
DxUtil::ThrowIfFailed(pTransformUnknown->QueryInterface(IID_PPV_ARGS(&mResampler)));

IMFMediaType* pInputType = nullptr;
DxUtil::ThrowIfFailed(MFCreateMediaType(&pInputType));
DxUtil::ThrowIfFailed(pInputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio));
DxUtil::ThrowIfFailed(pInputType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM)); // Or MFAudioFormat_Float
DxUtil::ThrowIfFailed(pInputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16));
DxUtil::ThrowIfFailed(pInputType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, 6));
DxUtil::ThrowIfFailed(pInputType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000));
DxUtil::ThrowIfFailed(mAudiosourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_AUDIO_STREAM, nullptr, pInputType)); // Fails here!

像往常一样,Microsoft 文档没有帮助,如果有任何帮助,我将不胜感激!

输入文件为 Mp4,具有 1 个 aac 流、6 个通道、16 位音频。

【问题讨论】:

【参考方案1】:

CLSID_AudioResamplerMediaObjectCLSID_CResamplerMediaObject 是同一个东西,f447b69e-1884-4a7e-8055-346f74d6edb3 的 GUID 相同。

您提到的错误不是来自音频重采样器,而是来自 Source Reader API。错误可能被正确报告,表明对于给定的媒体源,阅读器无法提供对提供的媒体类型的转换。发生这种情况可能有多种原因。

【讨论】:

谢谢!那我得进一步调查了。 原来我错过了:MF_MT_AUDIO_CHANNEL_MASK、MF_MT_AUDIO_BLOCK_ALIGNMENT、MF_MT_AUDIO_AVG_BYTES_PER_SECOND...它们都是强制属性。 正确。它们基本上被描述为here,并且在一般情况下,人们想知道解码器究竟建议了什么媒体类型,并从源阅读器请求它。另一种可能的方法是请求部分媒体类型。

以上是关于UWP 上的 Windows Media Foundation 是不是有重采样器?如果是这样,我该如何使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有拓扑的情况下将 Windows Media Foundation 与 UWP 结合使用

如何在 Windows 10 UWP 应用中播放 (MIDI) 声音?

Windows UWP 应用程序中的 MediaElement 不播放音频

通过 Windows 10 uwp 上的代码重新启动

如何在 UWP 视频 StorageFile 中保存 System.Media.DateEncoded

在 ARM 上的 Windows 10 上检测 UWP 应用仿真