اندروید 12 ویژگی جدیدی را ارائه می دهد که به برنامه های ضبط ویدئو اجازه می دهد تا از رمزگذاری مدرن تر و کم مصرف برای فیلم های ضبط شده در دستگاه استفاده کنند بدون اینکه سازگاری با برنامه های دیگر را از بین ببرد.
هنگام باز شدن فیلم ها توسط برنامه ای که از HEVC پشتیبانی نمی کند، Android می تواند فیلم های ضبط شده در قالب هایی مانند HEVC (H.265) را به AVC (H.264) تبدیل کند.
قالب های زیر را می توان به صورت خودکار برای محتوایی که در دستگاه ایجاد شده کد گذاری کرد:
MediaFormat mime type | XML Attribute | Media format |
MediaFormat.MIMETYPE_VIDEO_HEVC | HEVC | HEVC (H.265) |
MediaFeature.HdrType.HDR10 | HDR10 | HDR10 |
MediaFeature.HdrType.HDR10_PLUS | HDR10Plus | HDR10+ |
نکته قابل توجه این است که Android فرض می کند که برنامه ها می توانند از پخش همه قالب های رسانه پشتیبانی کنند، بنابراین رمزگذاری رسانه سازگار به طور پیش فرض خاموش است.
زمان استفاده از کدگذاری
کد گذاری یک عملیات محاسباتی سنگین است و هنگام باز کردن یک فایل ویدئویی تأخیر قابل توجهی ایجاد می کند. به عنوان مثال، یک کد ویدیوی HEVC یک دقیقه ای تقریباً 20 ثانیه طول می کشد تا در تلفن Pixel 3 به AVC تبدیل شود. به همین دلیل، باید فقط وقتی فایل ویدئویی را به دستگاه ارسال می کنید کدگذاری کنید. به عنوان مثال، هنگام به اشتراک گذاشتن یک فایل ویدیویی با سایر کاربران همان برنامه، یا یک سرور ابری که از قالب های ویدیویی مدرن پشتیبانی نمی کند.
هنگام باز کردن پرونده های ویدئویی برای پخش روی دستگاه یا ایجاد تصاویر کوچک، کد خود را وارد نکنید.
پیکربندی رمزگذاری
برنامه ها با اعلام قابلیت های رسانه ای خود می توانند رفتار رمزگذاری آنها را کنترل کنند. برای اعلام این قابلیت ها دو روش وجود دارد: در کد، یا در یک منبع.
- قابلیت ها را به صورت کد اعلام کنید
می توانید با ساخت نمونه ای از یک شی ApplicationMediaCapunities با استفاده از سازنده، قابلیت های رسانه را در کد اعلام کنید:
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build();
هنگام دسترسی به محتوای رسانه از طریق روش هایی مانند ContentResolver # openTypedAssetFileDescriptor() از این شی استفاده کنید:
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
این روش امکان کنترل دقیق برای مسیرهای کد خاص را فراهم می کند، مانند فراخوانی کدگذاری فقط هنگام انتقال فایل ویدیویی از دستگاه این روش نسبت به روش توصیف شده در زیر اولویت دارد.
- قابلیت ها را در یک منبع اعلام کنید
اعلام قابلیت ها در یک منبع امکان کنترل blanket بر کدگذاری را فراهم می کند. این روش فقط باید در موارد بسیار خاص مورد استفاده قرار گیرد. به عنوان مثال، اگر برنامه شما فقط پرونده های ویدیویی را از برنامه های دیگر دریافت می کند (به جای اینکه مستقیماً آنها را باز کنید) و آنها را در سروری بارگذاری می کند که از رمزگذارهای ویدئویی مدرن پشتیبانی نمی کند (به سناریو 1 زیر مراجعه کنید).
استفاده از این روش در صورت عدم ضرورت ممکن است کدگذاری را در سناریوهای ناخواسته، مانند هنگام کوچک کردن ویدیوها در فیلم ها و resulting in a degraded user experience، فراخوانی کند.
برای استفاده از این روش، یک فایل منبع media_capunities.xml ایجاد کنید:
<?xml version="1.0" encoding="utf-8"?> <media-capabilities xmlns:android="http://schemas.android.com/apk/res/android"> <format android:name="HEVC" supported="true"/> <format android:name="HDR10" supported="false"/> <format android:name="HDR10Plus" supported="false"/> </media-capabilities>
در این مثال، فیلم های HDR ضبط شده در دستگاه به صورت یکپارچه به فیلم AVC SDR (دامنه پویای استاندارد) تبدیل می شوند، در حالی که فیلم های HEVC اینگونه نیستند.
برای افزودن مرجعی به پرونده قابلیت های رسانه، از برچسب ویژگی در برچسب برنامه استفاده کنید. این خصوصیات را به پرونده AndroidManifest.xml خود اضافه کنید:
<property android:name="android.media.PROPERTY_MEDIA_CAPABILITIES" android:resource="@xml/media_capabilities" />
استفاده از قابلیت های رسانه ای برنامه دیگری برای باز کردن یک فایل ویدیویی
اگر برنامه شما یک فایل ویدیویی را با برنامه دیگری به اشتراک می گذارد، ممکن است لازم باشد فایل ویدیویی قبل از باز کردن برنامه دریافت کننده، کدگذاری شود.
با باز کردن یک فایل ویدیویی با استفاده از openTypedAssetFileDescriptor و مشخص کردن UID برنامه دریافت کننده، می توانید این پرونده را مدیریت کنید که با استفاده از Binder.getCallingUid قابل دستیابی است. سپس این پلت فرم از قابلیت های رسانه ای برنامه دریافت کننده برای تعیین اینکه آیا فایل ویدئویی باید کدگذاری شود استفاده می کند.
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on the media capabilities of the // calling app.
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on the media capabilities of the // calling app. }
نمونه سناریوها
نمودارهای زیر دو مورد استفاده معمول را نشان می دهد. در هر دو مورد، فیلم اصلی در قالب HEVC ذخیره می شود و برنامه اشتراک ویدیو از HEVC پشتیبانی نمی کند.
مثال 1. کدگذاری توسط برنامه ضبط ویدئو آغاز می شود.
برنامه اشتراک ویدیو اعلام می کند که از HEVC در فایل منبع قابلیت های رسانه خود پشتیبانی نمی کند. سپس از برنامه ضبط فیلم درخواست فیلم می کند. برنامه ضبط ویدئو درخواست را اداره می کند و پرونده را با استفاده از UID برنامه اشتراک گذاری با استفاده از openTypedAssetFileDescriptor باز می کند. این فرآیند کدگذاری را آغاز می کند. هنگامی که فیلم رمزگذاری شده دریافت می شود، به برنامه اشتراک گذاری ارائه می شود که آن را در یک سرور در cloud بارگذاری می کند.
مثال 2. کدگذاری توسط برنامه اشتراک ویدیو آغاز می شود.
برنامه ضبط ویدئو با استفاده از یک URI MediaStore یک فیلم را با برنامه اشتراک ویدیو به اشتراک می گذارد. برنامه اشتراک ویدیو با استفاده از openTypedAssetFileDescriptor فایل ویدئو را باز می کند، مشخص می کند که از HEVC در قابلیت رسانه خود پشتیبانی نمی کند. با این کار فرآیند کدگذاری آغاز می شود و پس از تکمیل، پرونده در یک سرور در cloud بارگذاری می شود.
قالب های اعلام نشده
رمزگذاری رسانه سازگار برای همه قالب هایی که غیر پشتیبانی اعلام می شوند فعال است و برای همه قالب هایی که دارای پشتیبانی اعلام می شوند غیرفعال است. برای فرمت های دیگر که اعلام نشده اند، سیستم عامل تصمیم می گیرد که کدگذاری کند یا خیر. در آندروید 12 کدگذاری برای همه قالب های اعلام نشده غیرفعال است. این رفتار ممکن است در آینده برای قالب های جدید تغییر کند.
گزینه های توسعه دهنده
برای نادیده گرفتن رفتار رمزگذاری پیش فرض Android ، می توانید از گزینه های توسعه دهنده زیر استفاده کنید:
- لغو پیش فرض های کدگذاری این تنظیم تعیین می کند که آیا سیستم عامل کدگذاری خودکار را کنترل می کند یا نه. هنگامی که override فعال است، پیش فرض های سیستم عامل نادیده گرفته می شوند و تنظیمات transcoding فعال کردن کدگذاری خودکار را کنترل می کند. این گزینه به طور پیش فرض غیر فعال است.
- فعال کردن کدگذاری این تنظیم مشخص می کند که قالب های اعلام نشده به طور خودکار کدگذاری می شوند یا نه.، اما فقط درصورتی تأثیرگذار است که پیش فرض های کدگذاری لغو نیز فعال باشد.
- تصور کنید که برنامه ها از قالب های مدرن پشتیبانی می کنند این تنظیم کنترل می کند چه اتفاقی می افتد هنگامی که برنامه سعی می کند یک قالب اعلام نشده را پخش کند. این زمانی اتفاق می افتد که manifest اعلام نکند که آیا این برنامه از یک قالب خاص پشتیبانی می کند یا خیر، یا Google برنامه را به لیست کد انتقال نیرو سمت سرور اضافه نکرده است. وقتی تنظیم فعال است، برنامه کدگذاری نمی کند، وقتی غیرفعال است، برنامه کدگذاری می کند. این گزینه به طور پیش فرض فعال است.
- نمایش اعلان های رمزگذاری هنگامی که فعال است، برنامه هنگام انتقال رمزگذاری با خواندن یک پرونده رسانه پشتیبانی نشده ، یک اعلان پیشرفت کدگذاری را نمایش می دهد. این گزینه به طور پیش فرض فعال است.
- غیرفعال کردن حافظه پنهان رمزگذاری اگر فعال باشد، برنامه هایی که به کدگذاری نیاز دارند از حافظه پنهان رمزگذاری استفاده نمی کنند. این می تواند در طول توسعه مفید باشد تا به راحتی کدگذاری روی یک پرونده رسانه پشتیبانی نشده را آغاز کند، اما می تواند عملکرد ضعیف دستگاه را ایجاد کند. این گزینه به طور پیش فرض غیر فعال است.