没有调用Android OpenGL ES onFrameAvailable?

时间:2015-07-14 09:35:04

标签: android opengl-es

我使用OpenGL ES播放视频,只需使用Android MediaPlayer即可。 有用。但只是它只运行了几秒钟。 然后再调用onFrameAvailable方法, 我只能听到视频的声音。

  public void onDrawFrame(GL10 paramGL10)
   {
    synchronized (this) {

            if (this.updateSurface)
            {

                this.mSurface.updateTexImage();
                this.mSurface.getTransformMatrix(this.mSTMatrix);
                this.updateSurface = false;
            }
     } 
     myDraw();
   }

    public void onFrameAvailable(SurfaceTexture paramSurfaceTexture)
    {
      this.updateSurface = true;
      requestRender();   
    }

我该怎么办?

3 个答案:

答案 0 :(得分:1)

在我看来,您的问题就像this question and answer中描述的那样。

基本上,SurfaceTexture有一个缓冲池。每当调用onFrameAvailable()时,其中一个缓冲区将从池中获取并将其重新放入,您需要调用updateTexImage()。 现在,可能会在两次调用onFrameAvailable()之间多次调用onDrawFrame()。在这种情况下,从池中分配多个缓冲区,但只有一个被放回(因为updateTexImage()仍然只被调用一次)。这可能导致无法分配更多缓冲区并且onFrameAvailable()的调用停止。

链接答案中提出的解决方案是用整数计数替换布尔标志,并调用updateTexImage()所需的次数。

答案 1 :(得分:0)

我在VideoSurfaceView示例中遇到了同样的问题。我删除了行

setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 

它帮助了我

答案 2 :(得分:-1)

这可能是一个线程问题。由于这两个调用是在单独的线程上。所以你的updateSurface变量可以在设置为true之后设置为false,而没有updateTexImage调用会导致它挂起。

您可以通过重新计算updateSurface来修复竞争条件。 (您还缺少onFrameAvailable中的同步调用。)

private int updateSurface = 0;

public void onDrawFrame(GL10 paramGL10)
   {
    synchronized (this) {

            if (this.updateSurface)
            {

                this.mSurface.updateTexImage();
                this.mSurface.getTransformMatrix(this.mSTMatrix);
                this.updateSurface--;
            }
     } 
     myDraw();
   }

    public void onFrameAvailable(SurfaceTexture paramSurfaceTexture)
    {
      synchronized (this) {
          this.updateSurface++;
          requestRender();   
      }
    }