Na Androidzie 12 (poziom interfejsu API 31) i nowszym system może automatycznie przekonwertować dane w takich formatach jak HEVC (H.265) i AVC (H.264), jeśli są otwierane przez aplikację, która nie obsługuje HEVC. Ta funkcja umożliwia nagrywanie filmów Przechwytywać aplikacje, aby móc korzystać z nowoczesnego kodowania filmów, oszczędzającego pamięć nagrane na urządzeniu bez negatywnego wpływu na zgodność z innymi aplikacjami.
Poniższe formaty mogą być automatycznie transkodowane w przypadku treści utworzone na urządzeniu:
Format multimediów | Atrybut XML | Typ MIME MediaFormat |
---|---|---|
HEVC (H.265) | protokół HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10. |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android zakłada, że aplikacje mogą obsługiwać odtwarzanie wszystkich formatów multimediów, transkodowanie zgodnych multimediów jest domyślnie wyłączone.
Kiedy stosować transkodowanie
Transkodowanie to kosztowny technicznie proces, który wiąże się ze znacznym można opóźnić otwarcie pliku wideo. Na przykład jednominutowy plik wideo HEVC około 20 sekund na transkodowanie na AVC na telefonie Pixel 3. Z tego powodu pliku wideo należy transkodować tylko wtedy, gdy przesyłasz go urządzenia. Na przykład podczas udostępniania pliku wideo innym użytkownikom lub serwer w chmurze, który nie obsługuje nowoczesnych wideo formatów reklam.
Nie transkoduj podczas otwierania plików wideo na potrzeby odtwarzania na urządzeniu lub do tworzenia miniatur.
Konfigurowanie transkodowania
Aplikacje mogą kontrolować działanie transkodowania, deklarując multimedia funkcje zabezpieczeń. Są 2 sposoby zadeklarowania tych funkcji: w kodzie lub w zasobie.
Deklarowanie możliwości w kodzie
Możesz zadeklarować w kodzie możliwości związane z multimediami, tworząc instancję
Obiekt ApplicationMediaCapabilities
za pomocą konstruktora:
Kotlin
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
Java
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build();
Używaj tego obiektu, gdy chcesz uzyskiwać dostęp do multimediów za pomocą takich metod jak
ContentResolver#openTypedAssetFileDescriptor()
:
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Ta metoda umożliwia szczegółową kontrolę nad określonymi ścieżkami kodu, jako wywoływania transkodowania tylko podczas przesyłania pliku wideo poza urządzenie. Ma ona pierwszeństwo przed metodą opisaną poniżej.
Deklarowanie możliwości zasobu
Zadeklarowanie możliwości w zasobie pozwala na ogólną kontrolę transkodowania. Tej metody należy używać tylko w ściśle określonych przypadkach. Jeśli na przykład aplikacja odbiera pliki wideo tylko z innych aplikacji (nie otwiera ich bezpośrednio) i przesyła je na serwer, który nie obsługuje nowoczesnych kodeków wideo (zobacz przykładowy scenariusz 1 poniżej).
Używanie tej metody, gdy nie jest absolutnie konieczne, może spowodować transkodowanie w niezamierzonych sytuacjach, np. przy miniaturze filmów, co pogarsza wrażenia użytkowników.
Aby użyć tej metody, utwórz plik zasobów media_capabilities.xml
:
<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>
W tym przykładzie filmy HDR nagrane na urządzeniu są płynnie transkodowane na Filmy AVC SDR (standardowy zakres dynamiki) nie są obsługiwane, a filmy HEVC nie są.
Użyj tagu property
w tagu application
, aby dodać odwołanie do multimediów
możliwości. Dodaj do pliku AndroidManifest.xml
te właściwości:
<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />
otwieranie pliku wideo za pomocą funkcji multimedialnych innej aplikacji;
Jeśli aplikacja udostępnia plik wideo innej aplikacji, konieczne może być transkodowanie przed otwarciem przez aplikację odbierającą.
W tej sytuacji możesz otworzyć plik wideo za pomocą narzędzia openTypedAssetFileDescriptor
i określić identyfikator UID aplikacji odbierającej, który można uzyskać za pomocą Binder.getCallingUid
.
Następnie platforma korzysta z możliwości multimedialnych aplikacji odbierającej, aby określić,
czy trzeba transkodować plik wideo.
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on the media capabilities of the // calling app. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on the media capabilities of the // calling app. }
Przykładowe scenariusze
Poniższe diagramy ilustrują 2 typowe przypadki użycia. W obu przypadkach oryginalny film jest zapisywany w formacie HEVC, a aplikacja do udostępniania filmów nie i obsługują HEVC.
Przykład 1. Transkodowanie jest inicjowane przez aplikację do nagrywania filmów.
Aplikacja do udostępniania filmów deklaruje, że nie obsługuje HEVC w swoich multimediach
pliku zasobów funkcji. Następnie wysyła żądanie udostępnienia filmu do aplikacji do nagrywania filmów. Nagrywanie filmu
aplikacja obsługuje żądanie i otwiera plik za pomocą parametru openTypedAssetFileDescriptor
, który określa identyfikator UID aplikacji do udostępniania. Rozpocznie się proces transkodowania.
Po transkodowaniu film jest dostarczany do aplikacji do udostępniania, która przesyła go na serwer w chmurze.
Przykład 2. Transkodowanie jest inicjowane przez aplikację do udostępniania filmów.
Aplikacja do nagrywania filmów udostępnia film aplikacji do udostępniania filmów za pomocą
Identyfikator URI MediaStore
. Aplikacja do udostępniania wideo otwiera plik wideo za pomocą narzędzia openTypedAssetFileDescriptor
, wskazując, że nie obsługuje on HEVC w ramach funkcji multimediów. Ten
rozpoczyna proces transkodowania. Po jego zakończeniu plik jest przesyłany do
z serwerem w chmurze.
Niezadeklarowane formaty
Transkodowanie zgodnych multimediów jest włączone w przypadku wszystkich zadeklarowanych formatów nieobsługiwany i wyłączony we wszystkich zadeklarowanych obsługiwanych formatach. Dla: formatów, które nie zostały zadeklarowane, platforma decyduje, czy transkodować lub nie. Na Androidzie 12 transkodowanie jest wyłączone dla wszystkich niezadeklarowanych formatów. Może to się zmienić w przypadku nowych formatów na stronie w przyszłości.
Opcje programisty
Aby zastąpić domyślne ustawienia Androida, możesz użyć tych opcji programisty. transkodowanie:
Zastąp domyślne ustawienia transkodowania To ustawienie określa, czy a platforma kontroluje automatyczne transkodowanie. Podczas zastępowania jest włączona, wartości domyślne platformy są ignorowane, a opcja włączona transkodowanie kontroluje automatyczne transkodowanie. Ta opcja jest wyłączona przez: wartość domyślną.
Włącz transkodowanie – to ustawienie określa, czy nie zadeklarowano są automatycznie transkodowane. Jest ona domyślnie włączona, ale tylko działa, jeśli jest też włączone zastępowanie domyślnych ustawień transkodowania.
Zakładaj, że aplikacje obsługują nowoczesne formaty To ustawienie określa, co się dzieje, gdy aplikacja próbuje odtworzyć niezadeklarowany format. Dzieje się tak, gdy plik manifestu bez deklaracji, czy aplikacja obsługuje dany format. Użytkownik nie dodał aplikacji do listy wymuszonych transkodowania po stronie serwera. Gdy ustawienie jest włączona, aplikacja nie transkoduje, a gdy jest wyłączona, po transkodowaniu. Ta opcja jest domyślnie włączona.
Pokaż powiadomienia transkodowania Po włączeniu tej opcji aplikacja wyświetla powiadomienie o postępie transkodowania po aktywowaniu transkodowania przez odczytanie nieobsługiwany plik multimedialny. Ta opcja jest domyślnie włączona.
Wyłącz pamięć podręczną transkodowania. Gdy ta opcja jest włączona, aplikacje wymagające transkodowania nie są korzysta z pamięci podręcznej transkodowania. Może to być pomocne podczas programowania, aby łatwo uruchamia transkodowanie w nieobsługiwanym pliku multimedialnym, ale może powodować problemy z urządzeniem skuteczność reklam. Domyślnie ta opcja jest wyłączona.