Medya Bileşenlerini Özelleştirme

Satıcı uzantılarını kullanarak medya çıkarıcı ve medya codec bileşeni bileşenlerini genişletebilirsiniz. MediaSession2 ve MediaParser API'leri özelleştirilemez (ancak eski MediaPlayer ve MediaSession API'leri için değişiklikleri yukarı aktarabilirsiniz).

Android medya çerçevesindeki ek medya türlerini desteklemek için özel bir çıkarıcı ve kod çözücü oluşturmanız gerekir. Örneğin, AVI dosyalarına Windows Media videosu desteği eklemek için bir AVI Extractor ve bir Windows Media video Decoder oluşturmanız gerekir.

Uzantılar hakkında

Varsayılan medya çıkarıcılar gereksinimlerinizi karşılamıyorsa, /system/lib[64]/extractors/ içine özel çıkarıcı eklentileri yerleştirebilirsiniz. Ayıklama işlemi, Google tarafından sağlanan APEX paketinden ve /system/lib[64]/extractors/ çıkarıcı eklentileri otomatik olarak yükler.

Benzer şekilde, frameworks/av/media/codec2/core/ içinde tanımlanan Codec 2.0 arabirimini kullanan özel ortam kod çözücü hizmetleri ayarlayabilirsiniz. Temel bir uygulama için frameworks/av/media/codec2/hidl/services/ . Kitaplık giriş noktası, C2ComponentStore arabirimidir. Bir örnek için, frameworks/av/media/codec2/vndk/C2Store.cpp adresindeki varsayılan yazılım codec deposu uygulamasına bakın.

Kendi APEX'inizi kullanırken, codec hizmetini yapılandırın ve mediaswcodec hizmetiyle aynı işlemleri kullanarak APEX dosyasını yükleyin. Bunu yapmak için, tüm C2 bileşenlerini kaydetmekten sorumlu üst düzey bir paylaşılan kitaplık tanımlayın, ardından satıcı bölümünde bulunan bir APEX paketi (geçişli bağımlılıklarla) oluşturun. Satıcı codec bileşeni hizmet süreci başladığında, bu üst düzey giriş noktasını yükleyebilir.

Bir çıkarıcı oluşturma

Yeni bir biçim için bir çıkarıcı eklerken, çıkarıcının yalnızca kararlı NDK API'lerine bağlı olduğundan ve herhangi bir özel API'ye bağlı olmadığından emin olun. Çıkarıcılar, frameworks/av/include/media/MediaExtractorPluginApi.h tarafından tanımlanan API'yi uygulamalı ve frameworks/av/include/media/MediaExtractorPluginApi.h içindeki C++ kolaylık sarmalayıcılarını frameworks/av/include/media/MediaExtractorPluginHelper.h . Android 10 veya üstü, çıkarıcı API'nin yalnızca en yüksek sürümünü desteklediğinden, çıkarıcınızı en yüksek API sürüm numarasına sahip çıkarıcıdan sonra modellediğinizden emin olun.

Özel çıkarıcıları /system/lib/64/extractors içine veya Google çıkarıcıları içeren Google APEX ile birlikte açılan bir satıcı APEX'e yerleştirin. Çıkarıcınıza yüklenen çerçeveyi doğrulamak için aşağıdaki komutu çalıştırın.

adb shell dumpsys media.extractor

Aşağıdakine benzer mevcut çıkarıcıların bir listesini almalısınız.

Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)

Özel çıkarıcınız, Google tarafından sağlanan bir ayıklayıcı tarafından zaten desteklenen bir biçimi destekliyorsa, Google tarafından sağlanandan daha yüksek bir güven düzeyi döndürmek için Sniff() işlevini kullanarak çerçeveyi ayıklayıcınızı kullanmaya zorlayabilirsiniz.

Medya çerçevesi çıkarıcınızı yüklediğinde ( /system/lib/64/extractors veya bir satıcı APEX'ten), dosyayı tanır ve içeriği hakkında bilgi alır. Sonraki adım, çerçevenin dosya içeriğinin nasıl ayrıştırılacağını anlayabilmesi için format için bir kod çözücü eklemektir.

Özel bir kod çözücü oluşturma

Google tarafından sağlanan bir kod çözücü tarafından zaten desteklenmeyen herhangi bir biçim için özel bir kod çözücüye ihtiyacınız var. Örneğin:

  • MP3 içeren AVI dosyalarına medya çerçevesi desteği eklemek için bir AVI çıkarıcıya ihtiyacınız vardır, ancak bir MP3 kod çözücüye ihtiyacınız yoktur çünkü zaten bir tane vardır.

  • Windows Media içeren AVI dosyalarına medya çerçevesi desteği eklemek için hem bir AVI çıkarıcıya hem de bir Windows Media kod çözücüye ihtiyacınız vardır.

Yeni bir kod çözücü eklemek, AVC veya HEVC için kendi donanım kod çözücülerinizi eklemeye benzer.

Çıkarıcı, içerdiği medya parçalarının MIME türünü yayınlarken, dosyanın tam olarak desteklenebilmesi için bu MIME türlerini destekleyen codec bileşenlerinin mevcut olması gerekir. Kullanılan gerçek MIME türü dizesi, çıkarıcı ile kodek arasında kesinlikle bir anlaşmadır (dizenin MediaDefs.h dosyasına eklenmesi gerekmez).

Medya tarayıcı ile entegrasyon

Medya tarayıcı yeni dosya türleri arar ve bunları medya veritabanına ekler. Medya tarayıcının özel dosya türünüzü işlemesi için tarayıcının bunu bilmesi gerekir. Android 10 veya sonraki sürümlerde, MimeUtils ( libcore içinde), MIME'den uzantıya eşlemeyi korur. Önceden, bu eşleme, MIME türünden MTP biçimi sabitlerine bir eşlemeyi içeren MediaFile.java dosyasında işleniyordu.

Çıkarıcı, destekledikleri dosya adı uzantılarının (MP3 veya MP4 gibi) listesini dışa aktarabilir. Ancak bunu yalnızca LegacyMediaScanner kullanır; varsayılan olarak kullanılan ModernMediaScanner üzerinde hiçbir etkisi yoktur.