Android 12 (API düzeyi 31) ve sonraki sürümlerde sistem, otomatik olarak dönüştürme yapabilir. HEVC (H.265) - AVC (H.264) gibi biçimlerde kaydedilen videolar, HEVC'yi desteklemeyen bir uygulama tarafından açılmışsa. Bu özellik, videolarda Videolar için daha modern ve depolama alanı verimli şekilde kodlama kullanan uygulamalar yakalayın. diğer uygulamalarla uyumluluktan ödün vermeden cihaza kaydedilmiştir.
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 |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MedyaÖzellik.HdrType.HDR10_PLUS |
Android, uygulamaların tüm medya biçimlerinin oynatılmasını destekleyebileceğini varsayar. uyumlu medya kodu dönüştürme varsayılan olarak kapalı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ı kullanıcının diğer modern videoyu desteklemeyen bir bulut sunucusu biçimlerinden biridir.
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 medyalarını tanımlayarak kod dönüştürme davranışlarını kontrol edebilir özellikler. Bu özellikleri tanımlamanın iki yolu vardır: kodda, daha fazla bilgi edinir.
Koddaki özellikleri tanımlama
Bir
Oluşturucu kullanan ApplicationMediaCapabilities
nesne:
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ı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 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 belirli 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ürmeyi başlatarak 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ın kodu 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 başka bir uygulamayla video dosyası paylaşıyorsa video dosyasının Alıcı uygulama tarafından açılmadan önce kod dönüştürmenin yapılması gerekir.
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.
Platform, daha sonra kullanıcıları hangi uygulamanın alacağını belirlemek için
Video dosyasının kod dönüştürmesinin yapılıp yapılmayacağını belirler.
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 yaygın olarak karşılaşılan iki kullanım alanı gösterilmektedir. Her iki durumda da orijinal video HEVC biçiminde saklanır ve video paylaşım uygulaması HEVC'yi destekler.
1.örnek Kod dönüştürme, video yakalama uygulaması tarafından başlatılır.
.
Video paylaşım uygulaması, medyasında HEVC'yi desteklemediğini beyan ederse
özellikler kaynak dosyası. Ardından, video yakalama uygulamasından bir video istiyor. Videoyu yakalama
Bu uygulama isteği işler ve openTypedAssetFileDescriptor
kullanarak dosyayı açarak paylaşım uygulamasının UID'sini belirtir. Bu, kod dönüştürme işlemini başlatır.
Kodu dönüştürülmüş video alındığında paylaşım uygulamasına gönderilir ve uygulama 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 videoyu video paylaşım uygulamasıyla paylaşmak için bir
MediaStore
URI. Video paylaşım uygulaması, video dosyasını openTypedAssetFileDescriptor
kullanarak açar ve medya özelliklerinde HEVC'yi desteklemediğini belirtir. Bu
kod dönüştürme işlemini başlatır ve tamamlandıktan sonra dosya
nasıl hazırlanabileceğinizi
öğreneceksiniz.
Bildirilmemiş biçimler
Uyumlu medya kodu dönüştürme, bildirilen tüm biçimler için etkindir desteklenmez ve desteklendiği bildirilen 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 kod dönüştürme devre dışıdır (beyan edilmemiş tüm biçimler için) Bu davranış, duymuş olabilirsiniz.
Geliştirici seçenekleri
Android'in varsayılan ayarını geçersiz kılmak için aşağıdaki geliştirici seçeneklerini kullanabilirsiniz kod dönüştürme davranışı:
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 sırasında etkinleştirilirse platform varsayılanları yoksayılır ve kod dönüştürme ayarı, otomatik olarak kod dönüştürmeyi kontrol eder. Bu seçenek, varsayılandır.
Kod dönüştürmeyi etkinleştir Bu ayar bildirilip bildirilmediğini belirtir biçimleri otomatik olarak dönüştürülür. Varsayılan olarak etkindir, ancak kod dönüştürme varsayılanlarını geçersiz kılma özelliği de etkinleştirildiğinde etkili olur.
Uygulamaların modern biçimleri desteklediğini varsay Bu ayar, Uygulama, beyan edilmemiş bir biçimi oynatmaya çalışıyor. Bu durum, manifest dosyasında uygulamanın belirli bir biçimi destekleyip desteklemediğini beyan etmemeli veya Google uygulamayı, sunucu tarafı zorunlu kod dönüştürme listesine eklemedi. Ayar etkinleştirilirse uygulamanın kodunu dönüştürmez. Devre dışı bırakıldığında, uygulama kod dönüştürme. 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.