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"