سفارشی کردن اجزای رسانه

می توانید با استفاده از افزونه های فروشنده، استخراج کننده رسانه و اجزای کدک رسانه را گسترش دهید. API های MediaSession2 و MediaParser را نمی توان سفارشی کرد (اما می توانید تغییرات بالادستی را برای MediaPlayer و MediaSession API قدیمی انجام دهید).

برای پشتیبانی از انواع رسانه های اضافی در چارچوب رسانه اندروید، باید یک استخراج کننده و رمزگشای سفارشی ایجاد کنید. به عنوان مثال، برای افزودن پشتیبانی از ویدیوی Windows Media در فایل‌های AVI، باید یک AVI Extractor و یک Windows Media Video Decoder ایجاد کنید.

درباره افزونه ها

اگر استخراج کننده های رسانه پیش فرض نیازهای شما را برآورده نمی کنند، می توانید افزونه های استخراج کننده سفارشی را در /system/lib[64]/extractors/ قرار دهید. فرآیند استخراج به طور خودکار افزونه های استخراج کننده را از بسته APEX ارائه شده توسط Google و از /system/lib[64]/extractors/ بارگیری می کند.

به طور مشابه، می‌توانید سرویس‌های کدک رسانه سفارشی را راه‌اندازی کنید که از رابط Codec 2.0 تعریف شده در frameworks/av/media/codec2/core/ استفاده می‌کنند. برای پیاده سازی اولیه، به frameworks/av/media/codec2/hidl/services/ مراجعه کنید. نقطه ورود کتابخانه رابط C2ComponentStore است. برای مثال، به اجرای پیش‌فرض فروشگاه کدک نرم‌افزار در frameworks/av/media/codec2/vndk/C2Store.cpp مراجعه کنید.

هنگام استفاده از APEX خود، سرویس کدک را ساختار دهید و فایل APEX را با استفاده از فرآیندهای مشابه سرویس mediaswcodec بارگیری کنید. برای انجام این کار، یک کتابخانه اشتراکی سطح بالا که مسئول ثبت تمام اجزای C2 است تعریف کنید، سپس یک بسته APEX (با وابستگی های انتقالی) ایجاد کنید که در پارتیشن فروشنده قرار دارد. هنگامی که فرآیند سرویس کدک فروشنده شروع می شود، سپس می تواند این نقطه ورودی سطح بالا را بارگیری کند.

استخراج کننده ایجاد کنید

هنگام افزودن یک استخراج کننده برای قالب جدید، مطمئن شوید که استخراج کننده فقط به APIهای پایدار NDK وابسته است و به هیچ API خصوصی وابسته نیست. استخراج‌کنندگان باید API تعریف‌شده توسط frameworks/av/include/media/MediaExtractorPluginApi.h را پیاده‌سازی کنند و می‌توانند از پوشش‌های راحت C++ در frameworks/av/include/media/MediaExtractorPluginHelper.h استفاده کنند. از آنجایی که اندروید 10 یا بالاتر فقط بالاترین نسخه API استخراج کننده را پشتیبانی می کند، حتماً استخراج کننده خود را پس از استخراج کننده با بالاترین شماره نسخه API مدل کنید.

استخراج‌کننده‌های سفارشی را در /system/lib/64/extractors یا یک فروشنده APEX، که همراه با Google APEX حاوی استخراج‌کننده‌های Google باز می‌شود، قرار دهید. برای تأیید اینکه فریم ورک استخراج کننده شما بارگذاری شده است، دستور زیر را اجرا کنید.

adb shell dumpsys media.extractor

شما باید لیستی از استخراج کننده های موجود را دریافت کنید که مشابه موارد زیر است.

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)

اگر استخراج‌کننده سفارشی شما از قالبی پشتیبانی می‌کند که قبلاً توسط استخراج‌کننده ارائه‌شده توسط Google پشتیبانی می‌شود، می‌توانید با استفاده از تابع Sniff() فریم ورک را مجبور به استفاده از استخراج‌کننده خود کنید تا سطح اطمینان بالاتری نسبت به ارائه‌شده توسط Google برگرداند.

هنگامی که چارچوب رسانه استخراج کننده شما را بارگیری می کند (از /system/lib/64/extractors یا از یک فروشنده APEX)، فایل را می شناسد و اطلاعاتی در مورد محتوای آن دریافت می کند. مرحله بعدی اضافه کردن رمزگشا برای قالب است تا چارچوب بتواند بفهمد که چگونه محتوای فایل را تجزیه کند.

رمزگشای سفارشی ایجاد کنید

برای هر قالبی که قبلاً توسط رمزگشای ارائه شده توسط Google پشتیبانی نشده است، به یک رمزگشای سفارشی نیاز دارید. مثلا:

  • برای افزودن پشتیبانی از چارچوب رسانه ای برای فایل های AVI حاوی MP3، به یک استخراج کننده AVI نیاز دارید اما به رمزگشای MP3 نیاز ندارید زیرا قبلاً وجود دارد.

  • برای افزودن پشتیبانی از چارچوب رسانه ای برای فایل های AVI حاوی Windows Media، به یک استخراج کننده AVI و یک رمزگشای Windows Media نیاز دارید.

افزودن رمزگشای جدید شبیه به افزودن رمزگشاهای سخت افزاری خود برای AVC یا HEVC است.

در حالی که استخراج‌کننده نوع MIME آهنگ‌های رسانه‌ای را که در خود دارد منتشر می‌کند، کدک‌هایی که از این انواع MIME پشتیبانی می‌کنند باید وجود داشته باشند تا فایل به طور کامل پشتیبانی شود. رشته نوع MIME واقعی مورد استفاده کاملاً توافقی بین استخراج کننده و کدک است (رشته نیازی به اضافه شدن به فایل MediaDefs.h نیست).

ادغام با اسکنر رسانه

اسکنر رسانه به دنبال انواع فایل های جدید می گردد و آنها را به پایگاه داده رسانه اضافه می کند. برای اینکه اسکنر رسانه نوع فایل سفارشی شما را کنترل کند، اسکنر باید در مورد آن بداند. در اندروید 10 یا بالاتر، MimeUtils (در libcore ) نگاشت MIME به پسوند را حفظ می کند. قبلاً، این نگاشت در فایل MediaFile.java انجام می شد که همچنان حاوی نگاشت از نوع MIME به ثابت های فرمت MTP است.

یک استخراج کننده می تواند لیستی از پسوندهای نام فایلی را که پشتیبانی می کند (مانند MP3 یا MP4) صادر کند. با این حال، فقط LegacyMediaScanner از آن استفاده می کند. هیچ تاثیری بر ModernMediaScanner که به طور پیش فرض استفاده می شود ندارد.