将TextureView复制到另一个

时间:2017-02-25 00:26:32

标签: android opengl-es opengl-es-2.0 android-mediaplayer android-textureview

我正在尝试将TextureView上的绘图过程复制到其他TextureViews中。主要目标是能够从连接到TextureView的MediaPlayer的一个实例创建一个相同视频的“墙”(我已完成该部分)。这是首次出现性能问题,因为使用多个MediaPlayer实例可能会产生灾难性的性能,并且还要确保所有视频彼此同步。

感谢您的回答/建议。

修改 覆盖onDraw()不起作用,因为TextureView使用OpenGL在其表面上绘制。如果有人对我如何复制或覆盖该行为有一些了解。其他建议当然是受欢迎的!

1 个答案:

答案 0 :(得分:1)

最初,我认为你可能很幸运,这可能是覆盖TextureView的onDraw(Canvas)方法做这样的事情的简单案例:

final int xTiles = 5;
final int yTiles = 5;

@Override
public void onDraw(Canvas canvas){
    int widthPerTile = canvas.getWidth() / xTiles;
    int heightPerTile = canvas.getHeight() / yTiles;
    float widthScale = widthPerTile / (float) canvas.getWidth();
    float heightScale = heightPerTile / (float) canvas.getHeight();

    for(int x = 0; x < xTiles; x++){
        for(int y = 0; y < yTiles; y++){
            canvas.save();
            canvas.translate(x * widthPerTile, y * heightPerTile);
            canvas.scale(widthScale, heightScale);
            super.onDraw(canvas);
            canvas.restore();
        }
    }
}

然后你只需要一个CustomTextureView占用整个屏幕就会看起来很多,因为它会抽出很多次。

但是,这不是TextureView的工作方式。而是使用了一个伪onDraw(Canvas)方法,而是使用自己的draw(Canvas)方法,这是最终的,因此不能覆盖。 TextureView正在使用OpenGL从相机中绘制帧,并且在这个过程中注入自己是非常复杂的,尽管看起来可能会发现正在讨论here之类的例子。这确实是一个高级话题,对于我来说,周六早上可能会为我写一个简洁的答案。

但是,尽管在内存和帧率方面存在一些明显的问题,但我确实设法快速地将一些东西放在一起,以便你能够利用并运行它们:

public class CopyCatTextureView extends View {
    TextureView textureViewToCopy;

    public CopyCatTextureView(Context context) {
        super(context);
    }

    public void setTextureViewToCopy(TextureView view){
        this.textureViewToCopy = view;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if(textureViewToCopy != null){
            textureViewToCopy.draw(canvas);
        }
    }
}

如果您有一个TextureView的网格,其余的是这些CopyCatTextureViews,您可以在每个复制猫上调用setTextureViewToCopy(TextureView)指向单个TextureView,然后只需在每个上调用invalidate()每当你想要一个帧更新时复制猫。显然这不是理想的,但如果你只想要一个框架,那么它很快就会有效。

希望这会有所帮助。祝你好运。

(变量编辑)