我使用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();
}
我该怎么办?
答案 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();
}
}