Android 12'de kullanıma sunulan uyumlu medya dönüştürme, cihazların video çekimi için daha modern ve depolama alanı açısından verimli medya biçimlerini (ör. HEVC) kullanmasına olanak tanıyan bir özelliktir. Bu özellik, uygulamalarla uyumluluğu da korur. Bu özellik sayesinde cihaz üreticileri, depolama ve bant genişliği gereksinimlerini azaltırken video kalitesini artırmak için varsayılan olarak AVC yerine HEVC kullanabilir. Uyumlu medya dönüştürme özelliği etkinleştirilmiş cihazlarda Android, biçimi desteklemeyen bir uygulama tarafından açıldığında HEVC veya HDR gibi biçimlerde kaydedilen videoları (en fazla bir dakika uzunluğunda) otomatik olarak dönüştürebilir. Bu sayede, cihazda yeni biçimlerde çekilen videolarla bile uygulamalar çalışabilir.
Uyumlu medya kodlama dönüştürme özelliği varsayılan olarak devre dışıdır. Uygulamaların medya dönüştürme isteğinde bulunabilmesi için medya özelliklerini bildirmesi gerekir. Medya özelliklerini beyan etme hakkında daha fazla bilgi için Android Developers sitesindeki Uyumlu medya kodlama dönüştürme bölümüne bakın.
İşleyiş şekli
Uyumlu medya kodlama dönüştürme özelliği iki ana bölümden oluşur:
- Medya çerçevesindeki kod dönüştürme hizmetleri: Bu hizmetler, düşük gecikmeli ve yüksek kaliteli dönüştürmeler için donanım kullanarak dosyaları bir biçimden diğerine dönüştürür. Bu kapsamda kod dönüştürme API'si, kod dönüştürme hizmeti, özel filtreler için bir OEM eklentisi ve donanım yer alır. Daha fazla bilgi için Mimariye genel bakış başlıklı makaleyi inceleyin.
- Medya sağlayıcılarda uyumlu medya kodlama dönüştürme özelliği: Medya sağlayıcılarda bulunan bu bileşen, medya dosyalarına erişen uygulamaları yakalar ve uygulamanın beyan edilen özelliklerine göre orijinal dosyayı veya kod dönüştürülmüş bir dosyayı sunar. Bir uygulama, medya dosyasının biçimini destekliyorsa özel bir işlem yapılması gerekmez. Bir uygulama biçimi desteklemiyorsa çerçeve, uygulama dosyaya eriştiğinde dosyayı AVC gibi eski bir biçime dönüştürür.
Şekil 1'de medya kod dönüştürme sürecine genel bir bakış sunulmaktadır.
Şekil 1. Uyumlu medya kodlama dönüştürmeye genel bakış.
Desteklenen biçimler
Uyumlu medya kodlama dönüştürme özelliği aşağıdaki biçim dönüştürmelerini destekler:
- HEVC (8 bit) - AVC: Codec dönüştürmeleri, bir mediacodec kod çözücüsü ve bir mediacode kodlayıcısı bağlanarak gerçekleştirilir.
- HDR10+ (10 bit) - AVC (SDR): HDR - SDR dönüştürmeleri, mediacodec örnekleri ve kod çözücü örneklerine bağlanan bir satıcı eklentisi kullanılarak gerçekleştirilir. Daha fazla bilgi için HDR'den SDR'ye kodlama bölümüne bakın.
Desteklenen içerik kaynakları
Uyumlu medya kodlama dönüştürme özelliği, birincil harici birimde DCIM/Camera/ klasöründe depolanan, yerel OEM Kamera uygulaması tarafından oluşturulan cihaz üzerinde medyayı destekler. Bu özellik, ikincil depolama alanındaki medyaları desteklemez.
E-posta veya SD kartlar aracılığıyla cihazlara aktarılan içerikler desteklenmez.
Uygulamalar, dosyalara çeşitli dosya yollarına göre erişir. Aşağıda, kod dönüştürmenin etkinleştirildiği veya atlandığı dosya yolları açıklanmaktadır:
Kod dönüştürme etkinleştirildi:
- MediaStore API'leri aracılığıyla uygulamaya erişim
- Java ve yerel kod dahil olmak üzere doğrudan dosya yolu API'leri aracılığıyla uygulama erişimi
- Depolama erişim çerçevesi (SAF) aracılığıyla uygulama erişimi
- OS paylaşım sayfası intent'leri üzerinden uygulama erişimi. (Yalnızca MediaStore URI'si)
- Telefondan PC'ye MTP/PTP dosya aktarımı
Kod dönüştürme atlandı:
- SD kartı çıkararak dosyaları cihazdan aktarma
- Yakındakilerle Paylaş veya Bluetooth aktarımı gibi seçenekleri kullanarak cihazlar arasında dosya aktarma
Transkodlama için özelleştirilmiş dosya yolları ekleme
Cihaz üreticileri, isteğe bağlı olarak DCIM/ dizini altında medya transkodlaması için dosya yolları ekleyebilir. DCIM/ dizininin dışındaki tüm yollar reddedilir.
Bu tür dosya yollarının eklenmesi, kargo şirketi şartlarını veya yerel düzenlemeleri karşılamak için gerekli olabilir.
Dosya yolu eklemek için çalışma zamanında kaynak eşlemesi (RRO) kod dönüştürme yolunu kullanın.
config_supported_transcoding_relative_paths. Aşağıda, dosya yolu ekleme örneği verilmiştir:
<string-array name="config_supported_transcoding_relative_paths" translatable="false">
<item>DCIM/JCF/</item>
</string-array>
Yapılandırılan dosya yollarını doğrulamak için şunu kullanın:
adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20Mimariye genel bakış
Bu bölümde, medya dönüştürme özelliğinin mimarisi açıklanmaktadır.
Şekil 2. Medya kod dönüştürme mimarisi.
Medya dönüştürme mimarisi aşağıdaki bileşenlerden oluşur:
- MediaTranscodingManager sistem API'si: İstemcinin MediaTranscoding hizmetiyle iletişim kurmasına olanak tanıyan arayüz. MediaProvider modülü bu API'yi kullanır.
- MediaTranscodingService: İstemci bağlantılarını yöneten, kod dönüştürme isteklerini planlayan ve
TranscodingSessionsiçin muhasebe işlemlerini yöneten yerel hizmet. - MediaTranscoder: Kod dönüştürme işlemini gerçekleştiren yerel kitaplık. Bu kitaplık, modüllerle uyumlu olması için medya çerçevesi NDK'sının üzerine kurulmuştur.
Uyumlu medya kod dönüştürme özelliği, kod dönüştürme metriklerini hem hizmette hem de medya kod dönüştürücüde günlüğe kaydeder. İstemci tarafı ve hizmet tarafı kodu, zamanında hata düzeltmeleri ve güncellemeler yapılmasına olanak tanımak için MediaProvider modülündedir.
Dosya erişimi
Uyumlu medya dönüştürme, kapsamlı depolama için kullanılan Filesystem in Userspace (FUSE) dosya sistemi üzerine kurulmuştur. FUSE, MediaProvider modülünün kullanıcı alanındaki dosya işlemlerini incelemesini ve erişimi izin verme, reddetme veya erişimi düzeltme politikasına göre dosyalara erişimi kontrol etmesini sağlar.
Bir uygulama bir dosyaya erişmeye çalıştığında FUSE daemon, uygulamadan gelen dosya okuma erişimini engeller. Uygulama daha yeni bir biçimi (ör. HEVC) destekliyorsa orijinal dosya döndürülür. Uygulama biçimi desteklemiyorsa dosya daha eski bir biçime (ör. AVC) dönüştürülür veya dönüştürülmüş bir sürüm varsa önbellekten döndürülür.
Dönüştürülmüş dosyaları isteme
Uyumlu medya kodlama dönüştürme özelliği varsayılan olarak devre dışıdır. Uygulamalar, aşağıdaki seçenekleri kullanarak kod geçişi yapılan öğeler isteyebilir:
- Desteklenmeyen biçimleri manifest dosyasında bildirin. Ayrıntılar için Bir kaynakta özellikleri bildirme ve Kodda özellikleri bildirme başlıklı makaleleri inceleyin.
- Desteklenen biçimleri çalışma zamanında uygulama uyumluluğu çerçevesiyle devre dışı bırakma (Kullanıcılar bu özelliği Ayarlar'da her uygulama için ayrı ayrı da devre dışı bırakabilir).
openTypedAssetFileDescriptorAPI'si ile desteklenmeyen biçimleri açıkça belirterekMediaStoreile dosya açma.
USB aktarımlarında (cihazdan PC'ye) varsayılan olarak kod dönüştürme devre dışıdır ancak kullanıcılar, Şekil 3'te gösterildiği gibi USB Tercihleri ayar ekranındaki Videoları AVC'ye dönüştür açma/kapatma düğmesini kullanarak kod dönüştürmeyi etkinleştirebilir.
Şekil 3. USB Tercihleri ekranında medya kod dönüştürmeyi etkinleştirmek için geçiş yapın.
Dönüştürülmüş dosyaları istemeyle ilgili kısıtlamalar
Transkodlama isteklerinin sistem kaynaklarını uzun süre boyunca kilitlemesini önlemek için transkodlama oturumu isteyen uygulamalar şu şekilde sınırlandırılır:
- 10 ardışık oturum
- toplam üç dakika çalışma süresi
Bir uygulama bu kısıtlamaların tümünü aşarsa çerçeve, orijinal dosya tanımlayıcısını döndürür.
Cihaz gereksinimleri
Uyumlu medya dönüştürme özelliğinin desteklenebilmesi için cihazların aşağıdaki koşulları karşılaması gerekir:
- Cihazda, yerel kamera uygulamasında varsayılan olarak HEVC kodlama etkinleştirilmiş olmalıdır.
- (HDR'den SDR'ye dönüştürmeyi destekleyen cihazlar) Cihaz, HDR video çekimini destekliyor olmalıdır.
Medya kodu dönüştürme için cihaz performansını sağlamak üzere video donanımı ve depolama alanı okuma/yazma erişim performansı optimize edilmelidir. Medya codec'leri 1 önceliğiyle yapılandırıldığında codec'ler mümkün olan en yüksek işleme hızında çalışmalıdır. Transkodlama performansının en az 200 fps olmasını öneririz. Donanım performansınızı test etmek için frameworks/av/media/libmediatranscoding/transcoder/benchmark adresinde medya dönüştürücü karşılaştırma testini çalıştırın.
Doğrulama
Uyumlu medya dönüştürme özelliğini doğrulamak için aşağıdaki CTS testlerini çalıştırın:
android.media.mediatranscoding.ctsandroid.mediaprovidertranscode.cts
Medya kod dönüştürmeyi genel olarak etkinleştirme
Medya kodlama dönüştürme çerçevesini veya kodlama dönüştürme ile uygulama davranışını test etmek için uyumlu medya kodlama dönüştürme özelliğini genel olarak etkinleştirebilir veya devre dışı bırakabilirsiniz. Ayarlar > Sistem > Geliştirici > Medya dönüştürme geliştirici seçenekleri sayfasında Dönüştürme varsayılanlarını geçersiz kıl anahtarını açık, Dönüştürmeyi etkinleştir anahtarını ise açık veya kapalı olarak ayarlayın. Bu ayar etkinleştirilirse geliştirdiğiniz uygulama dışındaki uygulamalarda medya dönüştürme işlemi arka planda gerçekleşebilir.
Dönüştürme durumunu kontrol etme
Test sırasında, mevcut ve geçmiş kod dönüştürme oturumları da dahil olmak üzere kod dönüştürme durumunu kontrol etmek için aşağıdaki ADB kabuk komutunu kullanabilirsiniz:
adb shell dumpsys media.transcodingVideo uzunluğu sınırlamasını genişletme
Test amacıyla, aşağıdaki komutu kullanarak kod dönüştürme için bir dakikalık video uzunluğu sınırını genişletebilirsiniz. Bu komut çalıştırıldıktan sonra yeniden başlatma gerekebilir.
adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>AOSP kaynağı ve referansları
Aşağıda, uyumlu medya kodlama dönüştürme ile ilgili AOSP kaynak kodu verilmiştir.
Transcoding System API (yalnızca MediaProvider tarafından kullanılır)
ApplicationMediaCapabilities API
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.javaMediaTranscoding Service
frameworks/av/services/mediatranscoding/frameworks/av/media/libmediatranscoding/
Native MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
MediaTranscoder için HDR örnek eklentisi
MediaProvider dosya yakalama ve kod dönüştürme kodu
MediaTranscoder karşılaştırması
frameworks/av/media/libmediatranscoding/transcoder/benchmark
CTS testleri
cts/tests/tests/mediatranscoding/
HDR'den SDR'ye kodlama
Cihaz üreticileri, HDR'den SDR'ye kodlamayı desteklemek için /platform/frameworks/av/media/codec2/hidl/plugin/ konumunda bulunan AOSP örnek Codec 2.0 filtre eklentisini kullanabilir.
Bu bölümde, filtre eklentisinin işleyiş şekli, eklentinin nasıl uygulanacağı ve nasıl test edileceği açıklanmaktadır.
Bir cihazda HDR'den SDR'ye kodlamayı destekleyen bir eklenti yoksa HDR videoya erişen bir uygulama, manifestte belirtilen medya özelliklerinden bağımsız olarak orijinal dosya tanımlayıcısını alır.
İşleyiş şekli
Bu bölümde, Codec 2.0 filtre eklentisinin genel davranışı açıklanmaktadır.
Arka plan
Android, Codec 2.0 arayüzü ile android.hardware.media.c2 HAL arayüzü arasında android::hardware::media::c2 konumunda bir uyarlama katmanı uygulaması sağlar. AOSP, filtre eklentileri için kod çözücüleri filtre eklentileriyle birlikte sarmalayan bir sarmalayıcı mekanizma içerir.
MediaCodec
Bu sarmalanmış bileşenleri, filtreleme özelliklerine sahip kod çözücüler olarak tanır.
Genel Bakış
FilterWrapper sınıfı, satıcı codec'lerini alır ve sarmalanmış codec'leri media.c2 uyarlama katmanına geri döndürür. FilterWrapper
sınıfı, libc2filterplugin.so aracılığıyla FilterWrapper::Plugin API'sini yükler ve eklentideki mevcut filtreleri kaydeder. Oluşturma sırasında FilterWrapper
tüm kullanılabilir filtreleri başlatır. Yalnızca arabelleği değiştiren filtreler başlangıçta başlatılır.
Şekil 4. Filtre eklentisi mimarisi.
Filtre eklentisi arayüzü
FilterPlugin.h arayüzü, filtreleri kullanıma sunmak için aşağıdaki API'leri tanımlar:
std::shared_ptr<C2ComponentStore>getComponentStore()Filtreleri içeren bir
C2ComponentStorenesnesi döndürür. Bu, satıcının Codec 2.0 uygulamasının sunduklarından ayrıdır. Genellikle bu mağazada yalnızcaFilterWrappersınıfı tarafından kullanılan filtreler bulunur.bool describe(C2String name, Descriptor *desc)C2ComponentStore'da sunulanlara ek olarak filtreleri açıklar. Aşağıdaki açıklamalar tanımlanmıştır:controlParam: Filtrelerin davranışını kontrol eden parametreler. Örneğin, HDR'den SDR'ye ton eşleyici için kontrol parametresi hedef aktarım işlevidir.affectedParams: Filtreleme işlemlerinden etkilenen parametreler. Örneğin, HDR'den SDR'ye ton eşleyici için etkilenen parametreler renk yönleridir.
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)Filtre bileşeni arabelleği değiştirirse
truedeğerini döndürür. Örneğin, hedef aktarım işlevi SDR ve giriş aktarım işlevi HDR (HLG veya PQ) ise ton eşleme filtresitruedeğerini döndürür.
FilterWrapper ayrıntıları
Bu bölümde, FilterWrapper sınıfının ayrıntıları açıklanmaktadır.
içerik üretimi
Sarmalanmış bileşen, oluşturma sırasında temel kod çözücüyü ve tanımlanan tüm filtreleri başlatır.
Sorgu ve yapılandırma
Sarmalanmış bileşen, gelen parametreleri filtre açıklamasına göre sorgulardan veya yapılandırma isteklerinden ayırır. Örneğin, filtre kontrol parametresinin yapılandırılması ilgili filtreye yönlendirilir ve filtrelerden etkilenen parametreler, sorgularda yer alır (etkilenmeyen parametreleri olan kod çözücüden okumak yerine).
Şekil 5. Sorgu ve yapılandırma.
Başlat
Sarmalanmış bileşen, başlangıçta kod çözücüyü ve arabellekleri değiştiren tüm filtreleri başlatır. Filtre etkinleştirilmemişse sarmalanmış bileşen, kod çözücüyü ve geçiş arabelleklerini başlatır ve kod çözücünün kendisine komutlar gönderir.
Arabellek işleme
Şekil 6. Arabellek işleme.
Sarmalanmış kod çözücüye gönderilen arabellekler, temel kod çözücüye gider. Sarmalanmış bileşen, onWorkDone_nb() geri çağırma işlevi aracılığıyla kod çözücüden çıkış arabelleğini alır ve ardından filtrelere gönderir. Son filtrenin nihai çıkış arabelleği istemciye bildirilir.
Bu arabellek işleme özelliğinin çalışması için sarmalanmış bileşenin, çerçeve çıkış arabelleklerinin beklenen blok havuzundan gelmesi amacıyla C2PortBlockPoolsTuning son filtreye yapılandırılması gerekir.
Durdurma, sıfırlama ve bırakma
Sarma işlemi durdurulduğunda, sarılmış bileşen kod çözücüyü ve başlatılmış olan tüm etkin filtreleri durdurur. Sıfırlama ve yayınlama sırasında, etkin olup olmadıklarına bakılmaksızın tüm bileşenler sıfırlanır veya yayınlanır.
Örnek filtre eklentisini uygulama
Eklentiyi etkinleştirmek için aşağıdakileri yapın:
- Kitaplıkta
FilterPluginarayüzünü uygulayın ve/vendor/lib[64]/libc2filterplugin.so.konumuna bırakın. - Gerekirse
mediacodec.teiçin ek izinler ekleyin. - Adaptasyon katmanını Android 12'ye güncelleyin ve
media.c2hizmetini yeniden oluşturun.
Eklentiyi test etme
Örnek eklentiyi test etmek için aşağıdakileri yapın:
- Cihazı yeniden oluşturun ve yükleyin.
Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:
m sample-codec2-filter-pluginCihazı yeniden monte edin ve satıcı eklentisini, codec hizmeti tarafından tanınacak şekilde yeniden adlandırın.
adb root adb remount adb reboot adb wait-for-device adb root adb remount adb push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \ /vendor/lib64/libc2filterplugin.so adb push /out/target/<...>/lib/sample-codec2-filter-plugin.so \ /vendor/lib/libc2filterplugin.so adb reboot