1

我想在 Android 中播放视频,将其渲染为 SurfaceTexture 或其他可用作 OpenGL ES 纹理的东西,但我需要非常精确地控制视频的播放速度,以将其与外部事件流同步。这些事件将以大致可预测的速度发生,但确切的速度将取决于许多小的机械细节,受许多小因素的影响,包括天气(甚至可能是月相……)。

android 提供的android.media.MediaPlayer类允许渲染到 SurfaceTexture(Oculus Mobile SDK 中的 360Videos 应用程序成功使用了该功能),但不幸的是似乎不允许改变播放速度,至少据我从文档中可以看出在这里

我尝试过分别使用 pause() 和 start() 暂停和恢复播放,以影响播放速度,但这会导致播放非常不稳定和缓慢。我的想法是让视频具有比以往更高的帧速率,然后手动延迟每一帧,直到它真正需要显示。从日志中的消息来看,在我看来,MediaPlayer 类将在暂停时释放各种需要的资源,并在恢复时重新请求它们,如果您每帧执行一次,这显然会降低性能。

我正在考虑的另一个选择是 ffmpeg。这个似乎会做我想做的事,它本身不做任何计时,它只是在我告诉它到缓冲区时解码帧,让我随时随地使用它。明显的缺点是 ffmpeg,至少在 android 上,不进行硬件解码,可能无法实时解码 4K 媒体。

我还在看的另一件事是 OpenMAX AL。不幸的是,OpenMax AL 很难进入。我还没有找到任何好的初学者文档,只有一些旧的,可能已经过时的自述文件以及来自 Khronos 的接口规范。不过,后者读起来很长而且很麻烦,我什至不知道 OpenMAX AL 是否允许我自己做计时……

4

0 回答 0