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ęć panoramicznych. Z tego powodu ważne jest, aby za pomocą interfejsu SurfaceControl.Transaction.setFrameRate()
API 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 zamierzeniami 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 z minimalnym przetwarzaniem obrazu, aby gracze mogli uzyskać najlepszą wydajność wyświetlacza.
Wybieranie systemowego profilu obrazu
Zanim wybierzesz profil obrazu, sprawdź, czy urządzenie go obsługuje.
Poniższy fragment kodu pokazuje, jak za pomocą elementu 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 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"