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"