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 |
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. 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:
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()
:
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.
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.
.
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.
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.