我希望在Android中播放视频,将其渲染为SurfaceTexture或其他可用作OpenGL ES纹理的视频,但我需要对视频的播放速度进行非常精确的控制,以使其与流同步外部事件。这些事件将以大致可预测的速度发生,但确切的速度将取决于许多小的机械细节,受许多小因素的影响,包括天气(甚至可能是月相......)。
android提供的android.media.MediaPlayer
类允许渲染到SurfaceTexture(而Oculus Mobile SDK中的360Videos应用程序成功使用该功能),但遗憾的是似乎不允许改变播放速度,至少不如据我所知,文件here。
我已尝试分别使用pause()和start()暂停和恢复播放,以影响播放速度,但这会导致播放极度不稳定和缓慢。我的想法是让视频具有比以往更高的帧速率,然后手动延迟每一帧直到它实际需要显示。从日志中的消息来看,我认为MediaPlayer类会在暂停时释放各种所需的资源,并在恢复时重新请求它们,如果你每帧执行一次,这显然会导致性能下降。
我正在关注的另一个选择是ffmpeg。这个似乎它会做我想要的,它本身不做任何时间,它只是在我告诉它到缓冲区时解码帧,让我随时使用它,无论何时我想要。显而易见的缺点是ffmpeg,至少在Android上,不进行硬件解码,可能无法实时解码4K媒体。
我看到的另一件事是OpenMAX AL。不幸的是,OpenMax AL很难进入。我还没有找到任何好的初学者文档,只有一些旧的,可能过时的自述文件以及来自Khronos的接口规范。然而,后者是一个非常冗长而繁琐的读物,我甚至无法弄清楚OpenMAX AL是否会让我做自己的时间......