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_Float
或 MFMediaType_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_AudioResamplerMediaObject
和 CLSID_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 不播放音频