(发现)直接在 Emacs 的文本里播放视频

之前搞错了,原来作者不是 emacs-reader 的作者,而是之前尝试 SDL 的方式改造 Emacs 图形渲染端的那个哥们,直接在 emacs 的文本区里直接以 30fps 播放视频。

https://www.reddit.com/r/emacs/comments/1qq2t41/rendering_30fps_video_inside_emacs_text_buffer/

他解释了技术原理,不明觉厉:

确实,我需要更新 README,提供更多关于架构的信息。所以,总结一下,PALE 的功能如下:

  • PALE 能够通过将高分辨率帧分割成更小的瓦片(例如每块 256 像素),然后将每个瓦片以 PPM ASCII 二进制格式渲染,Emacs 可以显示这种格式。
  • 它通过 OpenGL 与 GPU 通信,要求 GPU 渲染纹理并执行任何必要的计算。一旦完成,它会获取 RGB 像素,进行翻转(因为 OpenGL 的像素顺序是相反的),然后添加一个 PPM 头。
  • Emacs 会接收这些 PPM 瓦片,为每个瓦片创建一个覆盖层,并使用哈希表将 PPM 数据作为每个覆盖层的 display 属性,这样每个覆盖层就显示了来自后端的确切瓦片。
  • 当我们需要进行动画(与视频不同)时,PALE 只会更改“脏瓦片”,即那些 需要 更改以动画化图片一部分的瓦片。
  • 对于视频,我们使用一个运行在 UNIX 管道中的 ffmpeg,它为视频的每一帧提供 RGB24 像素。我们将这些帧上传到 GPU,然后重复上述过程,获取瓦片,并在 Emacs 中显示它们。

关于 FPS,视频和动画是不同的。对于视频,它会尝试与 ffmpeg 提供的视频本身的 FPS 同步。上面的演示正在显示一个 30FPS 的视频,所以 PALE 是这样做的。如果视频是 60FPS,它会尝试以该速率显示,但我还没有测试过 60FPS。

对于动画,你可以任意提高 FPS,但需要注意的是,超过 90 或 120 之后,它会开始出现明显的卡顿。我最终会以更好的方式为视频和动画公开 FPS API。

6 个赞

有些误解,作者确实是 Divya Ranjan(emacs-reader 的作者)。 Aleksandr 也是该项目的贡献者(他最近添加了 macOS Metal 支持)。希望这 能解决您的困惑。

PALE 是为了在 Emacs Reader 中实现部分渲染(仅更新需要更新的部分)而编 写的,原计划日后将其作为独立库发布,但结果惊人,因此 Divya 直接现在就 发布了它。

3 个赞

更新:PALE 的黑客技巧(可能、希望)在未来将不再需要。

由于Minad(他对PALE表现出了极大兴趣)新近提供的补丁,已经为我们提供了 一个直接的画布支持(这正是我们迫切需要的!随着这项补丁的合并, emacs-reader将变得更加强大——当然,前提是合并成功的话)。

5 个赞