2015-03-13 14 views
7

Używam libvlc i aplikacji na Androida do odtwarzania strumienia sieciowego; kod natywny rysuje obraz na widoku powierzchni.Wykryj, czy Android SurfaceView rysuje/przesuwa

Załóżmy, że wideo zatrzymuje się i nie mam dostępu do natywnego kodu, jak mogę wykryć, czy SurfaceView wciąż się porusza (wideo nie jest zamrożone)?

Próbowałem getViewTreeObserver(). AddOnDrawListener(); i getViewTreeObserver(). addOnPreDrawListener(); ale nie mają efektu, którego szukam.

Dzięki

+0

Czy używasz odtwarzacza multimedialnego w widoku powierzchni do uruchomienia wideo? – Ahmed

+0

Używam vlc, działa na natywnym kodzie – Ambi

Odpowiedz

6

Nie można uzyskać tych informacji z SurfaceView, ponieważ sama SurfaceView nie wie.

Zadaniem SurfaceView jest ustawienie powierzchni i utworzenie otworu w widocznym układzie widoku. Po wykonaniu tych czynności nie jest już aktywnie zaangażowany w proces wyświetlania wideo. Treść płynie z dekodera na powierzchnię, która jest zarządzana przez SurfaceFlinger (systemowy komponent graficzny).

To jest na przykład, jak działa wideo DRM. Aplikacja "odtwarzająca" wideo nie ma dostępu do ramek wideo chronionych mechanizmem DRM. (Tak naprawdę nie jest to SurfaceFlinger, ale jest to dłuższa historia.)

Najlepszym sposobem sprawdzenia, czy treść wciąż przybywa, jest zapytanie źródła wideo, czy nadal wysyła treści. Innym podejściem byłoby zmiana SurfaceView na TextureView i zapewnienie metody wywołania zwrotnego onSurfaceTextureUpdated().

+0

Próbowałem tego podejścia, niestety wywołanie zwrotne jest również wykonywane, jeśli obraz jest zamrożony i nie zmienia już. Nie można tego użyć do wykrycia, czy strumień jest zamrożony. –

+0

@Seppl Jeśli wywołanie zwrotne się uruchamia, oznacza to, że generowane są nowe klatki. Nie ma testu na to, czy nowa ramka zawiera tę samą treść, co poprzednia klatka. Jeśli spojrzysz na źródło (https://android.googlesource.com/platform/frameworks/base/+/marshmallow-mr1-release/core/java/android/view/TextureView.java # 426) widzisz, że callback uruchamia się tylko wtedy, gdy ustawione jest 'mUpdateLayer'. Jest to ustawione przez 'updateLayer()', która jest wywoływana, gdy przychodzą ramki, ale także w niektórych aktualizacjach sterowanych aplikacjami (zmiana rozmiaru, wyświetlanie staje się widoczne, itp.). Połączenia w regularnych odstępach czasu wskazują, że przybywają ramki. – fadden

1

Nie jestem pewien, co dokładnie to, co staramy się osiągnąć tutaj, ale można sprawdzić, czy powierzchnia jest widok renderingu lub nie poprzez wdrożenie interfejsu o nazwie SurfaceHolder.Callback który daje dostęp do następujących metod,

  1. Utworzone na powierzchni - jest wywoływane natychmiast po utworzeniu powierzchni.

  2. Na zmianie powierzchni - Jest to wywoływane natychmiast po wprowadzeniu zmian strukturalnych (format lub rozmiar) na powierzchni.

  3. Na powierzchni Zniszczona - jest wywoływana bezpośrednio przed zniszczeniem powierzchni.

Spójrz na widok powierzchni w widoku documentation. Dla SurfaceHolder spójrz na to link. Zasadniczo, aby wiedzieć,

+0

Próbowałem już tej ścieżki, ale to nie pomaga dla mojego problemu. Próbuję wykryć, czy wideo nadal jest odtwarzane, czy utknęło, wyświetlając tylko jedną klatkę. Kiedy tak się stanie, powierzchnia jest już wypalona na Utwórz i NaChanged. – Ambi

+0

Połączenia zwrotne SurfaceView nie są przydatne - nie uruchamiają aktualizacji zawartości. – fadden

Powiązane problemy