Uyumlu medya kodu dönüştürme

Android 12 (API düzeyi 31) ve sonraki sürümlerde sistem, otomatik olarak dönüştürme yapabilir. HEVC (H.265) - AVC (H.264) gibi biçimlerde kaydedilen videolar, HEVC'yi desteklemeyen bir uygulama tarafından açılmışsa. Bu özellik, videolarda Videolar için daha modern ve depolama alanı verimli şekilde kodlama kullanan uygulamalar yakalayın. diğer uygulamalarla uyumluluktan ödün vermeden cihaza kaydedilmiştir.

Aşağıdaki biçimlerin kodu, izin verilen içerik için otomatik olarak cihazda oluşturuldu:

Medya biçimi XML Özelliği MediaFormat MIME türü
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MedyaÖzellik.HdrType.HDR10_PLUS

Android, uygulamaların tüm medya biçimlerinin oynatılmasını destekleyebileceğini varsayar. uyumlu medya kodu dönüştürme varsayılan olarak kapalıdır.

Kod dönüştürme ne zaman kullanılır?

Kod dönüştürme, işlem yükü açısından pahalı bir işlemdir ve kod dönüştürme, açarken gecikme yaşayabilirsiniz. Örneğin, bir dakikalık bir HEVC video dosyası Pixel 3 telefonda AVC'ye dönüştürmenin yaklaşık 20 saniyesi var. İşte bu nedenle bir video dosyasının kodunu yalnızca onu olanak tanır. Örneğin, bir video dosyasını aynı kullanıcının diğer modern videoyu desteklemeyen bir bulut sunucusu biçimlerinden biridir.

Cihaz üzerinde oynatma veya küçük resim görüntüleri oluşturmak için video dosyalarını açarken kod dönüştürme yapmayın.

Kod dönüştürmeyi yapılandırma

Uygulamalar medyalarını tanımlayarak kod dönüştürme davranışlarını kontrol edebilir özellikler. Bu özellikleri tanımlamanın iki yolu vardır: kodda, daha fazla bilgi edinir.

Koddaki özellikleri tanımlama

Bir Oluşturucu kullanan ApplicationMediaCapabilities nesne:

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();

Aşağıdaki gibi yöntemler aracılığıyla medya içeriğine erişirken bu nesneyi kullanın 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.
}

Bu yöntem, belirli kod yolları için ayrıntılı kontrol olanağı sağlar: olarak, yalnızca video dosyasını cihaz dışına aktarırken kod dönüştürmeyi çağırır. Bu yöntem, aşağıda açıklanan yönteme göre önceliklidir.

Bir kaynaktaki özellikleri tanımlama

Bir kaynaktaki özelliklerin tanımlanması, kod dönüştürme üzerinde sınırsız kontrol sağlar. Bu yöntem yalnızca çok belirli durumlarda kullanılmalıdır. Örneğin, uygulamanız yalnızca diğer uygulamalardan video dosyaları alır (doğrudan açmak yerine) ve bunları, modern video codec'lerini desteklemeyen bir sunucuya yükler (bkz. 1. senaryoyu inceleyin).

Bu yöntemin kesinlikle gerekli olmadığı durumlarda kullanılması, videoların küçük resimlerinin oluşturulması gibi istenmeyen senaryolarda kod dönüştürmeyi başlatarak kullanıcı deneyiminin kalitesini düşürebilir.

Bu yöntemi kullanmak için bir media_capabilities.xml kaynak dosyası oluşturun:

<?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>

Bu örnekte, cihazda kaydedilen HDR videoların kodu sorunsuz bir şekilde AVC SDR (standart dinamik aralık) videosu, HEVC videoları ise değildir.

Medyaya referans eklemek için application etiketi içinde bir property etiketi kullanın özellikleri dosyasıdır. AndroidManifest.xml dosyanıza şu özellikleri ekleyin:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

Video dosyasını açmak için başka bir uygulamanın medya özelliklerini kullanma

Uygulamanız başka bir uygulamayla video dosyası paylaşıyorsa video dosyasının Alıcı uygulama tarafından açılmadan önce kod dönüştürmenin yapılması gerekir.

