Android 12 (API düzeyi 31) ve sonraki sürümlerde sistem, HEVC'yi (H.265) desteklemeyen bir uygulama tarafından açılan 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.
Cihaz üzerinde 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 |
| HDR10 | HDR10 | 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 özelliği varsayılan olarak devre dışıdır.
Transkodlama 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 HEVC video dosyasının Pixel 3 telefonda AVC'ye kod 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.
Cihaz üzerinde oynatma veya küçük resim oluşturma amacıyla video dosyaları açılırken kod dönüştürme işlemi yapılmaz.
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 tanımlama
Bir derleyici kullanarak ApplicationMediaCapabilities nesnesinin bir örneğini oluşturarak medya özelliklerini kodda belirtebilirsiniz:
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ı cihazdan aktarılırken çağrılır. Bu yöntem, 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 video dosyalarını yalnızca diğer uygulamalardan 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ı (ör. videolardan küçük resim oluşturulurken) transkodlamanın beklenmedik senaryolarda tetiklenmesine ve kullanıcı deneyiminin kötüleşmesine neden olabilir.
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.
Platform daha sonra 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 şemalarda 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.
Video paylaşma 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
openTypedAssetFileDescriptor kullanarak dosyayı açar. Bu sırada, paylaşım uygulamasının UID'sini belirtir. 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 Dönüştürme işlemi, video paylaşım uygulaması tarafından başlatılır.
Video çekme uygulaması, bir URI kullanarak video paylaşım uygulamasıyla video paylaşır.
MediaStore 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ığında dosya, buluttaki bir sunucuya yüklenir.
Bildirilmemiş biçimler
Uyumlu medya kodlama 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 beyan edilmemiş 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ı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 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 kod dönüştürme varsayılanları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 meydana gelir. Ayarlar 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.