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ą z tego korzystać, aby wyświetlać 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 odpowiada częstotliwości odświeżania wyświetlacza, użytkownicy mogą zauważyć nieprzyjemne artefakty w postaci drgań obrazu spowodowane konwersją liczby klatek na sekundę. Jest to szczególnie widoczne podczas powolnych ujęć panoramicznych. Z tego powodu użyj interfejsu Surface.setFrameRate() API, aby poinformować platformę o liczbie klatek na sekundę treści i zasygnalizować, czy treści wideo kwalifikują się do płynnego przełączania liczby klatek na sekundę.

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

Dopasuj preferowane profile obrazu

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

Oto kilka przykładów:

  • W przypadku filmów i seriali telewizyjnych, które zostały zmasterowane z szerszym zakresem dynamicznym, programiści mogą poprosić o tryb filmowy, aby dokładnie wyświetlać treści zgodnie z zamierzeniami twórcy. Profil kinowy z większą dokładnością kolorów wydobywa subtelne szczegóły w cieniach, zwiększając jasność.
  • Wydarzenia sportowe na żywo, które są często masterowane z wąskim zakresem dynamicznym i oglądane w świetle dziennym, mogą korzystać z profilu, który preferuje jasność zamiast dokładności kolorów.
  • Twórcy gier mogą poprosić o profil o niskim opóźnieniu z minimalnym przetwarzaniem obrazu, aby gracze mogli uzyskać najlepszą wydajność wyświetlacza.

Wybieranie systemowego profilu obrazu

Zanim wybierzesz profil obrazu, musisz sprawdzić, czy jest on obsługiwany przez urządzenie.

Ten fragment kodu pokazuje, jak użyć getAvailablePictureProfiles(), aby 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 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ć profile bezpośrednio do MediaCodec za pomocą MediaFormat.KEY_PICTURE_PROFILE_INSTANCE.

Obsługiwane profile mogą się różnić w zależności od urządzenia, ale możesz dopasować 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"