Na tej stronie opisujemy różne typy powierzchni, które można wykorzystać do odtwarzania filmów za pomocą Media3, oraz sposób wyboru odpowiedniego typu do Twojego przypadku użycia. Więcej informacji o obiektach Surface w Androidzie znajdziesz w tym dokumencie dotyczącym grafiki.
Ustawianie powierzchni
Player ma 4 punkty wejścia, które umożliwiają podłączenie wyjścia wideo do urządzeniaSurface:
void setVideoSurface(@Nullable Surface surface)void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void setVideoSurfaceView(@Nullable SurfaceView surfaceView)void setVideoTextureView(@Nullable TextureView textureView)
Możesz też wyczyścić je na różne sposoby:
void clearVideoSurface()void clearVideoSurface(@Nullable Surface surface)void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void clearVideoSurfaceView(@Nullable SurfaceView surfaceView)void clearVideoTextureView(@Nullable TextureView textureView)
Wybierz typ powierzchni dla PlayerView
Atrybut surface_type elementu PlayerView umożliwia ustawienie typu powierzchni używanej do odtwarzania filmu. Dozwolone wartości:
surface_view(SurfaceView)texture_view(TextureView)spherical_gl_surface_view(SphericalGLSurfaceView) – do odtwarzania filmów sferycznychvideo_decoder_gl_surface_view(VideoDecoderGLSurfaceView) – renderowanie filmów za pomocą rozszerzonych modułów renderującychnone– służy tylko do odtwarzania dźwięku i należy go używać, aby uniknąć konieczności tworzenia powierzchni, co może być kosztowne.
Jeśli widok dotyczy zwykłego odtwarzania filmu, użyj surface_view lub texture_view. SurfaceView ma wiele zalet w porównaniu z TextureView w przypadku odtwarzania filmów:
- Znacznie mniejsze zużycie energii na wielu urządzeniach.
- Dokładniejsze określanie czasu klatek, co zapewnia płynniejsze odtwarzanie filmów.
- Obsługa wyższej jakości wyjścia wideo HDR na urządzeniach z tą funkcją.
- Obsługa bezpiecznego wyjścia podczas odtwarzania treści chronionych przez DRM.
- Możliwość renderowania treści wideo w pełnej rozdzielczości wyświetlacza na urządzeniach z Androidem TV, które zwiększają rozdzielczość warstwy interfejsu.
Dlatego w miarę możliwości należy preferować SurfaceView zamiast TextureView.
TextureView należy używać tylko wtedy, gdy SurfaceView nie spełnia Twoich wymagań. Przykładem jest sytuacja, w której przed Androidem 7.0 (interfejs API na poziomie 24) wymagane są płynne animacje lub przewijanie powierzchni wideo, jak opisano w tych uwagach. W tym przypadku lepiej używać TextureView tylko wtedy, gdy SDK_INT jest mniejsze niż 24 (Android 7.0), a w pozostałych przypadkach – SurfaceView.
Wybieranie typu powierzchni w Compose
W Compose rozwiązanie do współdziałania korzysta z funkcji kompozycyjnej AndroidView do opakowywania elementów SurfaceView i TextureView. Dwa komponenty, które odpowiadają temu warunkowi, to AndroidExternalSurface i AndroidEmbeddedExternalSurface z androidx.compose.foundation. Klasy proxy udostępniają jednak interfejs API, który ogranicza dostęp do widoków bazowych. Te widoki są potrzebne Player do obsługi pełnego cyklu życia powierzchni (tworzenie i aktualizacje rozmiaru).
W module media3-ui-compose znajdziesz komponenty ContentFrame i PlayerSurface, które łączą Player z Surface w sposób uwzględniający cykl życia. W tym przypadku typy powierzchni to:
androidx.media3.ui.compose.SURFACE_TYPE_SURFACE_VIEWandroidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW
Nie ma typu none, ponieważ odpowiadałby on nieuwzględnieniu funkcji kompozycyjnej w drzewie interfejsu Compose.