تراتبدیل رسانه سازگار که در Android 12 معرفی شد، ویژگیای است که به دستگاهها امکان میدهد از قالبهای رسانهای مدرنتر و کارآمدتر برای ذخیرهسازی در ضبط ویدیو، مثل HEVC، استفاده کنند و درعینحال با برنامهها سازگار باشند. با این ویژگی، سازندگان دستگاه میتوانند بهطور پیشفرض از HEVC بهجای AVC استفاده کنند تا کیفیت ویدیو را بهبود بخشند و درعینحال نیاز به فضای ذخیرهسازی و پهنای باند را کاهش دهند. برای دستگاههایی که تراتبدیل رسانه سازگار در آنها فعال است، Android میتواند ویدیوهای ضبطشده در قالبهایی مثل HEVC یا HDR را (تا یک دقیقه) بهطور خودکار تبدیل کند، وقتی که ویدیوها توسط برنامهای باز میشوند که از آن قالب پشتیبانی نمیکند. این کار به برنامهها اجازه میدهد حتی وقتی ویدیوها در قالبهای جدیدتر در دستگاه ضبط میشوند، کار کنند.
ویژگی تراتبدیل رسانه سازگار بهطور پیشفرض خاموش است. برای درخواست تراتبدیل رسانه، برنامهها باید قابلیتهای رسانهای خود را اعلام کنند. برای کسب اطلاعات بیشتر درباره اعلام قابلیتهای رسانه، تراتبدیل رسانه سازگار در سایت «توسعهدهندگان Android» را ببینید.
روش کار
ویژگی تراتبدیل رسانه سازگار از دو بخش اصلی تشکیل شده است:
- خدمات تراتبدیل در چارچوب رسانه: این خدمات فایلها را بااستفاده از سختافزار از قالبی به قالب دیگر تبدیل میکنند تا تأخیر کم و تبدیل با کیفیت بالا داشته باشند. این شامل API تراتبدیل، سرویس تراتبدیل، افزایه OEM برای فیلترهای سفارشی، و سختافزار میشود. برای جزئیات بیشتر، به نمای کلی معماری مراجعه کنید.
- ویژگی تراتبدیل رسانه سازگار در ارائهدهندگان رسانه: این مؤلفه که در ارائهدهندگان رسانه یافت میشود، برنامههایی را که به فایلهای رسانه دسترسی دارند رهگیری میکند و براساس قابلیتهای اعلامشده برنامه، فایل اصلی یا فایل تراتبدیلشده را ارائه میدهد. اگر برنامهای از قالب فایل رسانه پشتیبانی کند، نیاز به پردازش ویژه نیست. اگر برنامهای از این قالب پشتیبانی نکند، وقتی برنامه به فایل دسترسی پیدا میکند، چارچوب فایل را به قالب قدیمیتری مثل AVC تبدیل میکند.
شکل ۱ نمای کلی فرایند تراتبدیل رسانه را نشان میدهد.
شکل ۱. نمای کلی تراتبدیل رسانههای سازگار.
قالبهای پشتیبانیشده
ویژگی تراتبدیل رسانه سازگار از تبدیلهای قالب زیر پشتیبانی میکند:
- HEVC (8-bit) به AVC: تبدیل کدک ازطریق اتصال یک کدبند رسانهای و یک کدبند رسانهای انجام میشود.
- HDR10+ (۱۰ بیتی) به AVC (SDR): تبدیلهای HDR به SDR بااستفاده از نمونههای mediacodec و یک افزایه فروشنده به نمونههای کدبند انجام میشود. برای اطلاعات بیشتر، به کدبندی HDR به SDR مراجعه کنید.
منابع محتوای پشتیبانیشده
ویژگی تراتبدیل رسانه سازگار از رسانه تولیدشده در دستگاه توسط برنامه دوربین OEM بومی که در پوشه DCIM/Camera/ در حجم خارجی اصلی ذخیره شده است پشتیبانی میکند. این ویژگی از رسانه در فضای ذخیرهسازی ثانویه پشتیبانی نمیکند.
محتوایی که ازطریق ایمیل یا کارت SD به دستگاهها منتقل میشود پشتیبانی نمیشود.
برنامهها براساس مسیرهای فایل مختلف به فایلها دسترسی پیدا میکنند. در زیر مسیرهای فایل که در آنها تراتبدیل فعال یا دور زده میشود توضیح داده شده است:
تراتبدیل فعال شد:
- دسترسی برنامه ازطریق میاناهای برنامهسازی کاربردی MediaStore
- دسترسی برنامه ازطریق میاناهای برنامهسازی کاربردی مسیر فایل مستقیم ازجمله Java و کد بومی
- دسترسی برنامه ازطریق «چارچوب دسترسی به فضای ذخیرهسازی» (SAF)
- دسترسی برنامه ازطریق «هدفهای برگ همرسانی سیستمعامل». (فقط نشانی وب MediaStore)
- انتقال فایل MTP/PTP از تلفن به رایانه
تراتبدیل دور زده شد:
- انتقال فایل از دستگاه با بیرون آوردن کارت SD
- انتقال فایل از دستگاهی به دستگاه دیگر بااستفاده از گزینههایی مثل «همرسانی با اطراف» یا انتقال ازطریق بلوتوث.
افزودن مسیرهای فایل سفارشی برای تراتبدیل
تولیدکنندگان دستگاه میتوانند بهصورت اختیاری مسیرهای فایل را برای تراتبدیل رسانه در
دایرکتوری DCIM/ اضافه کنند. هر مسیری خارج از فهرست راهنمای DCIM/ رد میشود.
افزودن این مسیرهای فایل ممکن است برای برآورده کردن الزامات شرکت مخابراتی یا مقررات محلی لازم باشد.
برای افزودن مسیر فایل، از مسیر تراتبدیل
رونوشت منبع زمان اجرا (RRO)،
config_supported_transcoding_relative_paths استفاده کنید. در زیر نمونهای از
نحوه افزودن مسیر فایل آمده است:
<string-array name="config_supported_transcoding_relative_paths" translatable="false">
<item>DCIM/JCF/</item>
</string-array>
برای درستیسنجی مسیرهای فایل پیکربندیشده، از این استفاده کنید:
adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20نمای کلی معماری
این بخش معماری ویژگی تراتبدیل رسانه را شرح میدهد.
شکل ۲. معماری تراتبدیل رسانه.
معماری تراتبدیل رسانه از مؤلفههای زیر تشکیل شده است:
- میانای برنامهسازی کاربردی سیستم MediaTranscodingManager: رابطی که به کارخواه اجازه میدهد با سرویس MediaTranscoding ارتباط برقرار کند. واحد MediaProvider از این API استفاده میکند.
- MediaTranscodingService: سرویس بومی که اتصالات کارخواه را مدیریت میکند، درخواستهای تراتبدیل را زمانبندی میکند، و دفترداری را برای
TranscodingSessionsمدیریت میکند. - MediaTranscoder: کتابخانه بومی که تراتبدیل را انجام میدهد. این کتابخانه روی چارچوب رسانه NDK ساخته شده است تا با واحدها سازگار باشد.
ویژگی تراتبدیل رسانه سازگار، سنجههای تراتبدیل را هم در سرویس و هم در تراتبدیلکننده رسانه ثبت میکند. کد سمت کارخواه و سمت سرویس در ماژول MediaProvider قرار دارد تا رفع اشکال و بهروزرسانی بهموقع انجام شود.
دسترسی به فایل
تراتبدیل رسانه سازگار برپایه سیستم فایل در فضای کاربر (FUSE) ساخته شده است، که برای فضای ذخیرهسازی محدودشده استفاده میشود. FUSE به واحد MediaProvider امکان میدهد عملکرد فایلها را در فضای کاربر بررسی کند و دسترسی به فایلها را براساس خطمشی اجازه دادن، رد کردن، یا محو کردن دسترسی کنترل کند.
وقتی برنامهای تلاش میکند به فایلی دسترسی پیدا کند، کارگزار FUSE دسترسی خواندن فایل از برنامه را رهگیری میکند. اگر برنامه از قالب جدیدتری (مثل HEVC) پشتیبانی کند، فایل اصلی برگردانده میشود. اگر برنامه از این قالب پشتیبانی نکند، فایل به قالب قدیمیتری (مانند AVC) تراتبدیل میشود یا اگر نسخه تراتبدیلشدهای دردسترس باشد، از حافظه نهان برگردانده میشود.
درخواست فایلهای تراتبدیلشده
ویژگی تراتبدیل رسانه سازگار بهطور پیشفرض غیرفعال است. برنامهها میتوانند بااستفاده از گزینههای زیر، داراییهای تراتبدیلشده را درخواست کنند:
- قالبهای پشتیبانینشده را در فایل مانیفست اعلام کنید. برای جزئیات، به اعلام قابلیتها در منبع و اعلام قابلیتها در کد مراجعه کنید.
- قالبهای پشتیبانیشده را با چارچوب سازگاری برنامه در زمان اجرا غیرفعال کنید (کاربران همچنین میتوانند این ویژگی را برای هر برنامه در «تنظیمات» غیرفعال کنند).
- فایلی را با
MediaStoreباز کنید و درعینحال قالبهای پشتیبانینشده را بهطور صریح باopenTypedAssetFileDescriptorAPI مشخص کنید.
برای انتقال USB (دستگاه به رایانه)، کدبندی تراتبدیل بهطور پیشفرض غیرفعال است اما کاربران میتوانند بااستفاده از کلید تبدیل ویدیوها به AVC در صفحه تنظیمات تنظیمات برگزیده USB، همانطور که در «شکل ۳» نشان داده شده است، کدبندی تراتبدیل را فعال کنند.
شکل ۳. برای فعال کردن تراتبدیل رسانه در صفحه «تنظیمات برگزیده USB»، کلید تغییر وضعیت را روشن کنید.
محدودیتهای درخواست فایلهای تراتبدیلشده
برای جلوگیری از قفل شدن منابع سیستم برای دورههای طولانی توسط درخواستهای تراتبدیل، برنامههایی که درخواست جلسات تراتبدیل دارند به موارد زیر محدود میشوند:
- ۱۰ جلسه متوالی
- مجموع زمان اجرا سه دقیقه
اگر برنامهای از همه این محدودیتها فراتر رود، چارچوب توصیفگر فایل اصلی را برمیگرداند.
پیشنیازهای دستگاه
برای پشتیبانی از ویژگی تراتبدیل رسانه سازگار، دستگاهها باید الزامات زیر را برآورده کنند:
- دستگاه بهطور پیشفرض کدبندی HEVC را در برنامه دوربین بومی فعال کرده است
- (دستگاههایی که از تراتبدیل HDR به SDR پشتیبانی میکنند) دستگاه از ضبط ویدیو HDR پشتیبانی میکند
برای اطمینان از عملکرد دستگاه برای تراتبدیل رسانه، عملکرد دسترسی خواندن/نوشتن سختافزار ویدیو و فضای ذخیرهسازی باید بهینه شود. وقتی کدکهای رسانه با اولویت برابر با 1 پیکربندی میشوند، کدکها باید با بالاترین توان عملیاتی ممکن کار کنند. توصیه میکنیم که عملکرد تراتبدیل به حداقل ۲۰۰ فریم در ثانیه برسد. برای آزمایش عملکرد سختافزار، معیار سنجش
تراتبدیل رسانه را در frameworks/av/media/libmediatranscoding/transcoder/benchmark اجرا کنید.
اعتبارسنجی
برای اعتبارسنجی ویژگی تراتبدیل رسانه سازگار، آزمونهای CTS زیر را اجرا کنید:
android.media.mediatranscoding.ctsandroid.mediaprovidertranscode.cts
فعال کردن تراتبدیل رسانه در سطح جهانی
برای آزمایش چارچوب تراتبدیل رسانه یا عملکرد برنامه با تراتبدیل، میتوانید ویژگی تراتبدیل رسانه سازگار را بهصورت سراسری فعال یا غیرفعال کنید. در صفحه گزینههای توسعهدهندگان تنظیمات > سیستم > توسعهدهندگان > تراتبدیل رسانه، کلید لغو پیشفرضهای تراتبدیل را روی روشن تنظیم کنید و سپس کلید فعال کردن تراتبدیل را روی روشن یا خاموش تنظیم کنید. اگر این تنظیم فعال باشد، تراتبدیل رسانه ممکن است در پسزمینه برای برنامههایی غیراز برنامهای که درحال توسعه آن هستید رخ دهد.
بررسی وضعیت تراتبدیل
درطول آزمایش، میتوانید از دستور پوسته ADB زیر برای بررسی وضعیت تراتبدیل، ازجمله جلسات تراتبدیل فعلی و گذشته، استفاده کنید:
adb shell dumpsys media.transcodingافزایش محدودیت طول ویدیو
برای اهداف آزمایشی، میتوانید محدودیت طول ویدیو یک دقیقهای را برای تراتبدیل بااستفاده از فرمان زیر افزایش دهید. پساز اجرای این فرمان، ممکن است بازراهاندازی لازم باشد.
adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>منبع و مراجع AOSP
در زیر کد منبع AOSP مربوط به تراتبدیل رسانه سازگار ارائه شده است.
Transcoding System API (only used by MediaProvider)
ApplicationMediaCapabilities API
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.javaسرویس MediaTranscoding
frameworks/av/services/mediatranscoding/frameworks/av/media/libmediatranscoding/
MediaTranscoder محلی
frameworks/av/media/libmediatranscoding/transcoder
افزایه نمونه HDR برای MediaTranscoder
کد تراتبدیل و رهگیری فایل MediaProvider
محک MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder/benchmark
آزمایشهای CTS
cts/tests/tests/mediatranscoding/
کدبندی HDR به SDR
برای پشتیبانی از کدبندی HDR به SDR، سازندگان دستگاه میتوانند از افزایه فیلتر نمونه AOSP
Codec 2.0 واقع در
/platform/frameworks/av/media/codec2/hidl/plugin/ استفاده کنند.
این بخش نحوه عملکرد افزایه فیلتر، نحوه پیادهسازی افزایه، و نحوه آزمایش افزایه را شرح میدهد.
اگر دستگاهی افزایهای نداشته باشد که از کدبندی HDR به SDR پشتیبانی کند، برنامهای که به ویدیو HDR دسترسی پیدا میکند، توصیفگر فایل اصلی را بدون توجه به قابلیتهای رسانهای برنامه که در مانیفست اعلام شده است دریافت میکند.
روش کار
این بخش رفتار کلی افزایه فیلتر Codec 2.0 را توضیح میدهد.
پسزمینه
Android پیادهسازی لایه سازگاری بین میانای
Codec 2.0
و میانای android.hardware.media.c2 HAL در
android::hardware::media::c2 ارائه میدهد. برای افزایههای فیلتر، AOSP شامل یک سازوکار پوشاننده است که رمزگشاها را همراه با افزایههای فیلتر میپوشاند.
MediaCodec
این عناصر پیچیدهشده را بهعنوان کدبند با ویژگیهای فیلتر کردن تشخیص میدهد.
نمای کلی
کلاس FilterWrapper کدکهای فروشنده را میگیرد و کدکهای
پیچیدهشده را به لایه سازگاری media.c2 برمیگرداند. کلاس FilterWrapper
libc2filterplugin.so را ازطریق میانای برنامهسازی کاربردی FilterWrapper::Plugin بار میکند و
فیلترهای دردسترس را از افزایه ضبط میکند. در زمان ایجاد، FilterWrapper
همه فیلترهای دردسترس را نمونهسازی میکند. فقط فیلترهایی که میانگیر را تغییر میدهند
در شروع آغاز میشوند.
شکل ۴. معماری افزایه فیلتر.
میانای افزایه فیلتر
رابط
FilterPlugin.h
میاناهای برنامهسازی کاربردی زیر را برای نمایش فیلترها تعریف میکند:
std::shared_ptr<C2ComponentStore>getComponentStore()یک شیء
C2ComponentStoreرا که حاوی فیلترها است برمیگرداند. این مورد از آنچه پیادهسازی Codec 2.0 فروشنده نشان میدهد جدا است. معمولاً این فروشگاه فقط شامل فیلترهای استفادهشده توسط کلاسFilterWrapperاست.bool describe(C2String name, Descriptor *desc)فیلترها را علاوهبر آنچه در
C2ComponentStoreدردسترس است توصیف میکند. شرحهای زیر تعریف شده است:-
controlParam: پارامترهایی که رفتار فیلترها را کنترل میکنند. برای مثال، برای نگاشتگر رنگ HDR به SDR، پارامتر کنترل تابع انتقال هدف است. -
affectedParams: پارامترهایی که تحتتأثیر عملیات فیلتر کردن قرار میگیرند. برای مثال، برای نگاشتکننده رنگ HDR به SDR، پارامترهای تحتتأثیر جنبههای رنگ هستند.
-
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)اگر عنصر فیلتر بافر را تغییر دهد،
trueرا برمیگرداند. برای مثال، اگر تابع انتقال هدف SDR باشد و تابع انتقال ورودی HDR (HLG یا PQ) باشد، فیلتر نگاشت تنtrueرا برمیگرداند.
جزئیات FilterWrapper
این بخش جزئیات کلاس FilterWrapper را شرح میدهد.
تاریخ ایجاد
مؤلفه پیچیده شده، رمزگشای زیرین و همه فیلترهای تعریفشده را در زمان ایجاد نمونهسازی میکند.
پُرسمان و پیکربندی
عنصر پیچیدهشده پارامترهای ورودی را براساس شرح فیلتر از پُرسمانها یا درخواستهای پیکربندی جدا میکند. برای مثال، پیکربندی پارامتر کنترل فیلتر به فیلتر مربوطه هدایت میشود، و پارامترهای تحتتأثیر از فیلترها در پُرسمانها وجود دارند (بهجای خواندن از رمزگشایی که پارامترهای تحتتأثیر ندارد).
شکل ۵. پُرسمان و پیکربندی.
شروع
در شروع، عنصر پیچیدهشده رمزگشا و همه فیلترهایی را که بافرهای تغییر میدهند شروع میکند. اگر هیچ فیلتری فعال نباشد، عنصر بستهبندیشده رمزگشا را شروع میکند و بافرها را عبور میدهد و فرمانها را به خود رمزگشا ارسال میکند.
مدیریت میانگیری
شکل ۶. مدیریت میانگیر.
میانگیرهای صفشده به کدبند پیچیده به کدبند زیرین میروند. مؤلفه پیچیده شده میانگیر خروجی را ازطریق فراخوانی برگشتی onWorkDone_nb() از رمزگشا میگیرد و سپس آن را در صف فیلترها قرار میدهد. بافر برونداد نهایی از
آخرین فیلتر به کارخواه گزارش میشود.
برای اینکه این مدیریت میانگیر کار کند، عنصر پیچیدهشده باید
C2PortBlockPoolsTuning را برای آخرین فیلتر پیکربندی کند تا چارچوب
میانگیرهای برونداد را از استخر بلوک موردانتظار تولید کند.
توقف، بازنشانی، و رها کردن
در توقف، عنصر پیچیدهشده رمزگشا و همه فیلترهای فعالشدهای را که شروع شده بودند متوقف میکند. در بازنشانی و انتشار، همه عناصر بازنشانی یا منتشر میشوند صرفنظر از اینکه فعال باشند یا نه.
پیادهسازی افزایه فیلتر نمونه
برای فعال کردن افزایه، مراحل زیر را انجام دهید:
- واسط
FilterPluginرا در کتابخانه پیادهسازی کنید و آن را در/vendor/lib[64]/libc2filterplugin.so.رها کنید - درصورت نیاز، اجازههای بیشتری به
mediacodec.teاضافه کنید. - لایه سازگاری را به Android 12 بهروزرسانی کنید و
سرویس
media.c2را بازسازی کنید.
آزمایش افزایه
برای آزمایش افزایه نمونه، مراحل زیر را انجام دهید:
- دستگاه را بازسازی و فلش کنید.
افزونه نمونه را بااستفاده از فرمان زیر بسازید:
m sample-codec2-filter-pluginدستگاه را مجدداً نصب کنید و افزایه فروشنده را تغییر نام دهید تا توسط سرویس کدک شناسایی شود.
adb root adb remount adb reboot adb wait-for-device adb root adb remount adb push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \ /vendor/lib64/libc2filterplugin.so adb push /out/target/<...>/lib/sample-codec2-filter-plugin.so \ /vendor/lib/libc2filterplugin.so adb reboot