Определить, если Android SurfaceView рисует / движется
Я использую libvlc на Android и приложение для воспроизведения сетевого потока; нативный код рисует изображение на поверхности.
Давайте предположим, что видео останавливается, и у меня нет доступа к собственному коду, как я могу определить, что SurfaceView все еще движется (видео не заморожено)?
Я попытался getViewTreeObserver(). AddOnDrawListener(); и getViewTreeObserver().addOnPreDrawListener(); но они не имеют эффекта, который я ищу.
Спасибо
2 ответа
Вы не можете получить эту информацию из SurfaceView, потому что сама SurfaceView не знает.
Задача SurfaceView - настроить Surface и создать отверстие в макете View, через которое вы можете видеть. После того, как он сделал эти вещи, он больше не участвует в процессе показа видео. Контент поступает из декодера в Surface, который управляется SurfaceFlinger (системным графическим композитором).
Это, например, как работает DRM-видео. Приложение, "воспроизводящее" видео, не имеет доступа к DRM-защищенным видеокадрам. (На самом деле это не так, как SurfaceFlinger, но это более длинная история.)
Лучший способ узнать, поступает ли контент, - спросить у источника видео, отправляет ли он вам контент. Другой подход заключается в том, чтобы изменить свой SurfaceView на TextureView и предоставить onSurfaceTextureUpdated()
метод обратного вызова.
Я не уверен, что именно то, что вы пытаетесь достичь здесь, но вы можете увидеть, если представление поверхности рендеринга или нет, реализуя интерфейс с именем SurfaceHolder.Callback, который дает вам доступ к следующим методам,
On Surface Created - вызывается сразу после первого создания поверхности.
On Surface Changed - вызывается сразу после того, как на поверхность были внесены какие-либо структурные изменения (формат или размер).
На поверхности уничтожено - вызывается непосредственно перед разрушением поверхности.
Посмотрите на документацию для просмотра поверхности. Для SurfaceHolder взгляните по этой ссылке. В основном для того, чтобы узнать