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 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 |
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 işlemi varsayılan olarak devre dışıdır.
Kod dönüştürme ne zaman kullanılır?
Kod dönüştürme, hesaplama açısından pahalı bir işlemdir ve video dosyası açıldığında önemli bir gecikme oluşturur. Ö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, video dosyasını yalnızca cihazdan gönderirken kod 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ürmeyin.
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 bir kaynakta.
Kodda özellikleri bildirme
Bir oluşturucu kullanarak ApplicationMediaCapabilities
nesnesi örneği 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();
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ı cihazdan aktarırken kod dönüştürmeyi tetikleme gibi belirli kod yolları için ayrıntılı kontrol sağlar. Aşağıda açıklanan yönteme göre daha önceliklidir.
Bir kaynakta özellikleri bildirme
Bir kaynakta özellikleri belirtmek, 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 video dosyalarını doğrudan açmak yerine yalnızca diğer uygulamalardan alır ve modern video codec'lerini desteklemeyen bir sunucuya yüklerse (aşağıdaki 1. örnek senaryoya 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 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 işlemi, video yakalama uygulaması tarafından başlatılır.
Video paylaşım uygulaması, medya özellikleri kaynak dosyasında HEVC'yi desteklemediğini beyan ediyor. 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.
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.
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şleminin yapılıp yapılmayacağına platform karar verir. 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, 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, tanımlanmamış biçimlerin otomatik olarak kod dönüştürülüp dönüştürülmeyeceğini 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 Bu ayar, uygulama açıklanmamış bir biçimi oynatmaya çalıştığında ne olacağını kontrol eder. 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 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.