Bu sorunu çözmek için openTypedAssetFileDescriptor kullanarak bir video dosyası açabilirsiniz. ve alıcı uygulamanın Binder.getCallingUid kullanılarak edinilebilecek UID'sini belirtin. Platform, daha sonra kullanıcıları hangi uygulamanın alacağını belirlemek için Video dosyasının kod dönüştürmesinin yapılıp yapılmayacağını belirler.

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.
}

Örnek senaryolar

Aşağıdaki diyagramlarda yaygın olarak karşılaşılan iki kullanım alanı gösterilmektedir. Her iki durumda da orijinal video HEVC biçiminde saklanır ve video paylaşım uygulaması HEVC'yi destekler.

1.örnek Kod dönüştürme, video yakalama uygulaması tarafından başlatılır. 1. Örnek. Video paylaşım uygulaması, medyasında HEVC'yi desteklemediğini beyan ederse özellikler kaynak dosyası. Ardından, video yakalama uygulamasından bir video istiyor. Videoyu yakalama Bu uygulama isteği işler ve openTypedAssetFileDescriptor kullanarak dosyayı açarak paylaşım uygulamasının UID'sini belirtir. Bu, kod dönüştürme işlemini başlatır. Kodu dönüştürülmüş video alındığında paylaşım uygulamasına gönderilir ve uygulama buluttaki bir sunucuya yükler.

2.örnek Kod dönüştürme işlemi, video paylaşım uygulaması tarafından başlatılır. 2. Örnek. Video yakalama uygulaması, bir videoyu video paylaşım uygulamasıyla paylaşmak için bir MediaStore URI. Video paylaşım uygulaması, video dosyasını openTypedAssetFileDescriptor kullanarak açar ve medya özelliklerinde HEVC'yi desteklemediğini belirtir. Bu kod dönüştürme işlemini başlatır ve tamamlandıktan sonra dosya nasıl hazırlanabileceğinizi öğreneceksiniz.

Bildirilmemiş biçimler

Uyumlu medya kodu dönüştürme, bildirilen tüm biçimler için etkindir desteklenmez ve desteklendiği bildirilen tüm biçimler için devre dışı bırakılır. Örneğin, diğer biçimler bildirildiğinde platform, kod dönüştürmenin veya hakkında bilgi edindiniz. Android 12'de kod dönüştürme devre dışıdır (beyan edilmemiş tüm biçimler için) Bu davranış, duymuş olabilirsiniz.

Geliştirici seçenekleri

Android'in varsayılan ayarını geçersiz kılmak için aşağıdaki geliştirici seçeneklerini kullanabilirsiniz kod dönüştürme davranışı:

  • Kod dönüştürme varsayılanlarını geçersiz kıl Bu ayar, Platform, otomatik kod dönüştürmeyi kontrol eder. Geçersiz kılma sırasında etkinleştirilirse platform varsayılanları yoksayılır ve kod dönüştürme ayarı, otomatik olarak kod dönüştürmeyi kontrol eder. Bu seçenek, varsayılandır.

  • Kod dönüştürmeyi etkinleştir Bu ayar bildirilip bildirilmediğini belirtir biçimleri otomatik olarak dönüştürülür. Varsayılan olarak etkindir, ancak kod dönüştürme varsayılanlarını geçersiz kılma özelliği de etkinleştirildiğinde etkili olur.

  • Uygulamaların modern biçimleri desteklediğini varsay Bu ayar, Uygulama, beyan edilmemiş bir biçimi oynatmaya çalışıyor. Bu durum, manifest dosyasında uygulamanın belirli bir biçimi destekleyip desteklemediğini beyan etmemeli veya Google uygulamayı, sunucu tarafı zorunlu kod dönüştürme listesine eklemedi. Ayar etkinleştirilirse uygulamanın kodunu dönüştürmez. Devre dışı bırakıldığında, uygulama kod dönüştürme. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme bildirimlerini göster Etkinleştirildiğinde, uygulama kod dönüştürme işlemi tetiklendiğinde kod dönüştürme ilerleme bildirimi desteklenmeyen medya dosyası. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme önbelleğini devre dışı bırak Etkinleştirilirse, kod dönüştürme gerektiren uygulamalar kod dönüştürme önbelleğini kullanır. Bu özellik, geliştirme sürecinde desteklenmeyen bir medya dosyasında kod dönüştürmeyi tetikleyebilir, ancak cihazın bozulmasına neden olabilir bazı yolları da görmüştük. Bu seçenek varsayılan olarak devre dışıdır.