کد گذاری رسانه سازگار در اندروید

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

دیدگاه‌ها و پرسش‌ها

برای ارسال نظر نیاز است تا ابتدا وارد سایت شوید.

هیچ نظری ارسال نشده است.

قیمت آموزش
رایگان
نوع دسترسی
رایگان

این مقاله در حال حاضر تنها به روش رایگان در دسترس می باشد.

golaleh hoseini
مدرس دوره

golaleh hoseini

مدرس دوره های سِون کلونر

گفتگوی برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن

مقالات پیشنهادی

پی اچ پی - PHP

با استفاده از این زبان می توان وب سایت های پویا طراحی کرد, این زبان می تواند با HTML ادغام شود, در حقیقت یک زبان اسکریپتی متن باز و رایگان است. یعنی زمانی که سرور درخواست ...


۹۶۶
۰
۱۳ آذر ۱۳۹۹

نود جی اس

توسعه دهندگان نود جی اس, زبان جاوا اسکریپت را از یک زبان قابل اجرا در مرورگر خارج کرده و به زبانی تبدیل کردن که بتوان آن را بصورت یه اپلیکیشن مستفل اجرا کرد و ...


۹۴۰
۰
۱۲ آذر ۱۳۹۹

بک لینک چیست؟

بک لینک (Back Link) به لینک دادن یک سایت به سایت دیگر گفته میشود که یک فاکتور مهم و اساسی در سئو هر سایتی می باشد.


۱۰۱۱
۰
۲۲ آذر ۱۳۹۹

جاوا اسکریپت

جاوا اسکریپت یک زبان پویا و محبوب مبتنی بر شیء, داینامیک و مفسری می باشد. این زبان برای برنامه نویسی سمت سرور و کلاینت استفاده میشود که ...


۸۸۶
۰
۱۳ آذر ۱۳۹۹