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