Uyumlu medya kodu dönüştürme

Android 12 (API düzeyi 31) ve sonraki sürümlerde, videolar HEVC'yi desteklemeyen bir uygulama tarafından açıldığında sistem HEVC (H.265) gibi biçimlerde kaydedilen videoları AVC'ye (H.264) otomatik olarak dönüştürebilir. Bu özellik, video yakalama uygulamalarının, cihaza kaydedilen videolar için diğer uygulamalarla uyumluluktan ödün vermeden daha modern, depolama alanı açısından verimli kodlamayı kullanmasına olanak tanır.

Cihazda oluşturulan içerik için aşağıdaki biçimlere otomatik olarak kod dönüştürülebilir:

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

Android, uygulamaların tüm medya biçimlerinin oynatılmasını destekleyebildiğini varsayar. Bu nedenle, 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, hesaplama açısından pahalı bir işlemdir ve video dosyası açılırken önemli bir gecikme yaşanmasına neden olur. Örneğin, bir dakikalık HEVC video dosyasının Pixel 3 telefonda AVC'ye dönüştürülmesi yaklaşık 20 saniye sürer. Bu nedenle, bir video dosyasını yalnızca cihaz dışına gönderirken kod dönüştürmeniz gerekir. Örneğin, bir video dosyasını aynı uygulamanın diğer kullanıcılarıyla veya modern video biçimlerini desteklemeyen bir bulut sunucusuyla paylaşırken.

Video dosyalarını cihaz üzerinde oynatma veya küçük resim oluşturma için açarken kod dönüştürme yapmayın.

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

Uygulamalar, medya yeteneklerini bildirerek kod dönüştürme davranışlarını kontrol edebilir. Bu özellikleri bildirmenin iki yolu vardır: kodda veya kaynakta.

Koddaki özellikleri tanımlama

Oluşturucu kullanıp ApplicationMediaCapabilities nesnesinin bir örneğini oluşturarak koddaki medya özelliklerini açıklayabilirsiniz:

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

ContentResolver#openTypedAssetFileDescriptor() gibi yöntemlerle medya içeriğine erişirken bu nesneyi kullanın:

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, yalnızca bir video dosyasını cihaz dışına aktarırken kod dönüştürmeyi çağırma gibi belirli kod yolları için ayrıntılı kontrol sağlar. 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 genel kontrol sağlar. Bu yöntem yalnızca çok spesifik durumlarda kullanılmalıdır. Örneğin, uygulamanız yalnızca diğer uygulamalardan video dosyaları alıyor (doğrudan açmak yerine) ve bunları modern video codec'lerini desteklemeyen bir sunucuya yüklüyorsa (aşağıdaki örnek senaryo 1'e bakın).

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, cihaza kaydedilen HDR videoların kodu AVC SDR (standart dinamik aralık) videoya sorunsuz şekilde dönüştürülür, ancak HEVC videoların kodu dönüştürülmez.

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

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

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

Uygulamanız başka bir uygulama ile video dosyası paylaşırsa alıcı uygulamanın dosyayı açabilmesi için video dosyasının kodunun dönüştürülmesi gerekebilir.

Bu destek kaydını openTypedAssetFileDescriptor üzerinden bir video dosyası açıp alıcı uygulamanın UID'sini belirterek çözebilirsiniz. Bu adresi Binder.getCallingUid kullanarak edinebilirsiniz. Platform, daha sonra video dosyasının kod geçişinin yapılıp yapılmayacağını belirlemek için alıcı uygulamanın medya özelliklerini kullanır.

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 iki yaygın kullanım alanı gösterilmektedir. Her iki durumda da orijinal video HEVC biçiminde depolanır ve video paylaşım uygulaması HEVC'yi desteklemez.

1. Örnek. Kod dönüştürme, video yakalama uygulaması tarafından başlatılır. 1. Örnek Video paylaşım uygulamasının, medya özellikleri kaynak dosyasında HEVC'yi desteklemediğini beyan etmesi. Ardından, video yakalama uygulamasından bir video ister. Video yakalama uygulaması, isteği işler ve openTypedAssetFileDescriptor kullanarak dosyayı açarak paylaşım uygulamasının UID'sini belirtir. Bu işlem, kod dönüştürme işlemini başlatır. Kodu dönüştürülmüş video alındığında paylaşım uygulamasına sağlanır ve buluttaki bir sunucuya yüklenir.

2. Örnek. Kod dönüştürme, video paylaşım uygulaması tarafından başlatılır. 2. Örnek Video yakalama uygulaması, MediaStore URI'sını kullanarak video paylaşım uygulamasıyla bir video paylaşır. Video paylaşım uygulaması, video dosyasını openTypedAssetFileDescriptor kullanarak açar ve medya özelliklerinde HEVC'yi desteklemediğini belirtir. Bu işlem, kod dönüştürme işlemini başlatır ve tamamlandıktan sonra dosya buluttaki bir sunucuya yüklenir.

Beyan edilmeyen biçimler

Uyumlu medya kodu dönüştürme özelliği, desteklenmediği belirtilen tüm biçimler için etkinleştirilmiştir ve desteklendiği bildirilen tüm biçimler için devre dışıdır. Bildirilmemiş diğer biçimler için kod dönüştürmenin yapılıp yapılmayacağına platform karar verir. Android 12'de kod dönüştürme, bildirilmemiş tüm biçimler için devre dışıdır. Bu davranış, gelecekte yeni biçimler için değişebilir.

Geliştirici seçenekleri

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

  • Kod dönüştürme varsayılanlarını geçersiz kıl Bu ayar, platformun otomatik kod dönüştürmeyi kontrol edip etmeyeceğini belirler. Geçersiz kılma etkinleştirildiğinde, platform varsayılanları yoksayılır ve kod dönüştürmeyi etkinleştir ayarı otomatik kod dönüştürmeyi kontrol eder. Bu seçenek varsayılan olarak devre dışıdır.

  • Kod dönüştürmeyi etkinleştir Bu ayar, bildirilmemiş biçimlerin kod dönüştürmesinin otomatik olarak yapılıp yapılmayacağını belirtir. Varsayılan olarak etkinleştirilir, ancak bu yalnızca kod dönüştürme varsayılanlarını geçersiz kıl seçeneğinin de etkin olması durumunda bir etkisi olur.

  • Uygulamaların modern biçimleri desteklediğini varsayın Bu ayar, uygulama beyan edilmeyen bir biçimi oynatmaya çalıştığında ne olacağını kontrol eder. Bu durum, manifest, uygulamanın belirli bir biçimi destekleyip desteklemediğini bildirmediğinde veya Google uygulamayı sunucu tarafı zorunlu dönüştürme listesine eklemediğinde meydana gelir. Bu ayar etkinleştirildiğinde uygulama kod dönüştürmez, devre dışı bırakıldığında ise kod dönüştürmez. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme bildirimlerini göster Bu ayar etkinleştirildiğinde, kod dönüştürme işlemi desteklenmeyen bir medya dosyasının okunmasıyla tetiklendiğinde uygulama, bir kod dönüştürme ilerleme durumu bildirimi görüntüler. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme önbelleğini devre dışı bırak Bu ayar etkinleştirilirse kod dönüştürme gerektiren uygulamalar, kod dönüştürme önbelleğini kullanmaz. Bu, geliştirme sırasında desteklenmeyen bir medya dosyasında kod dönüştürmeyi kolayca tetiklemeye yardımcı olabilir, ancak cihaz performansının düşmesine neden olabilir. Bu seçenek varsayılan olarak devre dışıdır.