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

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

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

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

اگر استخراج‌کننده‌های پیش‌فرض رسانه، نیازهای شما را برآورده نمی‌کنند، می‌توانید افزونه‌های استخراج‌کننده سفارشی را در /system/lib[64]/extractors/ قرار دهید. فرآیند استخراج به‌طور خودکار افزونه‌های استخراج‌کننده را از بسته APEX ارائه شده توسط گوگل و از /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 استفاده کنند. از آنجا که اندروید ۱۰ یا بالاتر فقط از بالاترین نسخه API استخراج‌کننده پشتیبانی می‌کند، حتماً استخراج‌کننده خود را بر اساس استخراج‌کننده‌ای با بالاترین شماره نسخه API مدل‌سازی کنید.

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

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)

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

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

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

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

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

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

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

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

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

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

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