我正在使用libvlc和android app来播放网络流;本机代码在surfaceview上绘制图像。
让我们假设视频停止,我无法访问本机代码,如何检测SurfaceView是否仍在移动(视频未冻结)?
我试过getViewTreeObserver()。addOnDrawListener();和getViewTreeObserver()。addOnPreDrawListener();但它们没有我想要的效果。
由于
答案 0 :(得分:6)
您无法从SurfaceView获取该信息,因为SurfaceView本身并不知道。
SurfaceView的工作是设置Surface,并在View布局中创建一个可以看到的洞。一旦完成这些工作,它就不再积极参与显示视频的过程。内容从解码器流向Surface,由SurfaceFlinger(系统图形合成器)管理。
例如,这是DRM视频的工作原理。应用程序"播放"视频无法访问受DRM保护的视频帧。 (实际上,SurfaceFlinger也没有,但那是一个更长的故事。)
了解内容是否仍然到达的最佳方式是询问视频源是否仍在向您发送内容。另一种方法是将SurfaceView更改为TextureView,并提供onSurfaceTextureUpdated()
回调方法。
答案 1 :(得分:1)
我不确定你在这里想要实现什么,但是你可以通过实现一个名为SurfaceHolder.Callback的接口来查看表面视图是否呈现,这可以让你访问以下方法,
On Surface Created - 在首次创建曲面后立即调用。
On Surface Changed - 在对表面进行任何结构更改(格式或尺寸)后立即调用。
On Surface Destroyed - 在表面被摧毁之前立即调用。
查看documentation表面视图。对于SurfaceHolder,请查看此link。基本上是为了知道