Uyumlu medya kodlama dönüştürme

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

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

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

Android, uygulamaların tüm medya biçimlerinin oynatılmasını destekleyebileceğini varsayar. Bu nedenle, uyumlu medya kod dönüştürme özelliği varsayılan olarak devre dışıdır.

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

Kod dönüştürme, hesaplama açısından maliyetli bir işlemdir ve video dosyası açılırken önemli bir gecikmeye neden olur. Örneğin, bir dakikalık bir 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 cihazdan gönderirken yeniden kodlamanız gerekir. Örneğin, aynı uygulamanın diğer kullanıcılarıyla bir video dosyası paylaşırken veya modern video biçimlerini desteklemeyen bir bulut sunucusunda.

Video dosyalarını cihazda oynatma veya küçük resim oluşturma amacıyla açarken kod dönüştürme işlemi yapmayın.

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

Uygulamalar, medya özelliklerini belirterek kod dönüştürme davranışlarını kontrol edebilir. Bu özellikleri iki şekilde bildirebilirsiniz: kodda veya kaynakta.

Kodda özellikleri bildirme

Bir oluşturucu kullanarak ApplicationMediaCapabilities nesnesinin bir örneğini oluşturarak medya özelliklerini kodda bildirebilirsiniz:

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

Medya içeriğine aşağıdaki gibi yöntemlerle 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 sağlar. Örneğin, kod dönüştürme yalnızca bir video dosyası cihaz dışına aktarılırken çağrılır. Aşağıda açıklanan yönteme göre daha önceliklidir.

Bir kaynakta özellikleri bildirme

Bir kaynakta özellikleri bildirmek, kod dönüştürme üzerinde genel bir kontrol sağlar. Bu yöntem yalnızca çok özel durumlarda kullanılmalıdır. Örneğin, uygulamanız diğer uygulamalardan yalnızca video dosyaları alıyorsa (doğrudan açmak yerine) ve bunları modern video codec'lerini desteklemeyen bir sunucuya yüklüyorsa (aşağıdaki 1. örnek senaryoya bakın).

Bu yöntemin kesinlikle gerekli olmadığı durumlarda kullanılması, videoların küçük resimlerinin oluşturulması gibi istenmeyen senaryolarda transkodlamaya neden olabilir ve bu da kullanıcı deneyimini olumsuz etkiler.

Bu yöntemi kullanmak için 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 sorunsuz bir şekilde AVC SDR (standart dinamik aralık) videoya dönüştürülürken HEVC videolar dönüştürülmez.

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

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

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

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

Bu durumu, openTypedAssetFileDescriptor kullanarak bir video dosyası açıp Binder.getCallingUid ile elde edilebilen alıcı uygulamanın UID'sini belirterek çözebilirsiniz. Ardından platform, video dosyasının kodunun dönüştürülüp dönüştürülmeyeceğini 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 çekme uygulaması tarafından başlatılır. 1. örnek Video paylaşım uygulaması, medya özellikleri kaynak dosyasında HEVC'yi desteklemediğini belirtir. Ardından, video çekme uygulamasından video ister. Video çekme uygulaması isteği işler ve paylaşım uygulamasının UID'sini belirterek openTypedAssetFileDescriptor kullanarak dosyayı açar. Bu işlem, kod dönüştürme sürecini başlatır. Dönüştürülmüş video alındığında paylaşım uygulamasına gönderilir. Bu uygulama da videoyu buluttaki bir sunucuya yükler.

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

Bildirilmemiş biçimler

Uyumlu medya dönüştürme, desteklenmediği belirtilen tüm biçimler için etkinleştirilir ve desteklendiği belirtilen tüm biçimler için devre dışı bırakılır. Bildirilmeyen diğer biçimler için platform, kod dönüştürme işleminin yapılıp yapılmayacağına karar verir. Android 12'de, tüm bildirilmemiş biçimler için kod dönüştürme devre dışıdır. Bu davranış, gelecekte yeni biçimler için değişebilir.

Geliştirici seçenekleri

Android'in varsayılan 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ılma 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 otomatik kod dönüştürme, enable transcoding ayarıyla kontrol edilir. Bu seçenek varsayılan olarak devre dışıdır.

  • Kod dönüştürmeyi etkinleştir: Bu ayar, bildirilmemiş biçimlerin otomatik olarak kod dönüştürülüp dönüştürülmeyeceğini belirtir. Bu özellik varsayılan olarak etkindir ancak yalnızca varsayılan kod dönüştürme ayarlarını geçersiz kıl da etkinleştirilmişse geçerli olur.

  • Uygulamaların modern biçimleri desteklediğini varsay Bu ayar, uygulama bildirilmemiş bir biçimi oynatmaya çalıştığında ne olacağını kontrol eder. Bu durum, manifestte uygulamanın belirli bir biçimi destekleyip desteklemediği belirtilmediğinde veya Google uygulamayı sunucu tarafında zorunlu transkodlama listesine eklemediğinde ortaya çıkar. Bu ayar etkinleştirildiğinde uygulama kod dönüştürme yapmaz, devre dışı bırakıldığında ise kod dönüştürme yapar. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme bildirimlerini göster: Bu ayar etkinleştirildiğinde, desteklenmeyen bir medya dosyası okunarak kod dönüştürme işlemi başlatıldığında uygulama, kod dönüştürme ilerleme durumu bildirimi gösterir. 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 kullanmaz. Bu özellik, geliştirme sırasında desteklenmeyen bir medya dosyasında kod dönüştürmeyi kolayca tetiklemek için yararlı olabilir ancak cihaz performansının düşmesine neden olabilir. Bu seçenek varsayılan olarak devre dışıdır.