多个 android 表面消费者 - 视频播放到两个表面视图

Multiple android Surface consumers - video playback to two surfaceviews

我有这个用例,其中视频来自 MediaPlayer has to be delivered to two Surfaces。不幸的是,整个 Android Surface API 缺少该功能(或者至少,在研究了开发者网站之后,我无法找到它)。

我有一个类似的用例,其中视频是由自定义相机模块制作的,但经过轻微修改后,我能够从相机中检索 Bitmap,所以我只使用了 lockCanvas、drawBitmap并在两个 Surface 上解锁并发布。使用 MediaPlayer,我不知道如何检索位图并以正确的时间保持播放。

此外,我尝试使用 Allocation 来实现这一目的,一个分配用作 USAGE_IO_INPUT,两个分配用作 USAGE_IO_OUTPUT,并使用 ioReceive、copyFrom、ioSend 方法。但这也是一条死胡同。由于某些未知原因,RenderScript 引擎在我的平台上非常不稳定,我遇到了很多错误,例如:

android.renderscript.RSInvalidStateException: Calling RS with no Context active.

当传递给 RenderScript.create 的上下文是来自应用程序 class 的 this

 Failed loading RS driver: dlopen failed: could not locate symbol .... falling back to default

(我在某处丢失了完整的日志...)。最后,我无法创建与 MediaPlayer 兼容的正确输入分配类型。由于我平台上提到的 RenderScript 缺陷,我认为这是解决此问题的最后手段。

所以,总而言之:如何将视频(从 mp4 文件)播放到两个 Surfaces?该视频必须同步。此外,更一般的问题是,如何将视频播放到#X Surface's,它可以在播放过程中动态添加、删除?

我已经通过使用具有相同视频文件源的多个 MediaPlayer 实例解决了我的问题。在进行 pause/play/seek 等基本播放器操作时,我只是对每个播放器进行操作。