سفارشی‌سازی عناصر رسانه

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

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

درباره برنامه‌های افزودنی

اگر استخراج‌کننده‌های رسانه پیش‌فرض نیازهای شما را برآورده نمی‌کنند، می‌توانید افزایه‌های استخراج‌کننده سفارشی را در /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 (با وابستگی‌های انتقالی) ایجاد کنید که در پارتیشن فروشنده قرار دارد. وقتی فرایند سرویس کدک فروشنده شروع می‌شود، می‌تواند این نقطه ورودی سطح بالا را بار کند.

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

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

برش‌دهنده‌های سفارشی را در /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 ندارد).

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

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

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