Transkodowanie zgodnych multimediów

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
HDR10HDR10 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. Przykład 1 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. Przykład 2 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.