رمزگذاری رسانه سازگار، که در اندروید 12 معرفی شد، قابلیتی است که به دستگاهها اجازه میدهد از فرمتهای رسانهای مدرنتر و با ذخیرهسازی کارآمدتر برای ضبط ویدیو مانند HEVC استفاده کنند و در عین حال سازگاری با برنامهها را حفظ کنند. با استفاده از این ویژگی، سازندگان دستگاه میتوانند بهطور پیشفرض از HEVC به جای AVC برای بهبود کیفیت ویدیو و در عین حال کاهش فضای ذخیرهسازی و پهنای باند مورد نیاز استفاده کنند. برای دستگاههایی که رمزگذاری رسانه سازگار را فعال کردهاند، Android میتواند بهطور خودکار ویدیوهای ضبطشده در قالبهایی مانند HEVC یا HDR را هنگامی که ویدیوها توسط برنامهای که از فرمت پشتیبانی نمیکند باز میشوند (حداکثر یک دقیقه) تبدیل کند. این به برنامهها اجازه میدهد حتی زمانی که ویدیوها با فرمتهای جدیدتر روی دستگاه ضبط میشوند، کار کنند.
ویژگی رمزگذاری رسانه سازگار به طور پیش فرض خاموش است. برای درخواست رمزگذاری رسانه، برنامهها باید قابلیتهای رسانه خود را اعلام کنند. برای اطلاعات بیشتر در مورد اعلام قابلیتهای رسانه، رمزگذاری رسانه سازگار را در سایت Android Developers ببینید.
چگونه کار می کند
ویژگی transcoding رسانه سازگار از دو بخش اصلی تشکیل شده است:
- خدمات Transcoding در چارچوب رسانه ای: این سرویس ها فایل ها را با استفاده از سخت افزار برای تاخیر کم و تبدیل با کیفیت بالا، فایل ها را از یک فرمت به فرمت دیگر تبدیل می کنند. این شامل API transcoding، سرویس transcoding، یک پلاگین OEM برای فیلترهای سفارشی و سخت افزار است. برای جزئیات بیشتر، به نمای کلی معماری مراجعه کنید.
- ویژگی رمزگذاری رسانه سازگار در ارائهدهندگان رسانه: این مؤلفه موجود در ارائهدهندگان رسانه، برنامههایی را که به فایلهای رسانهای دسترسی دارند را رهگیری میکند و یا فایل اصلی یا یک فایل رمزگذاریشده را بر اساس قابلیتهای اعلامشده برنامه ارائه میکند. اگر برنامه ای از فرمت فایل رسانه ای پشتیبانی می کند، نیازی به رسیدگی خاصی نیست. اگر برنامهای از فرمت پشتیبانی نمیکند، زمانی که برنامه به فایل دسترسی پیدا میکند، چارچوب فایل را به فرمت قدیمیتری مانند AVC تبدیل میکند.
شکل 1 نمای کلی از فرآیند رمزگذاری رسانه را نشان می دهد.
شکل 1. مروری بر رمزگذاری رسانه های سازگار.
فرمت های پشتیبانی شده
ویژگی transcoding رسانه سازگار از تبدیل فرمت های زیر پشتیبانی می کند:
- HEVC (8 بیتی) به AVC: تبدیل کدک از طریق اتصال یک رسیور مدیاکدک و یک رمزگذار مدیاکد انجام می شود.
- HDR10+ (10 بیتی) به AVC (SDR): تبدیل HDR به SDR با استفاده از نمونه های مدیاکدک و یک قلاب پلاگین فروشنده به نمونه های رمزگشا انجام می شود. برای اطلاعات بیشتر، کدگذاری HDR به SDR را ببینید.
منابع محتوای پشتیبانی شده
ویژگی transcoding رسانه سازگار از رسانه روی دستگاه تولید شده توسط برنامه دوربین اصلی OEM که در پوشه DCIM/Camera/
در حجم خارجی اولیه ذخیره میشود، پشتیبانی میکند. این ویژگی از رسانه در حافظه ثانویه پشتیبانی نمی کند. محتوای ارسال شده به دستگاهها از طریق ایمیل یا کارتهای SD پشتیبانی نمیشود.
برنامه ها بر اساس مسیرهای مختلف فایل به فایل ها دسترسی دارند. موارد زیر مسیرهای فایلی را که در آن ترانکدینگ فعال یا دور زده می شود، توضیح می دهد:
رمزگذاری فعال شد:
- دسترسی به برنامه از طریق API های MediaStore
- دسترسی به برنامه از طریق APIهای مسیر فایل مستقیم از جمله جاوا و کد بومی
- دسترسی به برنامه از طریق چارچوب دسترسی به فضای ذخیره سازی (SAF)
- دسترسی به برنامه از طریق برگه اشتراک سیستم عامل Intents. (فقط MediaStore URI)
- انتقال فایل MTP/PTP از گوشی به کامپیوتر
عبور از رمز عبور:
- انتقال فایل از دستگاه با خارج کردن کارت SD
- انتقال فایل ها از دستگاهی به دستگاه دیگر با استفاده از گزینه هایی مانند Nearby Share یا انتقال بلوتوث.
مسیرهای فایل سفارشی شده را برای رمزگذاری اضافه کنید
سازندگان دستگاه می توانند به صورت اختیاری مسیرهای فایل را برای رمزگذاری رسانه در فهرست 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
نمای کلی معماری
این بخش معماری ویژگی transcoding رسانه را توضیح می دهد.
شکل 2. معماری رمزگذاری رسانه.
معماری رمزگذاری رسانه از اجزای زیر تشکیل شده است:
- MediaTranscodingManager system API: رابطی که به مشتری اجازه می دهد با سرویس MediaTranscoding ارتباط برقرار کند. ماژول MediaProvider از این API استفاده می کند.
- MediaTranscodingService: سرویس بومی که ارتباطات مشتری را مدیریت میکند، درخواستهای رمزگذاری را زمانبندی میکند و حسابداری
TranscodingSessions
مدیریت میکند. - MediaTranscoder: کتابخانه بومی که رمزگذاری را انجام می دهد. این کتابخانه در بالای چارچوب رسانه NDK ساخته شده است تا با ماژول ها سازگار باشد.
ویژگی رمزگذاری رسانه سازگار، معیارهای رمزگذاری را در سرویس و رمزگذار رسانه ثبت می کند. سمت سرویس گیرنده و کد سمت سرویس در ماژول MediaProvider قرار دارند تا امکان رفع و به روز رسانی به موقع اشکال را فراهم کنند.
دسترسی به فایل
رمزگذاری رسانه سازگار در بالای سیستم فایل در فضای کاربری (FUSE) ساخته شده است که برای ذخیره سازی محدوده استفاده می شود. FUSE ماژول MediaProvider را قادر میسازد تا عملیات فایل را در فضای کاربر بررسی کند و بر اساس خطمشی اجازه دادن، رد کردن یا ویرایش دسترسی به فایلها را گیت کند.
هنگامی که یک برنامه سعی می کند به یک فایل دسترسی پیدا کند، دیمون FUSE دسترسی خواندن فایل را از برنامه قطع می کند. اگر برنامه از فرمت جدیدتر (مانند HEVC) پشتیبانی می کند، فایل اصلی برگردانده می شود. اگر برنامه از فرمت پشتیبانی نمیکند، فایل به فرمت قدیمیتر (مانند AVC) رمزگذاری میشود یا در صورت موجود بودن نسخه رمزگذاریشده، از حافظه پنهان بازگردانده میشود.
درخواست فایل های رمزگذاری شده
ویژگی رمزگذاری رسانه سازگار بهطور پیشفرض غیرفعال است، به این معنی که اگر دستگاه از HEVC پشتیبانی میکند، Android فایلها را رمزگذاری نمیکند، مگر اینکه توسط برنامهای در فایل مانیفست یا در فهرست رمز عبور اجباری مشخص شده باشد.
برنامهها میتوانند داراییهای رمزگذاریشده را با استفاده از گزینههای زیر درخواست کنند:
- فرمت های پشتیبانی نشده را در فایل مانیفست اعلام کنید. برای جزئیات، به اعلام قابلیت ها در یک منبع و اعلام قابلیت ها در کد مراجعه کنید.
- برنامهها را به فهرست انتقال کد اجباری که در ماژول MediaProvider موجود است اضافه کنید. این رمزگذاری را برای برنامههایی که فایل مانیفست خود را بهروزرسانی نکردهاند، فعال میکند. هنگامی که یک برنامه فایل مانیفست خود را با فرمت های پشتیبانی نشده به روز می کند، باید از لیست رمز عبور اجباری حذف شود. سازندگان دستگاهها میتوانند برنامههای خود را با ارسال یک وصله یا با گزارش یک اشکال ، برای افزودن یا حذف از فهرست رمز عبور اجباری معرفی کنند. تیم Android به صورت دوره ای لیست را بررسی می کند و ممکن است برنامه ها را از لیست حذف کند.
- فرمت های پشتیبانی شده با چارچوب سازگاری برنامه را در زمان اجرا غیرفعال کنید (کاربران همچنین می توانند این را برای هر برنامه در تنظیمات غیرفعال کنند).
- یک فایل را با
MediaStore
باز کنید و در عین حال فرمت های پشتیبانی نشده را با APIopenTypedAssetFileDescriptor
به صراحت مشخص کنید.
برای انتقال USB (دستگاه به رایانه شخصی)، رمزگذاری به طور پیشفرض غیرفعال است، اما کاربران میتوانند با استفاده از کلید «تبدیل ویدیوها به AVC» در صفحه تنظیمات «تنظیمات USB»، رمزگذاری را فعال کنند، همانطور که در شکل 3 نشان داده شده است.
شکل 3. برای فعال کردن رمزگذاری رسانه در صفحه تنظیمات برگزیده USB، آن را تغییر دهید.
محدودیت در درخواست فایل های رمزگذاری شده
برای جلوگیری از قفل کردن منابع سیستم توسط درخواستهای ترانکد برای مدت طولانی، برنامههایی که جلسات رمزگذاری را درخواست میکنند به موارد زیر محدود میشوند:
- 10 جلسه متوالی
- مجموع زمان اجرا سه دقیقه
اگر برنامهای از همه این محدودیتها فراتر رود، چارچوب توصیفگر فایل اصلی را برمیگرداند.
الزامات دستگاه
برای پشتیبانی از ویژگی transcoding رسانه سازگار، دستگاهها باید شرایط زیر را داشته باشند:
- دستگاه دارای رمزگذاری HEVC است که به طور پیش فرض در برنامه دوربین اصلی فعال شده است
- (دستگاه هایی که از کدگذاری HDR به SDR پشتیبانی می کنند) دستگاه از فیلم برداری HDR پشتیبانی می کند
برای اطمینان از عملکرد دستگاه برای رمزگذاری رسانه، سخت افزار ویدئو و عملکرد دسترسی خواندن/نوشتن ذخیره سازی باید بهینه شود. هنگامی که کدک های رسانه با اولویت برابر با 1
پیکربندی می شوند، کدک ها باید در بالاترین توان عملیاتی ممکن کار کنند. ما توصیه می کنیم که عملکرد رمزگذاری حداقل 200 فریم در ثانیه باشد. برای آزمایش عملکرد سخت افزار خود، معیار transcoder رسانه را در frameworks/av/media/libmediatranscoding/transcoder/benchmark
اجرا کنید.
اعتبار سنجی
برای تأیید ویژگی transcoding رسانه سازگار، آزمایشهای CTS زیر را اجرا کنید:
-
android.media.mediatranscoding.cts
-
android.mediaprovidertranscode.cts
رمزگذاری رسانه را در سطح جهانی فعال کنید
برای آزمایش چارچوب رمزگذاری رسانه یا رفتار برنامه با رمزگذاری، میتوانید ویژگی رمزگذاری رسانه سازگار را در سطح جهانی فعال یا غیرفعال کنید. در صفحه تنظیمات > سیستم > برنامهنویس > گزینههای برنامهنویس ترانکدسازی رسانه ، گزینه Override transcoding پیشفرض را روی روشن قرار دهید و سپس گزینه Enable transcoding را روی روشن یا خاموش تنظیم کنید. اگر این تنظیم فعال باشد، رمزگذاری رسانه ممکن است در پسزمینه برنامههایی غیر از برنامهای که در حال توسعه آن هستید، رخ دهد.
وضعیت رمزگذاری را بررسی کنید
در طول آزمایش، می توانید از دستور پوسته 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 (فقط توسط 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 و رابط HAL android.hardware.media.c2
در android::hardware::media::c2
ارائه میکند. برای پلاگین های فیلتر، AOSP شامل یک مکانیسم پوششی است که رمزگشاها را با پلاگین های فیلتر کنار هم قرار می دهد. MediaCodec
این اجزای پیچیده را به عنوان رمزگشا با ویژگی های فیلتر می شناسد.
نمای کلی
کلاس FilterWrapper
کدک های فروشنده را می گیرد و کدک های پیچیده شده را به لایه انطباق media.c2
برمی گرداند. کلاس FilterWrapper
libc2filterplugin.so
را از طریق FilterWrapper::Plugin
API بارگیری می کند و فیلترهای موجود را از افزونه ضبط می کند. در هنگام ایجاد، FilterWrapper
تمام فیلترهای موجود را نمونه سازی می کند. فقط فیلترهایی که بافر را تغییر می دهند در ابتدا شروع می شوند.
شکل 1. معماری پلاگین فیلتر.
رابط پلاگین فیلتر
رابط FilterPlugin.h
API های زیر را برای نمایش فیلترها تعریف می کند:
std::shared_ptr<C2ComponentStore>getComponentStore()
یک شی
C2ComponentStore
را که حاوی فیلتر است برمیگرداند. این جدا از آن چیزی است که پیاده سازی Codec 2.0 فروشنده نشان می دهد. به طور معمول، این فروشگاه فقط حاوی فیلترهای استفاده شده توسط کلاس teFilterWrapper
است.bool describe(C2String name, Descriptor *desc)
فیلترها را علاوه بر آنچه در
C2ComponentStore
موجود است، توضیح میدهد. توضیحات زیر تعریف شده است:-
controlParam
: پارامترهایی که رفتار فیلترها را کنترل می کنند. به عنوان مثال، برای HDR به SDR Tone-mapper، پارامتر کنترل تابع انتقال هدف است. -
affectedParams
: پارامترهایی که تحت تأثیر عملیات فیلتر قرار می گیرند. به عنوان مثال، برای HDR به SDR Tone-mapper، پارامترهای تحت تأثیر جنبه های رنگی هستند.
-
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)
اگر مؤلفه فیلتر بافر را تغییر دهد،
true
را برمیگرداند. به عنوان مثال، اگر تابع انتقال هدف SDR و تابع انتقال ورودی HDR (HLG یا PQ) باشد، فیلتر نگاشت آهنگtrue
را برمیگرداند.
جزئیات FilterWrapper
این بخش جزئیات کلاس FilterWrapper
را توضیح می دهد.
خلقت
جزء پیچیده شده رمزگشای زیرین و تمام فیلترهای تعریف شده را در هنگام ایجاد نمونه می کند.
پرس و جو و پیکربندی
کامپوننت پیچیده شده، پارامترهای ورودی را از کوئری ها یا درخواست های پیکربندی با توجه به توضیحات فیلتر جدا می کند. به عنوان مثال، پیکربندی پارامتر کنترل فیلتر به فیلتر مربوطه هدایت می شود و پارامترهای تحت تأثیر فیلترها در جستارها وجود دارد (به جای خواندن از رمزگشایی که پارامترهای بدون تأثیر دارد).
شکل 2. پرس و جو و پیکربندی.
شروع کنید
در شروع، جزء پیچیده شده، رمزگشا و تمام فیلترهایی را که بافرها را تغییر می دهند، راه اندازی می کند. اگر هیچ فیلتری فعال نباشد، جزء پیچیده شده رمزگشا و بافرهای عبوری را راه اندازی می کند و دستوراتی را به خود رمزگشا ارسال می کند.
مدیریت بافر
شکل 3. مدیریت بافر.
بافرهایی که در صف رمزگشای پیچیده قرار می گیرند به رمزگشای زیرین می روند. مؤلفه پیچیده شده، بافر خروجی را از رمزگشا از طریق یک پاسخ تماس onWorkDone_nb()
می گیرد و سپس آن را در صف فیلترها قرار می دهد. بافر خروجی نهایی از آخرین فیلتر به مشتری گزارش می شود.
برای اینکه این مدیریت بافر کار کند، مؤلفه پیچیده باید C2PortBlockPoolsTuning
به آخرین فیلتر پیکربندی کند تا خروجی چارچوب از مخزن بلوک مورد انتظار بافر شود.
توقف، تنظیم مجدد و رها کردن
در حالت توقف، مولفه پیچیده شده رمزگشا و تمام فیلترهای فعالی که راه اندازی شده اند را متوقف می کند. هنگام بازنشانی و رهاسازی، همه مؤلفهها بدون توجه به فعال بودن یا نبودن، بازنشانی یا آزاد میشوند.
پلاگین فیلتر نمونه را پیاده سازی کنید
برای فعال کردن افزونه، موارد زیر را انجام دهید:
- رابط
FilterPlugin
را در یک کتابخانه پیاده کنید و آن را در/vendor/lib[64]/libc2filterplugin.so.
- در صورت نیاز مجوزهای اضافی را به
mediacodec.te
اضافه کنید. - لایه سازگاری را به اندروید 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