Android zawiera interfejsy API, które umożliwiają aplikacjom dostosowywanie ustawień wyświetlania na obsługiwanym sprzęcie. W systemie Android TV aplikacje mogą korzystać z tego mechanizmu, aby wyświetlać treści w najlepszym możliwym formacie, dopasowując częstotliwość wyświetlania klatek i profil kolorów, co zapewni użytkownikom optymalne wrażenia.
Dopasuj do liczby klatek treści
Gdy częstotliwość klatek filmu nie jest zgodna z częstotliwością odświeżania wyświetlacza, użytkownicy mogą zauważyć nieprzyjemne artefakty związane z trzęsieniem obrazu spowodowanym konwersją częstotliwości klatek. Jest to szczególnie widoczne podczas ujęć z powolnym panoramowaniem. Z tego powodu ważne jest, aby użyć interfejsu API SurfaceControl.Transaction.setFrameRate()
, aby poinformować framework o częstotliwości odświeżania treści i o tym, czy materiał wideo kwalifikuje się do niepłynnego przełączania częstotliwości odświeżania.
Więcej informacji znajdziesz w przewodniku po częstotliwości odświeżania.
Dopasowywanie preferowanych profili zdjęć
Interfejs MediaQuality API w Androidzie 16 umożliwia programistom kontrolowanie profili zdjęć.
Oto kilka przykładowych scenariuszy:
- W przypadku filmów i seriali telewizyjnych zmasterowanych z szerszym zakresem dynamicznym deweloperzy mogą poprosić o tryb reżyserski, aby wyświetlać treści zgodnie z zamierzeniami twórcy. Profil filmowy o większej dokładności kolorów uwydatnia subtelne szczegóły w cieni kosztem zwiększenia jasności.
- Transmisje na żywo wydarzeń sportowych, które często są masterowane z wąskim zakresem dynamicznym i oglądane w świetle dziennym, mogą korzystać z profilu, który preferuje jasność nad dokładnością kolorów.
- Deweloperzy gier mogą poprosić o profil o małym opóźnieniu z minimalnym przetwarzaniem obrazu, aby gracze mogli uzyskać najlepszą wydajność wyświetlacza.
Wybieranie profilu z zdjęciem systemowym
Zanim wybierzesz zdjęcie profilowe, sprawdź, czy Twoje urządzenie je obsługuje.
Ten fragment kodu pokazuje, jak za pomocą funkcji getAvailablePictureProfiles()
wysłać zapytanie o wszystkie obsługiwane profile obrazów 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 go przekazać bezpośrednio do MediaCodec za pomocą identyfikatora za pomocą funkcji MediaFormat.KEY_PICTURE_PROFILE_INSTANCE
.
Obsługiwane profile mogą się różnić w zależności od urządzenia. Możesz dopasowywać je do tych znanych identyfikatorów profilu systemowego:
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"