之前搞错了,原来作者不是 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。