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 |
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 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.
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.
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.