Uyumlu medya kodlama dönüştürme

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

Cihaz üzerinde oluşturulan içerikler için aşağıdaki biçimlerin kodu otomatik olarak 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 kodlama dönüştürme varsayılan olarak devre dışıdır.

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

Kod dönüştürme, işlem gücü 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, video dosyalarının kodunu yalnızca cihazdan gönderirken 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.

Cihaz üzerinde oynatmak veya küçük resim 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, medya özelliklerini beyan ederek kod dönüştürme davranışlarını kontrol edebilir. Bu özellikleri bildirmenin iki yolu vardır: kodda veya kaynakta.

Kodda özellikleri beyan etme

Bir derleyici kullanarak ApplicationMediaCapabilities nesnesinin bir örneğini oluşturarak kodda medya özelliklerini 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, yalnızca bir video dosyasını cihaz dışına aktarırken kod dönüştürme işlemini çağırabilirsiniz. Aşağıda açıklanan yönteme göre önceliklidir.

Bir kaynakta özellikleri bildirme

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

Kesinlikle gerekli olmadığı halde bu yöntemin kullanılması, videoların küçük resimlerini oluşturma gibi istenmeyen senaryolarda kod dönüştürmeyi tetikleyerek kullanıcı deneyiminin kötüleşmesine neden olabilir.

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 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 etiketinin 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" />

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

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

Bu durumu, openTypedAssetFileDescriptor kullanarak bir video dosyası açıp alıcı uygulamanın UID'sini belirterek çözebilirsiniz. UID'yi Binder.getCallingUid kullanarak alabilirsiniz. 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 işlemi, video yakalama uygulaması tarafından başlatılır. 1. Örnek Video paylaşım uygulaması, medya özellikleri kaynak dosyasında HEVC'yi desteklemediğini beyan eder. Ardından video yakalama uygulamasından bir video ister. Video yakalama 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. Kod dönüştürme işlemi tamamlanan video, paylaşım uygulamasına gönderilir ve uygulama, videoyu 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ı, MediaStore URI'si kullanarak video paylaşım uygulamasıyla bir 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 ve tamamlandığında dosya buluttaki bir sunucuya yüklenir.

Bildirilmeyen biçimler

Uyumlu medya kodlama dönüştürme, desteklenmediği beyan edilen tüm biçimler için etkinleştirilir ve desteklendiği beyan edilen 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 yapılıp yapılmayacağına karar verir. Android 12'de kod dönüştürme, beyan edilmeyen tüm biçimler için devre dışı bırakılı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ı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 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 otomatik olarak kod dönüştürme işlemine tabi tutulup tutulmayacağını belirtir. Varsayılan olarak etkindir ancak yalnızca kod dönüştürme varsayılanlarını geçersiz kıl ayarı da etkinse 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, manifest dosyasında uygulamanın belirli bir biçimi destekleyip desteklemediği belirtilmediğinde veya Google, uygulamayı sunucu tarafı zorunlu kod dönüştürme listesine eklemediğinde ortaya çıkar. Ayar etkinleştirildiğinde uygulama kod dönüştürme yapmaz, devre dışı bırakıldığında ise uygulama kod dönüştürme yapar. Bu seçenek varsayılan olarak etkindir.

  • Kod dönüştürme bildirimlerini göster: Etkinleştirildiğinde, desteklenmeyen bir medya dosyası okunarak kod dönüştürme tetiklendiğinde 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, 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.