Uyumlu medya kodu dönüştürme

Android 12 (API düzeyi 31) ve sonraki sürümlerde, HEVC'yi desteklemeyen bir uygulama tarafından açılan HEVC (H.265) gibi biçimlerde kaydedilen videolar sistem tarafından otomatik olarak AVC (H.264) biçimine dönüştürülebilir. 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 kullanmasına olanak tanır.

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. Bu nedenle, uyumlu medya kod dönüştürme işlemi varsayılan olarak devre dışı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ı 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

Bir oluşturucu kullanarak ApplicationMediaCapabilities nesnesi örneği oluşturarak medya özelliklerini kodda belirtebilirsiniz:

KotlinJava
val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()
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():

KotlinJava
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.
    }
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 özel 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ürmeye yol açarak 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 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 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 sorunu çözmek için openTypedAssetFileDescriptor kullanarak bir video dosyası açabilirsiniz. ve alıcı uygulamanın Binder.getCallingUid kullanılarak edinilebilecek UID'sini belirtin. 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.

KotlinJava
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.
    }
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ı, medyasında HEVC'yi desteklemediğini beyan ederse özellikler kaynak dosyası. Ardından, video yakalama uygulamasından video isteğinde bulunur. 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. İşlem tamamlandıktan sonra dosya buluttaki bir sunucuya yüklenir.

Bildirilmemiş 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. Örneğin, diğer biçimler bildirildiğinde platform, kod dönüştürmenin veya hakkında bilgi edindiniz. Android 12'de, bildirilmemiş tüm 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 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, Platform, otomatik kod dönüştürmeyi kontrol eder. 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 bildirilip bildirilmediğini belirtir biçimleri otomatik olarak dönüştürülür. 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 Bu ayar, Uygulama, beyan edilmemiş bir biçimi oynatmaya çalışıyor. Bu durum, manifest'te 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ü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 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.