Medya bileşenlerini özelleştirme

Tedarikçi uzantılarını kullanarak medya ayıklayıcı ve medya codec'i bileşenlerini genişletebilirsiniz. MediaSession2 ve MediaParser API'leri özelleştirilemez (ancak eski MediaPlayer ve MediaSession API'leri için değişiklikleri yukarı akışa gönderebilirsiniz).

Android medya çerçevesinde ek medya türlerini desteklemek için özel bir ayıklayıcı ve kod çözücü oluşturmanız gerekir. Örneğin, AVI dosyalarında Windows Media Video 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 ayıklayıcılar gereksinimlerinizi karşılamıyorsa /system/lib[64]/extractors/ konumuna özel ayıklayıcı eklentileri yerleştirebilirsiniz. Ayıklayıcı işlemi, Google tarafından sağlanan APEX paketinden ve /system/lib[64]/extractors/ konumundan ayıklayıcı eklentilerini otomatik olarak yükler.

Benzer şekilde, frameworks/av/media/codec2/core/ içinde tanımlanan Codec 2.0 arayüzünü kullanan özel medya codec'i hizmetleri de ayarlayabilirsiniz. Temel bir uygulama için frameworks/av/media/codec2/hidl/services/ başlıklı makaleyi inceleyin. Kitaplık giriş noktası C2ComponentStore arayüzüdür. Örnek için frameworks/av/media/codec2/vndk/C2Store.cpp adresindeki varsayılan yazılım codec'i mağazası 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şenlerini kaydetmekten sorumlu bir üst düzey 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. Tedarikçi codec hizmeti süreci başladığında bu üst düzey giriş noktasını yükleyebilir.

Ayıklayıcı oluşturma

Yeni bir biçim için ayıklayıcı eklerken ayıklayı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. Ayıklayıcılar, frameworks/av/include/media/MediaExtractorPluginApi.h tarafından tanımlanan API'yi uygulamalı ve frameworks/av/include/media/MediaExtractorPluginHelper.h içindeki C++ kolaylık sarmalayıcılarını kullanabilir. Android 10 veya sonraki sürümler yalnızca çıkarıcı API'nin 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ıya göre modellediğinizden emin olun.

Özel ayıklayıcıları /system/lib/64/extractors veya Google ayıklayıcılarını içeren Google APEX ile birlikte açılan bir satıcı APEX'ine yerleştirin. Çerçevenin ayıklayıcınızı yüklediğini doğrulamak için aşağıdaki komutu çalıştırın.

adb shell dumpsys media.extractor

Aşağıdakine benzer bir kullanılabilir ayıklayıcı listesi alırsı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 ayıklayıcınız, Google tarafından sağlanan bir ayıklayıcı tarafından zaten desteklenen bir biçimi destekliyorsa Sniff() işlevini kullanarak Google tarafından sağlanan ayıklayıcıdan daha yüksek bir güven düzeyi döndürerek çerçevenin ayıklayıcınızı kullanmasını zorlayabilirsiniz.

Medya çerçevesi, ayıklayıcınızı (/system/lib/64/extractors veya bir satıcı APEX'inden) yüklediğinde dosyayı tanır ve içeriğiyle ilgili bilgileri alır. Sonraki adım, biçim için bir kod çözücü eklemektir. Böylece çerçeve, dosya içeriğinin nasıl ayrıştırılacağını anlayabilir.

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

Google tarafından sağlanan kod çözücü tarafından desteklenmeyen tüm biçimler 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 AVI çıkarıcıya ihtiyacınız vardır ancak MP3 kod çözücüye ihtiyacınız yoktur çünkü zaten bir tane mevcuttur.

  • Windows Media içeren AVI dosyalarına medya çerçevesi desteği eklemek için hem AVI çıkarıcı hem de Windows Media kod çözücü gerekir.

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

Ayıklayı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'lerin bulunması gerekir. Kullanılan gerçek MIME türü dizesi, yalnızca ayıklayıcı ile codec arasındaki bir anlaşmadır (dizenin MediaDefs.h dosyasına eklenmesi gerekmez).

Medya tarayıcıyla entegrasyon

Medya tarayıcı, yeni dosya türlerini 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 bu tür hakkında bilgi sahibi olması gerekir. Android 10 veya sonraki sürümlerde, MimeUtils (in libcore) MIME-uzantı eşlemesini korur. Daha önce bu eşleme, MediaFile.java dosyasında yapılıyordu. Bu dosya, MIME türünden MTP biçimi sabitlerine eşleme içermeye devam ediyor.

Ayıklayıcılar, destekledikleri dosya adı uzantılarının (ör. MP3 veya MP4) listesini dışa aktarabilir. Ancak bu yalnızca LegacyMediaScanner tarafından kullanılır ve varsayılan olarak kullanılan ModernMediaScanner üzerinde etkisi yoktur.