Uyumlu medya kodu dönüştürme

Android 12 (API düzeyi 31) ve sonraki sürümlerde sistem, HEVC'yi desteklemeyen bir uygulama tarafından açıldığında sistem 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 diğer uygulamalarla uyumluluğundan ödün vermeden cihazda kaydedilen videolar için daha modern ve depolama alanı açısından verimli kodlama yöntemleri kullanmasına olanak tanır.

Aşağıdaki biçimler, cihaz üzerinde oluşturulan içerikler için 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 kodu dönüştürme özelliği varsayılan olarak kapalıdır.

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

Kod dönüştürme, işlem açısından pahalı bir işlemdir ve video dosyası açılırken önemli bir gecikme uygular. Ö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, yalnızca cihaz dışına gönderdiğiniz bir video dosyasının kodunu 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 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, medya özelliklerini bildirerek kod dönüştürme davranışlarını kontrol edebilir. Bu özellikleri belirtmenin iki yolu vardır: kodda veya kaynakta.

Kodda özellikleri bildirme

Oluşturucu yardımıyla ApplicationMediaCapabilities nesnesinin bir örneği oluşturarak kodda medya özelliklerini tanımlayabilirsiniz:

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ınContentResolver#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, yalnızca bir video dosyasını cihaz dışına aktarırken kod dönüştürmenin çağrılması gibi belirli kod yolları için ayrıntılı kontrol sağlar. Aşağıda açıklanan yönteme göre daha ö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 özel 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 resmini oluştururken olduğu gibi istenmeyen senaryolarda kod dönüştürme işleminin tetiklenmesine neden olarak kullanıcı deneyiminin kötüleşmesine yol açabilir.

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 AVC SDR (standart dinamik aralık) videoya sorunsuz bir şekilde kod dönüştürülürken HEVC videolar 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 aşağıdaki ö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 bir video dosyasını başka bir uygulamayla paylaşıyorsa alıcı uygulamanın dosyayı açabilmesi için video dosyasının kodunun yeniden dönüştürülmesi gerekebilir.

Bu durumu, openTypedAssetFileDescriptor kullanarak bir video dosyası açıp alıcı uygulamanın UID'sini belirterek (Binder.getCallingUid kullanılarak elde edilebilir) çözebilirsiniz. Ardından platform, video dosyasının kod dönüştürülmesinin gerekip gerekmediğ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 yakalama uygulaması tarafından başlatılır. 1. Örnek Video paylaşım uygulaması, medya özellikleri kaynak dosyasında HEVC'yi desteklemediğini beyan ediyor. 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 dosyayı openTypedAssetFileDescriptor kullanarak açar. Bu işlem, kod dönüştürme işlemini başlatır. Kod dönüştürülmüş video, paylaşılan uygulamaya gönderilir. 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ı, bir MediaStore URI'si kullanarak videoyu video paylaşım uygulamasıyla 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 işlem tamamlandığında dosya buluttaki bir sunucuya yüklenir.

Tanımlanmamış biçimler

Uyumlu medya kod dönüştürme, desteklenmediği beyan edilen tüm biçimler için etkinleştirilir ve desteklendiğini beyan edilen tüm biçimler için devre dışı bırakılır. Tanımlanmayan diğer biçimler için kod dönüştürme işlemine gerek olup olmadığına platform karar verir. Android 12'de kod dönüştürme, bildirilmeyen 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 etmediğ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, bildirilmeyen biçimlerin kod dönüştürme işleminin otomatik olarak yapılıp yapılmayacağını belirtir. Bu seçenek varsayılan olarak etkindir ancak yalnızca kod dönüştürme varsayılanlarını geçersiz kılma seçeneği de etkinse geçerli olur.

  • Uygulamaların modern biçimleri desteklediğini varsayın Bu ayar, uygulama bildirilmemiş bir biçimi oynatmaya çalıştığında ne olacağını kontrol eder. Bu durum, manifest tarafından uygulamanın belirli bir biçimi destekleyip desteklemediğini bildirmediğ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ürmez, devre dışı bırakıldığında kod dönüştürür. Bu seçenek varsayılan olarak etkindir.

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