由于
Windows.Media
中的命名空间仅在底层使用 Media Foundation,因此我希望使用 WinRT 便捷方法(在 AudioEncodingProperties
、VideoEncodingProperties
上)创建编解码器,然后将它们转换为 IMFMediaType
。但我不知道如何转换它们:
using namespace winrt::Windows::Media::MediaProperties;
constexpr auto TryQI = [](auto el)
{
auto try1 = el.try_as<IMFMediaType>();
WINRT_ASSERT(not try1);
auto try2 = el.Properties().try_as<IMFMediaType>();
WINRT_ASSERT(not try2);
};
TryQI(AudioEncodingProperties::CreateAac(48'000, 2, 128'000));
TryQI(VideoEncodingProperties::CreateUncompressed(MediaEncodingSubtypes::Bgra8(), 1920, 1080));
AudioEncodingProperties.Properties
是IMap<winrt::guid,IInspectable>
。有谁知道要检查 IInspectable
值的目的吗?
它们是 IPropertyValue 对象。
如果你有这个:
auto props = AudioEncodingProperties::CreateAac(48'000, 2, 128'000);
auto prop = props.Properties().Lookup(MF_MT_AUDIO_SAMPLES_PER_SECOND); // Mfapi.h
你可以得到这样一个:
auto value = prop.as<Windows::Foundation::IPropertyValue>().GetUInt32();
或者这个(C++/WinRT):
auto value = winrt::unbox_value<UINT32>(prop);
要从中获取
IMFMediaType
参考,您可以像这样使用 MFCreateMediaTypeFromProperties ,此处使用 C++/WinRT:
com_ptr<IMFMediaType> type;
winrt::check_hresult(MFCreateMediaTypeFromProperties(props.as<IUnknown>().get(), type.put()));