Android 12'de kullanıma sunulan uyumlu medya dönüştürme, cihazların video kaydı 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 uygulamada açılan videoları (bir dakikaya kadar) HEVC veya HDR gibi biçimlerde otomatik olarak dönüştürebilir. Bu sayede, cihazda videolar daha yeni biçimlerde çekilse bile uygulamalar çalışabilir.
Uyumlu medya kodlama dönüştürme özelliği varsayılan olarak kapalı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 dönüştürme başlıklı makaleyi inceleyin.
İş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 gecikme süresi 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 hizmetler arasında 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 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 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.
1. şekil. 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üşümleri, bir mediacodec kod çözücü ve bir mediacode kodlayıcı 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 dönüştürme özelliği, birincil harici birimde DCIM/Camera/
klasöründe depolanan yerel OEM kamera uygulaması tarafından oluşturulan cihaz içi 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 etkin:
- 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 uygulamaya erişim
- 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 cihazdan cihaza dosya aktarma
Transkodlama için özelleştirilmiş dosya yolları ekleme
Cihaz üreticileri, DCIM/
dizini altında isteğe bağlı olarak medya dönüştürme 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 transkodlama yolu runtime resource overlay (RRO)'yu 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 20
Mimariye 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
TranscodingSessions
iç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'nın üzerine inşa edilmiştir.
Uyumlu medya kod dönüştürme özelliği, hem hizmette hem de medya kod dönüştürücüde kod dönüştürme metriklerini 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.
- Çalışma zamanında uygulama uyumluluğu çerçevesiyle desteklenen biçimleri devre dışı bırakma (Kullanıcılar bu özelliği Ayarlar'da her uygulama için ayrı ayrı da devre dışı bırakabilir).
openTypedAssetFileDescriptor
API'si ile desteklenmeyen biçimleri açıkça belirterekMediaStore
ile dosya açma.
USB aktarımları (cihazdan PC'ye) için dönüştürme varsayılan olarak 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 dönüştürmeyi etkinleştirebilir.
3.Şekil 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
Kod dönüştürme isteklerinin sistem kaynaklarını uzun süre boyunca kilitlemesini önlemek için kod dönüştürme 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ıyı döndürür.
Cihaz gereksinimleri
Uyumlu medya dönüştürme özelliğini desteklemek 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
Medya dönüştürme, video donanımı ve depolama için cihaz performansının sağlanması amacıyla 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.cts
android.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 açma/kapatma düğmesini açık, Dönüştürmeyi etkinleştir açma/kapatma düğmesini 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.transcoding
Video uzunluğu sınırlamasını genişletme
Test amacıyla, aşağıdaki komutu kullanarak transkodlama 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.java
MediaTranscoding Service
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Yerel 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ı, FilterWrapper::Plugin
API'si aracılığıyla libc2filterplugin.so
yüklenir ve eklentideki mevcut filtreleri kaydeder. Oluşturma sırasında FilterWrapper
, mevcut tüm 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
C2ComponentStore
nesnesi 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ızcaFilterWrapper
sı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ımlanı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
true
değ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 filtresitrue
değ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).
5.şekil Sorgu ve yapılandırma.
Başlatma
Başlangıçta, sarmalanmış bileşen, kod çözücüyü ve arabellekleri değiştiren tüm filtreleri başlatır. Filtre etkin değilse sarmalanmış bileşen, kod çözücüyü ve geçiş arabelleklerini başlatır ve kod çözücünün kendisine komut gönderir.
Arabellek işleme
6.şekil Arabellek işleme.
Sarmalanmış kod çözücüye sıraya alınan 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 müşteriye 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ırması gerekir.
Durdurma, sıfırlama ve serbest bırakma
Sarmalanmış bileşen, durdurma noktasında 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
FilterPlugin
arayüzünü uygulayın ve/vendor/lib[64]/libc2filterplugin.so.
konumuna bırakın. - Gerekirse
mediacodec.te
için ek izinler ekleyin. - Adaptasyon katmanını Android 12'ye güncelleyin ve
media.c2
hizmetini yeniden oluşturun.
Eklentiyi test etme
Örnek eklentiyi test etmek için aşağıdakileri yapın:
- Cihazı yeniden oluşturun ve flash'leyin.
Aşağıdaki komutu kullanarak örnek eklentiyi oluşturun:
m sample-codec2-filter-plugin
Cihazı 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