【问题标题】:How to wrap a video on a monitor?如何在显示器上包装视频?
【发布时间】:2017-11-13 20:03:03
【问题描述】:

如果我有一个视频文件,它定义了一个 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 的视频??

【问题讨论】:

  • 您也可以使用 avisynth 及其较新的亲戚如 vapoursynth,而不是在您的代码中执行此类工作。使用 avisynth 时,请使用源插件 ffmpegsource (ffms2),不要忘记在脚本的最后使用 converttoyuy2()

标签: c# video media-player directshow directx-12


【解决方案1】:

您需要开发一种转换功能,将您的 6144x64 视频转换为相关分辨率(1024x768 或不同),并将其与播放器管道之一集成。当您将视频帧转换为所需的分辨率时,这些帧可以像通常的视频播放一样呈现,尤其是。全屏播放需要跨越整个显示器,在其演示端播放与播放常规视频文件没有区别,这意味着您可以使用标准组件和 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 Filter Sample 是转换筛选器的良好起点。

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

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

【讨论】:

  • 感谢您的输入,您知道我可能会找到任何类型的示例代码来帮助我开始执行 DirectShow 变换过滤器或 MF 变换来包装视频,如上述?我最近一直在尝试一些 MF Player 示例代码。根据您上面的消息,我的理解是进行转换是处理此类事情的最佳方式。
  • ffmpeg 是否可以将 6144x64 视频文件转换为可以在一台显示器上按上述定义播放的视频文件,看起来好像它被包装了一样?但基本上是 1024 x 768 的视频?
  • 我不确定您是否可以使用带有命令行参数 (video filters?) 的 ffmpeg 来分别重新排列数据,但是另一个问题是您还需要以编程方式使用此输出或通过方式播放ffmpeg/ffplay 也是如此。
  • 如果 ffmpeg 或类似的东西可以重新排列视频文件,我希望能够使用来自 C# 应用程序的 windows 媒体播放器 activex 控件播放它。但我想我也可以使用 C# 中的 ffmpeg/ffplay 来播放视频??只要我能获得有效的视频文件,请参阅我对上面原始问题的编辑 - 我认为 WMP axtivex 控件会播放它?
  • 使用 ffmpeg,您将解决一组略有不同的任务:1 使用视频过滤器重新排列数据(请参阅上面的链接并寻找一起使用多个过滤器),2 写入使用合理的编解码器在合理的时间内不损失质量的文件,3 处理在您真正开始播放之前完全处理文件的要求。
猜你喜欢
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2012-05-05
相关资源
最近更新 更多