Dostosowywanie ustawień wyświetlania

Android zawiera interfejsy API, które umożliwiają aplikacjom dostosowywanie ustawień wyświetlania na obsługiwanym sprzęcie. W systemie Android TV aplikacje mogą wykorzystywać tę funkcję, aby zapewnić wyświetlanie treści w najlepszym możliwym formacie, dopasowując liczbę klatek na sekundę i profil kolorów, co zapewnia optymalne wrażenia podczas oglądania.

Dopasuj do liczby klatek treści

Gdy liczba klatek na sekundę filmu nie jest zgodna z częstotliwością odświeżania wyświetlacza, użytkownicy mogą zauważyć nieprzyjemne artefakty w postaci drgań obrazu wynikające z konwersji liczby klatek na sekundę. Jest to szczególnie widoczne podczas powolnych ujęć z panoramowaniem. Z tego powodu ważne jest, aby za pomocą interfejsu API SurfaceControl.Transaction.setFrameRate() powiadamiać platformę o liczbie klatek na sekundę treści i sygnalizować, czy treści wideo kwalifikują się do przełączenia liczby klatek na sekundę bez zakłóceń.

Więcej informacji znajdziesz w przewodniku po liczbie klatek na sekundę.

Dopasowywanie preferowanych profili obrazu

Interfejs MediaQuality API w Androidzie 16 umożliwia programistom kontrolowanie profili obrazu.

Przykładowe scenariusze:

  • W przypadku filmów i seriali, które zostały zmasterowane z szerszym zakresem dynamiki, deweloperzy mogą poprosić o tryb filmowy, aby dokładnie wyświetlać treści zgodnie z zamierzeniem twórcy. Profil kinowy o większej dokładności kolorów wydobywa subtelne szczegóły w cieniach, zwiększając jasność.
  • W przypadku wydarzeń sportowych na żywo, które często są masterowane z wąskim zakresem dynamicznym i oglądane w świetle dziennym, korzystny może być profil, który stawia na jasność, a nie na dokładność kolorów.
  • Deweloperzy gier mogą poprosić o profil o niskim opóźnieniu i minimalnym przetwarzaniu obrazu, aby gracze mogli w pełni wykorzystać możliwości wyświetlacza.

Wybieranie systemowego profilu obrazu

Zanim wybierzesz profil obrazu, sprawdź, czy urządzenie go obsługuje.

Ten fragment kodu pokazuje, jak za pomocą parametru getAvailablePictureProfiles() wysłać zapytanie o wszystkie obsługiwane profile obrazu i zastosować profil sportowy:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
    val mediaQualityManager: MediaQualityManager =
        context.getSystemService(MediaQualityManager::class.java)
    val profiles = mediaQualityManager.getAvailablePictureProfiles(null)
    for (profile in profiles) {
        // If we have a system sports profile, apply it to our media codec
        if (profile.profileType == PictureProfile.TYPE_SYSTEM
            && profile.name == NAME_SPORTS
        ) {
            val bundle = Bundle().apply { 
                putParcelable(MediaFormat.KEY_PICTURE_PROFILE_INSTANCE, profile)
            }
            mediaCodec.setParameters(bundle)
        }
    }
}

Aby uzyskać konkretny profil według nazwy, użyj tego polecenia: getPictureProfile()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA) {
    val profile = mediaQualityManager.getPictureProfile(
        PictureProfile.TYPE_SYSTEM, NAME_SPORTS, null)
}

Jeśli nie musisz sprawdzać, czy profil jest dostępny, możesz przekazać go bezpośrednio do MediaCodec za pomocą identyfikatora, używając MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Obsługiwane profile mogą się różnić w zależności od urządzenia, ale możesz dopasowywać je do tych znanych identyfikatorów profili systemowych:

const val NAME_STANDARD: String = "standard"
const val NAME_VIVID: String = "vivid"
const val NAME_SPORTS: String = "sports"
const val NAME_GAME: String = "game"
const val NAME_MOVIE: String = "movie"
const val NAME_ENERGY_SAVING: String = "energy_saving"
const val NAME_USER: String = "user"