UWP 上的 Windows Media Foundation 是否有重采样器?如果是这样,我该如何使用它?
Does Windows Media Foundation on UWP have a resampler? If so how do I use it?
使用 Win32,我可以访问 CLSID_CResamplerMediaObject
,这意味着我可以将通道数从 6 减少到 2。
在 UWP 上,这不再定义,我能找到的唯一对重采样器的引用是 CLSID_AudioResamplerMediaObject
。但是,当我创建此 class 的实例并将其传递给我的 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 文档没有帮助,我将不胜感激!
输入文件是带有 1 个 aac 流、6 个通道、16 位音频的 Mp4。
CLSID_AudioResamplerMediaObject
和 CLSID_CResamplerMediaObject
是同一件事,{f447b69e-1884-4a7e-8055-346f74d6edb3} 的相同 GUID。
您提到的错误不是来自音频重采样器,而是来自来源 Reader API。该错误可能已正确报告,表明对于给定媒体源 reader 无法提供到提供的媒体类型的转换的情况。发生这种情况可能有多种原因。
使用 Win32,我可以访问 CLSID_CResamplerMediaObject
,这意味着我可以将通道数从 6 减少到 2。
在 UWP 上,这不再定义,我能找到的唯一对重采样器的引用是 CLSID_AudioResamplerMediaObject
。但是,当我创建此 class 的实例并将其传递给我的 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 文档没有帮助,我将不胜感激!
输入文件是带有 1 个 aac 流、6 个通道、16 位音频的 Mp4。
CLSID_AudioResamplerMediaObject
和 CLSID_CResamplerMediaObject
是同一件事,{f447b69e-1884-4a7e-8055-346f74d6edb3} 的相同 GUID。
您提到的错误不是来自音频重采样器,而是来自来源 Reader API。该错误可能已正确报告,表明对于给定媒体源 reader 无法提供到提供的媒体类型的转换的情况。发生这种情况可能有多种原因。