Medya bileşenlerini özelleştirme

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

Android medya çerçevesinde 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 Çıkarıcı ve bir Windows Media video Kod Çözücü oluşturmanız gerekir.

Uzantılar hakkında

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

Benzer şekilde, frameworks/av/media/codec2/core/ dosyasında tanımlanan Codec 2.0 arayüzünü kullanan özel medya codec hizmetlerini ayarlayabilirsiniz. Temel uygulama için frameworks/av/media/codec2/hidl/services/ adresine bakın. Kütüphane giriş noktası C2ComponentStore arayüzüdür. Örnek olarak, 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 APEX dosyasını mediaswcodec hizmetiyle aynı işlemleri kullanarak yükleyin. Bunu yapmak için, tüm C2 bileşenlerinin kaydedilmesinden 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ıklara sahip) oluşturun. Satıcı codec hizmet süreci başladığında bu üst düzey giriş noktasını yükleyebilir.

Bir çıkarıcı oluşturun

Yeni bir format için çı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ıdır ve C++ kolaylık sarmalayıcılarını frameworks/av/include/media/MediaExtractorPluginHelper.h içinde kullanabilir. Android 10 veya üzeri, çıkarıcı API'sinin 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ıyı örnek alarak modellediğinizden emin olun.

Özel çıkarıcıları /system/lib/64/extractors veya Google çıkarıcıları içeren Google APEX ile birlikte açılan bir satıcı APEX'ine 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 çıkarıcı tarafından zaten desteklenen bir formatı 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 çıkarı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. Bir sonraki adım, çerçevenin dosya içeriğini nasıl ayrıştıracağını anlayabilmesi için format için bir kod çözücü eklemektir.

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

Google tarafından sağlanan bir kod çözücü tarafından henüz desteklenmeyen herhangi bir biçim için özel bir kod çözücüye ihtiyacınız vardır. Ö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ü bir tane zaten mevcuttur.

  • 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 desteklenmesi için bu MIME türlerini destekleyen codec bileşenlerinin mevcut olması gerekir. Kullanılan gerçek MIME türü dizesi kesinlikle çıkarıcı ile codec bileşeni arasındaki bir anlaşmadır (dizenin MediaDefs.h dosyasına eklenmesi gerekmez).

Medya tarayıcıyla entegrasyon

Medya tarayıcısı yeni dosya türlerini arar ve bunları medya veritabanına ekler. Medya tarayıcısının özel dosya türünüzü işlemesini sağlamak için tarayıcının bunu bilmesi gerekir. Android 10 veya üzeri sürümlerde, MimeUtils ( libcore ) MIME-uzantı eşlemesini korur. Daha önce bu eşleme, MIME türünden MTP biçimi sabitlerine kadar bir eşlemeyi içermeye devam eden MediaFile.java dosyasında işleniyordu.

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