是否可以在单个 SurfaceView 上同时渲染两个视频流?

Is it possible to render two video streams simultaneously on a single SurfaceView?

是否可以使用单个 SurfaceView 的不同 "sections" 同时呈现两个视频流?

我已经制作了使用两个并排的 SurfaceView 同时渲染两个视频的示例代码,但我想知道是否可以让两个视频在同一个 SurfaceView.[=19= 上播放]

使用 MediaPlayer,您可以将 SurfaceHolder 或 Surface 本身设置为显示。我相信实现我所要求的代码将在 surfaceCreated 方法中:

@Override
public void surfaceCreated(SurfaceHolder holder)
{
    mediaPlayerTop.setDisplay(holder);
    mediaPlayerBottom.setDisplay(holder);

    play();
}

但是,当您尝试 prepare 第二个 MediaPlayer 时,简单地将两个 MediaPlayer 设置为相同的 Surface 会导致 IllegalStateException(这忽略了事实他们可能无论如何都会重叠,因为我没有在任何地方设置位置)。

基本上,我想要实现的目标是否可行?

是的,但需要一些努力。

基本计划是将 MediaPlayer 的输出定向到 SurfaceTexture,它将每个传入帧转换为 GLES 纹理。然后将其渲染到 SurfaceView,绘制一个填充一半视图的矩形。你对另一个 MediaPlayer 做同样的事情。

您需要的作品可以在 Grafika 中找到,例如"texture from camera" Activity 从相机预览中获取视频流,将其转换为 GLES 纹理,并将其渲染到 SurfaceView。

简单地将两个 MediaPlayer 的输出定向到单独的 SurfaceView 更容易,但灵活性较低。

表面是生产者-消费者对中的端点。一次只能有一个制作人,所以你不能简单地将两个 MediaPlayer 指向一个 SurfaceView。