Medya bileşenlerini özelleştirme

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

Android medya çerçevesinde ek medya türlerini desteklemek için özel bir ayırıcı ve kod çözücü oluşturmanız gerekir. Örneğin, AVI dosyalarında Windows Media video desteği eklemek için bir AVI ayırıcı ve Windows Media video kod çözücü oluşturmanız gerekir.

Uzantılar hakkında

Varsayılan medya ayıcılar gereksinimlerinizi karşılamıyorsa /system/lib[64]/extractors/ içine özel ayıcılar eklentileri yerleştirebilirsiniz. Ayıklayıcı işlemi, Google tarafından sağlanan APEX paketinden ve /system/lib[64]/extractors/'ten 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 hizmetleri de ayarlayabilirsiniz. Temel uygulama için frameworks/av/media/codec2/hidl/services/ başlıklı makaleyi inceleyin. Kitaplık giriş noktası C2ComponentStore arayüzüdür. Örnek olarak, 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 mediaswcodec hizmetiyle aynı işlemleri kullanarak APEX dosyasını yükleyin. Bunu yapmak için tüm C2 bileşenlerini kaydettirmekten sorumlu üst düzey bir paylaşılan kitaplık tanımlayın, ardından tedarikçi bölümünde bulunan bir APEX paketi (geçiş bağımlılıklarıyla) oluşturun. Tedarikçi codec hizmeti işlemi başladığında bu üst düzey giriş noktasını yükleyebilir.

Ayıklama aracı oluşturma

Yeni bir biçim için çıkarıcı eklerken çıkarıcı 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'teki C++ kolaylık sarmalayıcılarını kullanabilir. Android 10 veya sonraki sürümler yalnızca ayıklayıcı API'nin en yüksek sürümünü desteklediğinden, ayıklayıcınızı en yüksek API sürüm numaralı ayıklayıcıya göre modellediğinizden emin olun.

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

adb shell dumpsys media.extractor

Kullanılabilir ayıklayıcıların listesini görürsünüz. Bu liste aşağıdakine benzer.

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 biçimi destekliyorsa Google tarafından sağlanan çıkarıcıdan 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, ayıklayıcınızı (/system/lib/64/extractors veya bir tedarikçi APEX'ten) yüklediğinde dosyayı tanır ve içeriği hakkında bilgi alır. Sonraki adım, çerçevenin dosya içeriğini nasıl ayrıştıracağını anlayabilmesi için biçim için bir kod çözücü eklemektir.

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

Google tarafından sağlanan bir kod çözücü tarafından desteklenmeyen tüm biçimler için özel bir kod çözücüye ihtiyacınız vardır. Örnek:

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

  • Windows Media içeren AVI dosyaları için medya çerçevesi desteği eklemek istiyorsanız hem AVI çıkarıcıya hem de Windows Media kod çözücüsüne 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.

Ayıraç, içerdiği medya parçalarının MIME türünü yayınlasa da dosyanın tam olarak desteklenmesi için bu MIME türlerini destekleyen codec'lerin mevcut olması gerekir. Kullanılan gerçek MIME türü dizesi, kesinlikle çıkarıcı ile codec arasında bir anlaşmadır (diyenin MediaDefs.h dosyasına eklenmesi gerekmez).

Medya tarayıcısıyla entegrasyon

Medya tarayıcısı yeni dosya türlerini arar ve medya veritabanına ekler. Medya tarayıcısının özel dosya türünüzü işleyebilmesi için tarayıcının bu dosya türünü bilmesi gerekir. Android 10 veya sonraki sürümlerde MimeUtils (libcore içinde), MIME ile uzantı eşlemesini korur. Bu eşleme daha önce MediaFile.java dosyasında ele alınıyordu. Bu dosya, MIME türünden MTP biçimi sabitlerine bir eşleme içermeye devam etmektedir.

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