是否可以在 Media Foundation 中编码非常大的视频(大于 4K)
Is it possible to encode very large video in Media Foundation (larger than 4K)
根据文档,内置 H264 MFT 的最大分辨率似乎是 4096 × 2304 像素。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx
是否可以使用不同的 MFT 来允许更大的格式,或者根本不可能?
限制是关于编码格式和转换,而不是媒体基础本身。似乎 H265 (HEVC) can support up to 4320p (7680 x 4320) with improved picture quality over H264. However, as you probably noticed, H265 is supported on Windows 10, but their current implementation of the H265 decoder 也有 4096 x 2304 的限制。可以购买包含其他版本 windows 的变换和接收器的 H265 SDK,并支持更高分辨率。
8K UHD [4320p] 信息描述 here。
以及有关给定决议名称的信息here。
Google's VP9 项目最多只支持 4096 x 2304。
一些人注意到并撰写了有关 Google 工程师在 VP10 上工作的文章,并开始将代码推送到 VP8 和 VP9 所在的 public libvpx repository。但这还需要一段时间,在它准备好之前会有很多变化。
当然,如果您觉得代码有点疯狂,您总是可以为媒体基础编写自定义转换和接收器,并在格式和分辨率方面支持任何您喜欢的格式,也许 QUHD 16K (15360 x 8640)。
听起来你手头有一个有趣的项目,但你可能有点超前了。
希望这会有所帮助。
编辑:
你说得很好(附上你的评论)。如果你的颜色格式是标准的,有机会你可以使用 CLSID_CColorConvertDMO 来执行转换,这将在可能的情况下使用 SIMD registers/instructions (不确定是否有大小限制)。它具有作为 DMO 和 MFT 的双接口。它绝对让生活更轻松。
创建 CLSID_CColorConvertDMO 实例并设置输入和输出类型(格式、帧大小等)后,创建一个 IMFSample (using MFCreateSample), and an IMFMediaBuffer (using MFCreateMemoryBuffer) to the sample (using IMFSample::AddBuffer), then all that is necessary is to call ProcessInput and ProcessOutput 来转换缓冲区(预先创建所有项目)。
RomanR 还提供了一些代码here。
如果您的格式不标准,您仍有不错的选择。在使用了一段时间 C++ AMP(它是 DirectCompute 和 HLSL 的包装器)之后,我觉得直接使用 DirectCompute 和 HLSL 更自然。用最简单的术语来说,您可以创建从内存结构映射到 GPU 的数据视图,而 HLSL 非常像 C,而且不难学。
处理完转换后,您只需决定存储格式(headers 等),并提供源和接收器(用于读取和 writing/displaying)。我怀疑与 H264/H265(增加 I/O)相比它会有点臃肿,但转换的开销很小。
根据文档,内置 H264 MFT 的最大分辨率似乎是 4096 × 2304 像素。 https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815(v=vs.85).aspx
是否可以使用不同的 MFT 来允许更大的格式,或者根本不可能?
限制是关于编码格式和转换,而不是媒体基础本身。似乎 H265 (HEVC) can support up to 4320p (7680 x 4320) with improved picture quality over H264. However, as you probably noticed, H265 is supported on Windows 10, but their current implementation of the H265 decoder 也有 4096 x 2304 的限制。可以购买包含其他版本 windows 的变换和接收器的 H265 SDK,并支持更高分辨率。
8K UHD [4320p] 信息描述 here。
以及有关给定决议名称的信息here。
Google's VP9 项目最多只支持 4096 x 2304。 一些人注意到并撰写了有关 Google 工程师在 VP10 上工作的文章,并开始将代码推送到 VP8 和 VP9 所在的 public libvpx repository。但这还需要一段时间,在它准备好之前会有很多变化。
当然,如果您觉得代码有点疯狂,您总是可以为媒体基础编写自定义转换和接收器,并在格式和分辨率方面支持任何您喜欢的格式,也许 QUHD 16K (15360 x 8640)。
听起来你手头有一个有趣的项目,但你可能有点超前了。 希望这会有所帮助。
编辑:
你说得很好(附上你的评论)。如果你的颜色格式是标准的,有机会你可以使用 CLSID_CColorConvertDMO 来执行转换,这将在可能的情况下使用 SIMD registers/instructions (不确定是否有大小限制)。它具有作为 DMO 和 MFT 的双接口。它绝对让生活更轻松。
创建 CLSID_CColorConvertDMO 实例并设置输入和输出类型(格式、帧大小等)后,创建一个 IMFSample (using MFCreateSample), and an IMFMediaBuffer (using MFCreateMemoryBuffer) to the sample (using IMFSample::AddBuffer), then all that is necessary is to call ProcessInput and ProcessOutput 来转换缓冲区(预先创建所有项目)。
RomanR 还提供了一些代码here。
如果您的格式不标准,您仍有不错的选择。在使用了一段时间 C++ AMP(它是 DirectCompute 和 HLSL 的包装器)之后,我觉得直接使用 DirectCompute 和 HLSL 更自然。用最简单的术语来说,您可以创建从内存结构映射到 GPU 的数据视图,而 HLSL 非常像 C,而且不难学。
处理完转换后,您只需决定存储格式(headers 等),并提供源和接收器(用于读取和 writing/displaying)。我怀疑与 H264/H265(增加 I/O)相比它会有点臃肿,但转换的开销很小。