gpt4 book ai didi

android - SurfaceTexture.OnFrameAvailableListener 停止被调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:56 29 4
gpt4 key购买 nike

我正在我的应用程序中实现 SurfaceTexture.OnFrameAvailableListener 接口(interface),因此我可以将视频帧用作 OpenGL 纹理。一切都按应有的方式设置,并且运行完美,但是 onFrameAvailable(SurfaceTexture surfaceTexture) 在几秒钟后停止调用,有效且看似卡住了 OpenGL 中的视频,因为没有通过 SurfaceTexture.updateTextImage 上传新的纹理数据。

我在 onFrameAvailable 中设置了一个标志,以便仅在需要时从 GL 线程执行 updateTextImage 调用。目前,我在每次绘制调用时都将标志设置为 true,以便在跳过 onFrameAvailable 检查时每帧上传视频纹理数据。像这样,一切都按应有的方式运行,但它似乎效率低下,因为如果它仍然相同(电影帧),则不需要上传新的纹理数据。

据我所知,没有内存泄漏,logcat 也没有显示任何错误。此外,媒体播放器已设置为循环播放,但问题发生在单次运行完成之前。

什么会导致 onFrameAvailable 在几秒钟后不再被调用?

最佳答案

我在某些设备上遇到了完全相同的问题。找到了一个修复程序并认为我会分享。基本上这是@user2254894 的建议,除了因为计数器可以由 2 个不同的线程更改,所以使用 2 个不同的变量是个好主意。下面是一些示例代码:

private int             _updateTexImageCounter = 0;
private int _updateTexImageCompare = 0;

onFrameAvailable() 很简单。

@Override
public void onFrameAvailable(SurfaceTexture surfaceTexture)
{
// increment every time a new frame is avail
_updateTexImageCounter++;
}

然后在您的 GL 更新中,您将执行如下操作...

public void update() 
{

.... create texture... etc.
..
// compare _updateTexImageCompare and _updateTexImageCounter
if( _surfaceTexture!=null && _updateTexImageCompare != _updateTexImageCounter )
{
// loop and call updateTexImage() for each time the onFrameAvailable() method was called below.
while(_updateTexImageCompare != _updateTexImageCounter) {
_surfaceTexture.updateTexImage();
_surfaceTexture.getTransformMatrix(x);

_updateTexImageCompare++; // increment the compare value until it's the same as _updateTexImageCounter
}
}


}

这对我有用。让我知道是否有更好的方法。

关于android - SurfaceTexture.OnFrameAvailableListener 停止被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185661/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com