-1

如果我有一个视频文件,它定义了一个 6144 像素长 (x) x 64 像素高 (y) 的视频图像,并且我想显示该视频,以便它在监视器的末端换行。换句话说,我想在显示器上从位置 0,0 开始显示视频的前 1024 个像素,然后从位置 0,64 开始显示视频像素 1024 到 2047,并重复此操作,直到显示器上显示所有 6144 个像素。这意味着视频需要在 1024x768 显示器上环绕 6 次。

做这个的最好方式是什么?DirectX、DirectShow、Media Foundation 或 Windows Media Player ActiveX 控件能否自动为您处理这种包装?我需要最好在 C# 中执行此操作,但不反对使用 C++ 本机。还是这样做的唯一方法是将视频分成6个单独的部分并在单独的窗口中播放?如果将它们分成 6 个单独的视频并在 6 个单独的窗口中播放是唯一合理的方式,那么您如何确保它们同时开始以便同步?

只需考虑下面的每条评论,ffmpeg 和/或 C# 就可以将这个 6144 x 64 像素的视频文件转换为如下内容:

6144 x 64  --->  0-1023 x 64
                 1024-2047 x 64
                 2048-3071 x 64
                 3072-4095 x 64
                 4096-5119 x 64
                 5120-6143 x 64

换句话说,它看起来像被包装但实际上只是一个 1024 x 384 的视频?

4

1 回答 1

2

您需要开发一种转换,将您的 6144x64 视频转换为相关分辨率(1024x768 或不同),并将其与播放器管道之一集成。当您将视频帧转换为所需的分辨率时,这些帧可以像通常的视频播放一样呈现,尤其是。fullscreen in 您需要跨越整个显示器,并且在其演示端播放与播放常规视频文件没有区别,这意味着您可以使用标准组件和 API。

所有视频 API 都是原生的:在大多数(如果不是全部)情况下,最好用 C++ 而不是 C# 实现转换。

使用 DirectShow,您通常会开发一个转换过滤器,它接受视频帧并根据您的要求分别重新排列像素数据。使用 Media Foundation,类似的任务是通过开发 Media Foundation Transform(在 CPU 或 GPU 域中进行数据处理)来实现的。在这两种情况下,您都将转换步骤打包到 API 定义的外形尺寸中并扩展标准管道。

否则,您还可以在播放管道之外准备帧并将它们注入已经准备好的。尽管可能,但它可能是一种更复杂的方式,但对于那些不太熟悉上述 API 的人来说,它可能会更受欢迎。

当您为演示准备重新排列的框架时,您不需要进行额外的演示同步。据推测,这是实现上述任务的方法,因为拆分为多个部分和管理同步演示是目前更复杂的替代方案。

DirectShow 与 Media Foundation - 两个 API 都可以让您播放具有相同质量和性能的视频(例外情况可能是您需要仅 GPU 处理,在这种情况下 Media Foundation 可能是更好的选择,但在您的情况下,您不太可能利用这个优势)。

DirectShow 较老,几乎停止开发,但提供了更多的在线教程、讨论、材料、帮助程序和示例。Windows SDK 7.1 EzRGB24 过滤器示例是转换过滤器的良好起点。

Media Foundation 是更新和“当前”的 API,大概是一个更合理的选择。Windows SDK 7.1 提供MFT_Grayscale Sample作为开发起点。通常可以为 Media Foundation 实现 C# MFT(有充分的理由不这样做 - 12)。尽管 DirectShow 因其是一个具有阶梯式学习曲线的 API 而臭名昭著,但对于视频效果开发人员而言,Media Foundation 甚至是一个更复杂的 API。

一般来说,API 选择应该考虑到您对播放管道的偏好,即使没有定义。

于 2017-11-13T20:58:14.157 回答