Java 从MediaCodec将同一视频渲染到两个曲面

Java 从MediaCodec将同一视频渲染到两个曲面,java,android,android-mediacodec,Java,Android,Android Mediacodec,MediaCodec有两种操作方式:传递一个用于渲染的缓冲区,或者读取输出缓冲区并自己将其绘制到屏幕上 在第一种情况下,我通过一个曲面:是否可以在两个曲面上绘制相同的MediaCodec解码视频 解码循环如下所示: int outputBufferId = codec.dequeueOutputBuffer(…); if (outputBufferId >= 0) { //Do nothing, the MediaCodec will automatically draw to

MediaCodec有两种操作方式:传递一个用于渲染的缓冲区,或者读取输出缓冲区并自己将其绘制到屏幕上

在第一种情况下,我通过一个曲面:是否可以在两个曲面上绘制相同的MediaCodec解码视频

解码循环如下所示:

int outputBufferId = codec.dequeueOutputBuffer(…);
  if (outputBufferId >= 0) {
    //Do nothing, the MediaCodec will automatically draw to our surface
    //But how to draw to 2 surfaces?
    codec.releaseOutputBuffer(outputBufferId, …);
  } else if (outputBufferId == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
    // Subsequent data will conform to new format.
    // Can ignore if using getOutputFormat(outputBufferId)
    outputFormat = codec.getOutputFormat(); // option B
  }

如果要同时绘制多个曲面,唯一的方法是使用OpenGL

如果你愿意,我可以给你一些建议

首先,你需要一个表面纹理支持的表面。表面纹理是解码器将解码帧排队的地方,您可以从那里检索它。一旦表面纹理中有一个框架可用,您将使用OpenGL(多个EGLSurface连接到每个曲面。您可以使用eglCreateWindowSurface创建这样的曲面)


连接曲面并创建有效的EGL上下文后,只需在创建的EGL曲面中使用eglMakeCurrent和pass,每个绘制操作一个。所以eglMakeCurrent将允许您一次在一个曲面上绘制,您可以对每个曲面进行绘制。您通常可以在grafika中找到其中一些示例。如果要同时绘制多个曲面,唯一的方法是使用OpenGL

如果你愿意,我可以给你一些建议

首先,你需要一个表面纹理支持的表面。表面纹理是解码器将解码帧排队的地方,您可以从那里检索它。一旦表面纹理中有一个框架可用,您将使用OpenGL(多个EGLSurface连接到每个曲面。您可以使用eglCreateWindowSurface创建这样的曲面)


连接曲面并创建有效的EGL上下文后,只需在创建的EGL曲面中使用eglMakeCurrent和pass,每个绘制操作一个。所以eglMakeCurrent将允许您一次在一个曲面上绘制,您可以对每个曲面进行绘制。您通常可以在grafika中找到其中一些示例

您可以共享代码片段吗?您可以共享代码片段吗?