برنامه نمایشی ExoPlayer

نسخه آزمایشی اصلی ExoPlayer دو هدف اصلی را دنبال می‌کند:

  1. برای ارائه یک مثال نسبتاً ساده اما کاملاً کاربردی از کاربرد ExoPlayer. این برنامه آزمایشی می‌تواند به عنوان یک نقطه شروع مناسب برای توسعه برنامه خودتان مورد استفاده قرار گیرد.
  2. برای اینکه استفاده از ExoPlayer آسان شود، می‌توانید از برنامه آزمایشی علاوه بر نمونه‌های موجود، برای آزمایش پخش محتوای خودتان نیز استفاده کنید.

این صفحه نحوه دریافت، کامپایل و اجرای برنامه آزمایشی را شرح می‌دهد. همچنین نحوه استفاده از آن برای پخش فایل‌های رسانه‌ای خودتان را شرح می‌دهد.

گرفتن کد

کد منبع برنامه اصلی دمو را می‌توانید در پوشه demos/main پروژه گیت‌هاب ما پیدا کنید. اگر قبلاً این کار را نکرده‌اید، پروژه را در یک دایرکتوری محلی کپی کنید:

git clone https://github.com/androidx/media.git

سپس، پروژه را در اندروید استودیو باز کنید. باید موارد زیر را در نمای پروژه اندروید مشاهده کنید (پوشه‌های مربوطه در برنامه آزمایشی گسترش یافته‌اند):

پروژه در اندروید استودیو

کامپایل و اجرا

برای کامپایل و اجرای برنامه آزمایشی، پیکربندی demo را در اندروید استودیو انتخاب و اجرا کنید. برنامه آزمایشی روی یک دستگاه اندروید متصل نصب و اجرا خواهد شد. در صورت امکان، استفاده از یک دستگاه فیزیکی را توصیه می‌کنیم. اگر مایل به استفاده از یک شبیه‌ساز هستید، لطفاً بخش شبیه‌سازها را در دستگاه‌های پشتیبانی‌شده مطالعه کنید و مطمئن شوید که دستگاه مجازی شما از یک تصویر سیستم با سطح API حداقل ۲۳ استفاده می‌کند.

SampleChooserActivity و PlayerActivity

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

adb logcat EventLogger:V *:E

فعال کردن رمزگشاهای همراه

ExoPlayer تعدادی افزونه دارد که امکان استفاده از رمزگشاهای نرم‌افزاری همراه، از جمله AV1، VP9، Opus، FLAC و FFmpeg (فقط صدا) را فراهم می‌کند. برنامه آزمایشی را می‌توان طوری ساخت که این افزونه‌ها را به شرح زیر در خود جای دهد و از آنها استفاده کند:

  1. هر یک از افزونه‌هایی را که می‌خواهید اضافه کنید، بسازید. توجه داشته باشید که این یک فرآیند دستی است. برای دستورالعمل‌ها به فایل README.md در هر افزونه مراجعه کنید.
  2. در نمای Build Variants اندروید استودیو، گزینه build variant برای ماژول دمو را مطابق تصویر زیر روی withDecoderExtensionsDebug یا withDecoderExtensionsRelease تنظیم کنید.

    انتخاب نسخه آزمایشی `withDecoderExtensionsDebug` برای ساخت نسخه آزمایشی

  3. پیکربندی demo را به صورت عادی کامپایل، نصب و اجرا کنید.

به طور پیش‌فرض، یک دیکدر داخلی فقط در صورتی استفاده می‌شود که دیکدر پلتفرم مناسبی وجود نداشته باشد. می‌توان مشخص کرد که دیکدرهای داخلی ترجیح داده شوند، همانطور که در بخش‌های بعدی توضیح داده شده است.

پخش محتوای خودتان

روش‌های مختلفی برای پخش محتوای خودتان در برنامه آزمایشی وجود دارد.

۱. ویرایش assets/media.exolist.json

نمونه‌های فهرست‌شده در برنامه‌ی آزمایشی از assets/media.exolist.json بارگذاری می‌شوند. با ویرایش این فایل JSON، می‌توان نمونه‌ها را از برنامه‌ی آزمایشی اضافه و حذف کرد. طرح کلی به شرح زیر است، که در آن [O] نشان دهنده‌ی یک ویژگی اختیاری است.

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of sample",
        "uri": "The URI of the sample",
        "extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8",
        "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
        "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
        "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
        "drm_license_uri": "[O] URI of the license server if protected",
        "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
        "drm_key_request_properties": "[O] Key request headers if protected",
        "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
        "drm_multi_session": "[O] Enables key rotation if protected",
        "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
        "subtitle_uri": "[O] The URI of a subtitle sidecar file",
        "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
        "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
        "ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
      },
      ...etc
    ]
  },
  ...etc
]

لیست‌های پخش نمونه‌ها را می‌توان با استفاده از طرحواره مشخص کرد:

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of playlist sample",
        "playlist": [
          {
            "uri": "The URI of the first sample in the playlist",
            "extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8"
            "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
            "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
            "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
            "drm_license_uri": "[O] URI of the license server if protected",
            "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
            "drm_key_request_properties": "[O] Key request headers if protected",
            "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
            "drm_multi_session": "[O] Enables key rotation if protected",
            "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
            "subtitle_uri": "[O] The URI of a subtitle sidecar file",
            "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
            "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
          },
          {
            "uri": "The URI of the second sample in the playlist",
            ...etc
          },
          ...etc
        ]
      },
      ...etc
    ]
  },
  ...etc
]

در صورت لزوم، سرآیندهای درخواست کلید به عنوان یک شیء حاوی یک ویژگی رشته‌ای برای هر سرآیند مشخص می‌شوند:

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

در فعالیت انتخابگر نمونه، منوی سرریز شامل گزینه‌هایی برای تعیین ترجیح رمزگشاهای افزونه است.

آدرس‌های فایل محلی و محدودیت‌های ذخیره‌سازی محدود

هنگام مشخص کردن URI های فایل محلی، برنامه آزمایشی مجوزهای دسترسی لازم به فضای ذخیره‌سازی را برای خواندن این فایل‌ها درخواست می‌کند. با این حال، از اندروید ۱۳، بارگیری فایل‌های دلخواه که به یک پسوند فایل رسانه‌ای معمولی (مانند .mp4 ) ختم نمی‌شوند، امکان‌پذیر نیست. اگر نیاز به بارگیری چنین فایلی دارید، می‌توانید آن را در دایرکتوری ذخیره‌سازی خاص برنامه آزمایشی که هیچ محدودیت دسترسی ندارد، قرار دهید. این دایرکتوری معمولاً در /sdcard/Android/data/androidx.media3.demo.main/files قرار دارد.

۲. بارگذاری یک فایل exolist.json خارجی

برنامه آزمایشی می‌تواند فایل‌های JSON خارجی را با استفاده از طرحواره بالا و نامگذاری شده طبق قرارداد *.exolist.json بارگذاری کند. برای مثال، اگر چنین فایلی را در https://yourdomain.com/samples.exolist.json میزبانی می‌کنید، می‌توانید آن را در برنامه آزمایشی با استفاده از دستور زیر باز کنید:

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

کلیک روی لینک *.exolist.json (مثلاً در مرورگر یا یک سرویس ایمیل) در دستگاهی که برنامه آزمایشی روی آن نصب شده است، آن را در برنامه آزمایشی نیز باز می‌کند. از این رو، میزبانی یک فایل JSON *.exolist.json راهی ساده برای توزیع محتوا برای دیگران جهت امتحان کردن در برنامه آزمایشی فراهم می‌کند.

۳. شلیک یک هدف

می‌توان از اینتنت‌ها برای دور زدن لیست نمونه‌ها و اجرای مستقیم در پخش استفاده کرد. برای پخش یک نمونه، اکشن اینتنت را روی androidx.media3.demo.main.action.VIEW و URI داده آن را روی نمونه‌ای که قرار است پخش شود تنظیم کنید. چنین اینتنتی را می‌توان با استفاده از دستور زیر از ترمینال اجرا کرد:

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

موارد اختیاری پشتیبانی شده برای یک نمونه هدف واحد عبارتند از:

  • نمونه تنظیمات اضافی:
    • mime_type [رشته] نمونه‌ای از نوع MIME. برای مثال application/dash+xml برای محتوای DASH.
    • clip_start_position_ms [طولانی] نقطه شروعی که نمونه باید به آن برش داده شود، بر حسب میلی‌ثانیه.
    • clip_end_position_ms [طولانی] نقطه پایانی که نمونه باید از آن بریده شود، بر حسب میلی‌ثانیه.
    • drm_scheme [رشته] طرح DRM در صورت محافظت. مقادیر معتبر widevine ، playready و clearkey هستند. شناسه‌های کاربری طرح DRM نیز پذیرفته می‌شوند.
    • drm_license_uri [رشته] آدرس اینترنتی سرور مجوز، در صورت محافظت.
    • drm_force_default_license_uri [بولی] آیا استفاده از drm_license_uri برای درخواست‌های کلیدی که شامل URL مجوز خود هستند، اجباری شود.
    • drm_key_request_properties [آرایه رشته‌ای] هدرهای درخواست کلید در صورت محافظت به صورت name1، value1، name2، value2 و غیره بسته‌بندی می‌شوند.
    • drm_session_for_clear_content [بولی] آیا یک جلسه DRM برای پاک کردن آهنگ‌های ویدیویی و صوتی پیوست شود یا خیر.
    • drm_multi_session [بولی] چرخش کلید را در صورت محافظت فعال می‌کند.
    • subtitle_uri [رشته] آدرس اینترنتی (URI) فایل زیرنویس کناری.
    • subtitle_mime_type [رشته] نوع MIME مربوط به subtitle_uri (در صورت تنظیم subtitle_uri الزامی است).
    • subtitle_language [رشته] کد زبان BCP47 فایل زیرنویس (در صورت عدم تنظیم subtitle_uri نادیده گرفته می‌شود).
    • ad_tag_uri [رشته] آدرس اینترنتی (URI) یک تگ تبلیغ که با استفاده از [پسوند IMA][] بارگذاری می‌شود.
    • prefer_extension_decoders [بولی] اینکه آیا رمزگشاهای افزونه نسبت به رمزگشاهای پلتفرم ترجیح داده می‌شوند یا خیر.

هنگام استفاده از adb shell am start برای اجرای یک intent، یک رشته اضافی اختیاری را می‌توان با --es تنظیم کرد (مثلاً --es extension mpd ). یک رشته اضافی اختیاری بولی را می‌توان با --ez تنظیم کرد (مثلاً --ez prefer_extension_decoders TRUE ). یک رشته اضافی اختیاری طولانی را می‌توان با --el تنظیم کرد (مثلاً --el clip_start_position_ms 5000 ). یک آرایه رشته‌ای اختیاری اضافی را می‌توان با --esa تنظیم کرد (مثلاً --esa drm_key_request_properties name1,value1 ).

برای پخش یک لیست پخش از نمونه‌ها، اکشن اینتنت را روی androidx.media3.demo.main.action.VIEW_LIST تنظیم کنید. موارد اضافی پیکربندی نمونه مانند androidx.media3.demo.main.action.VIEW باقی می‌مانند، به جز دو تفاوت:

  • کلیدهای موارد اضافی باید دارای زیرخط و اندیس نمونه مبتنی بر 0 به عنوان پسوند باشند. برای مثال، extension_0 نوع نمونه را برای نمونه اول مشخص می‌کند. drm_scheme_1 طرح DRM را برای نمونه دوم تنظیم می‌کند.
  • uri نمونه به عنوان یک مقدار اضافی با کلید uri_<sample-index> ارسال می‌شود.

سایر موارد اضافی که وابسته به نمونه نیستند، تغییر نمی‌کنند. برای مثال، می‌توانید دستور زیر را در ترمینال اجرا کنید تا یک لیست پخش با دو آیتم را پخش کنید و پسوند آیتم دوم را نادیده بگیرید:

adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
    --es uri_0 https://a.com/sample1.mp4 \
    --es uri_1 https://b.com/sample2.fake_mpd \
    --es extension_1 mpd
،

نسخه آزمایشی اصلی ExoPlayer دو هدف اصلی را دنبال می‌کند:

  1. برای ارائه یک مثال نسبتاً ساده اما کاملاً کاربردی از کاربرد ExoPlayer. این برنامه آزمایشی می‌تواند به عنوان یک نقطه شروع مناسب برای توسعه برنامه خودتان مورد استفاده قرار گیرد.
  2. برای اینکه استفاده از ExoPlayer آسان شود، می‌توانید از برنامه آزمایشی علاوه بر نمونه‌های موجود، برای آزمایش پخش محتوای خودتان نیز استفاده کنید.

این صفحه نحوه دریافت، کامپایل و اجرای برنامه آزمایشی را شرح می‌دهد. همچنین نحوه استفاده از آن برای پخش فایل‌های رسانه‌ای خودتان را شرح می‌دهد.

گرفتن کد

کد منبع برنامه اصلی دمو را می‌توانید در پوشه demos/main پروژه گیت‌هاب ما پیدا کنید. اگر قبلاً این کار را نکرده‌اید، پروژه را در یک دایرکتوری محلی کپی کنید:

git clone https://github.com/androidx/media.git

سپس، پروژه را در اندروید استودیو باز کنید. باید موارد زیر را در نمای پروژه اندروید مشاهده کنید (پوشه‌های مربوطه در برنامه آزمایشی گسترش یافته‌اند):

پروژه در اندروید استودیو

کامپایل و اجرا

برای کامپایل و اجرای برنامه آزمایشی، پیکربندی demo را در اندروید استودیو انتخاب و اجرا کنید. برنامه آزمایشی روی یک دستگاه اندروید متصل نصب و اجرا خواهد شد. در صورت امکان، استفاده از یک دستگاه فیزیکی را توصیه می‌کنیم. اگر مایل به استفاده از یک شبیه‌ساز هستید، لطفاً بخش شبیه‌سازها را در دستگاه‌های پشتیبانی‌شده مطالعه کنید و مطمئن شوید که دستگاه مجازی شما از یک تصویر سیستم با سطح API حداقل ۲۳ استفاده می‌کند.

SampleChooserActivity و PlayerActivity

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

adb logcat EventLogger:V *:E

فعال کردن رمزگشاهای همراه

ExoPlayer تعدادی افزونه دارد که امکان استفاده از رمزگشاهای نرم‌افزاری همراه، از جمله AV1، VP9، Opus، FLAC و FFmpeg (فقط صدا) را فراهم می‌کند. برنامه آزمایشی را می‌توان طوری ساخت که این افزونه‌ها را به شرح زیر در خود جای دهد و از آنها استفاده کند:

  1. هر یک از افزونه‌هایی را که می‌خواهید اضافه کنید، بسازید. توجه داشته باشید که این یک فرآیند دستی است. برای دستورالعمل‌ها به فایل README.md در هر افزونه مراجعه کنید.
  2. در نمای Build Variants اندروید استودیو، گزینه build variant برای ماژول دمو را مطابق تصویر زیر روی withDecoderExtensionsDebug یا withDecoderExtensionsRelease تنظیم کنید.

    انتخاب نسخه آزمایشی `withDecoderExtensionsDebug` برای ساخت نسخه آزمایشی

  3. پیکربندی demo را به صورت عادی کامپایل، نصب و اجرا کنید.

به طور پیش‌فرض، یک دیکدر داخلی فقط در صورتی استفاده می‌شود که دیکدر پلتفرم مناسبی وجود نداشته باشد. می‌توان مشخص کرد که دیکدرهای داخلی ترجیح داده شوند، همانطور که در بخش‌های بعدی توضیح داده شده است.

پخش محتوای خودتان

روش‌های مختلفی برای پخش محتوای خودتان در برنامه آزمایشی وجود دارد.

۱. ویرایش assets/media.exolist.json

نمونه‌های فهرست‌شده در برنامه‌ی آزمایشی از assets/media.exolist.json بارگذاری می‌شوند. با ویرایش این فایل JSON، می‌توان نمونه‌ها را از برنامه‌ی آزمایشی اضافه و حذف کرد. طرح کلی به شرح زیر است، که در آن [O] نشان دهنده‌ی یک ویژگی اختیاری است.

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of sample",
        "uri": "The URI of the sample",
        "extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8",
        "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
        "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
        "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
        "drm_license_uri": "[O] URI of the license server if protected",
        "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
        "drm_key_request_properties": "[O] Key request headers if protected",
        "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
        "drm_multi_session": "[O] Enables key rotation if protected",
        "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
        "subtitle_uri": "[O] The URI of a subtitle sidecar file",
        "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
        "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
        "ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
      },
      ...etc
    ]
  },
  ...etc
]

لیست‌های پخش نمونه‌ها را می‌توان با استفاده از طرحواره مشخص کرد:

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of playlist sample",
        "playlist": [
          {
            "uri": "The URI of the first sample in the playlist",
            "extension": "[O] Sample type hint. Cannot be combined with mime_type. Values: mpd, ism, m3u8"
            "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
            "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
            "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
            "drm_license_uri": "[O] URI of the license server if protected",
            "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
            "drm_key_request_properties": "[O] Key request headers if protected",
            "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
            "drm_multi_session": "[O] Enables key rotation if protected",
            "mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
            "subtitle_uri": "[O] The URI of a subtitle sidecar file",
            "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
            "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
          },
          {
            "uri": "The URI of the second sample in the playlist",
            ...etc
          },
          ...etc
        ]
      },
      ...etc
    ]
  },
  ...etc
]

در صورت لزوم، سرآیندهای درخواست کلید به عنوان یک شیء حاوی یک ویژگی رشته‌ای برای هر سرآیند مشخص می‌شوند:

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

در فعالیت انتخابگر نمونه، منوی سرریز شامل گزینه‌هایی برای تعیین ترجیح رمزگشاهای افزونه است.

آدرس‌های فایل محلی و محدودیت‌های ذخیره‌سازی محدود

هنگام مشخص کردن URI های فایل محلی، برنامه آزمایشی مجوزهای دسترسی لازم به فضای ذخیره‌سازی را برای خواندن این فایل‌ها درخواست می‌کند. با این حال، از اندروید ۱۳، بارگیری فایل‌های دلخواه که به یک پسوند فایل رسانه‌ای معمولی (مانند .mp4 ) ختم نمی‌شوند، امکان‌پذیر نیست. اگر نیاز به بارگیری چنین فایلی دارید، می‌توانید آن را در دایرکتوری ذخیره‌سازی خاص برنامه آزمایشی که هیچ محدودیت دسترسی ندارد، قرار دهید. این دایرکتوری معمولاً در /sdcard/Android/data/androidx.media3.demo.main/files قرار دارد.

۲. بارگذاری یک فایل exolist.json خارجی

برنامه آزمایشی می‌تواند فایل‌های JSON خارجی را با استفاده از طرحواره بالا و نامگذاری شده طبق قرارداد *.exolist.json بارگذاری کند. برای مثال، اگر چنین فایلی را در https://yourdomain.com/samples.exolist.json میزبانی می‌کنید، می‌توانید آن را در برنامه آزمایشی با استفاده از دستور زیر باز کنید:

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

کلیک روی لینک *.exolist.json (مثلاً در مرورگر یا یک سرویس ایمیل) در دستگاهی که برنامه آزمایشی روی آن نصب شده است، آن را در برنامه آزمایشی نیز باز می‌کند. از این رو، میزبانی یک فایل JSON *.exolist.json راهی ساده برای توزیع محتوا برای دیگران جهت امتحان کردن در برنامه آزمایشی فراهم می‌کند.

۳. شلیک یک هدف

می‌توان از اینتنت‌ها برای دور زدن لیست نمونه‌ها و اجرای مستقیم در پخش استفاده کرد. برای پخش یک نمونه، اکشن اینتنت را روی androidx.media3.demo.main.action.VIEW و URI داده آن را روی نمونه‌ای که قرار است پخش شود تنظیم کنید. چنین اینتنتی را می‌توان با استفاده از دستور زیر از ترمینال اجرا کرد:

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

موارد اختیاری پشتیبانی شده برای یک نمونه هدف واحد عبارتند از:

  • نمونه تنظیمات اضافی:
    • mime_type [رشته] نمونه‌ای از نوع MIME. برای مثال application/dash+xml برای محتوای DASH.
    • clip_start_position_ms [طولانی] نقطه شروعی که نمونه باید به آن برش داده شود، بر حسب میلی‌ثانیه.
    • clip_end_position_ms [طولانی] نقطه پایانی که نمونه باید از آن بریده شود، بر حسب میلی‌ثانیه.
    • drm_scheme [رشته] طرح DRM در صورت محافظت. مقادیر معتبر widevine ، playready و clearkey هستند. شناسه‌های کاربری طرح DRM نیز پذیرفته می‌شوند.
    • drm_license_uri [رشته] آدرس اینترنتی سرور مجوز، در صورت محافظت.
    • drm_force_default_license_uri [بولی] آیا استفاده از drm_license_uri برای درخواست‌های کلیدی که شامل URL مجوز خود هستند، اجباری شود.
    • drm_key_request_properties [آرایه رشته‌ای] هدرهای درخواست کلید در صورت محافظت به صورت name1، value1، name2، value2 و غیره بسته‌بندی می‌شوند.
    • drm_session_for_clear_content [بولی] آیا یک جلسه DRM برای پاک کردن آهنگ‌های ویدیویی و صوتی پیوست شود یا خیر.
    • drm_multi_session [بولی] چرخش کلید را در صورت محافظت فعال می‌کند.
    • subtitle_uri [رشته] آدرس اینترنتی (URI) فایل زیرنویس کناری.
    • subtitle_mime_type [رشته] نوع MIME مربوط به subtitle_uri (در صورت تنظیم subtitle_uri الزامی است).
    • subtitle_language [رشته] کد زبان BCP47 فایل زیرنویس (در صورت عدم تنظیم subtitle_uri نادیده گرفته می‌شود).
    • ad_tag_uri [رشته] آدرس اینترنتی (URI) یک تگ تبلیغ که با استفاده از [پسوند IMA][] بارگذاری می‌شود.
    • prefer_extension_decoders [بولی] اینکه آیا رمزگشاهای افزونه نسبت به رمزگشاهای پلتفرم ترجیح داده می‌شوند یا خیر.

هنگام استفاده از adb shell am start برای اجرای یک intent، یک رشته اضافی اختیاری را می‌توان با --es تنظیم کرد (مثلاً --es extension mpd ). یک رشته اضافی اختیاری بولی را می‌توان با --ez تنظیم کرد (مثلاً --ez prefer_extension_decoders TRUE ). یک رشته اضافی اختیاری طولانی را می‌توان با --el تنظیم کرد (مثلاً --el clip_start_position_ms 5000 ). یک آرایه رشته‌ای اختیاری اضافی را می‌توان با --esa تنظیم کرد (مثلاً --esa drm_key_request_properties name1,value1 ).

برای پخش یک لیست پخش از نمونه‌ها، اکشن اینتنت را روی androidx.media3.demo.main.action.VIEW_LIST تنظیم کنید. موارد اضافی پیکربندی نمونه مانند androidx.media3.demo.main.action.VIEW باقی می‌مانند، به جز دو تفاوت:

  • کلیدهای موارد اضافی باید دارای زیرخط و اندیس نمونه مبتنی بر 0 به عنوان پسوند باشند. برای مثال، extension_0 نوع نمونه را برای نمونه اول مشخص می‌کند. drm_scheme_1 طرح DRM را برای نمونه دوم تنظیم می‌کند.
  • uri نمونه به عنوان یک مقدار اضافی با کلید uri_<sample-index> ارسال می‌شود.

سایر موارد اضافی که وابسته به نمونه نیستند، تغییر نمی‌کنند. برای مثال، می‌توانید دستور زیر را در ترمینال اجرا کنید تا یک لیست پخش با دو آیتم را پخش کنید و پسوند آیتم دوم را نادیده بگیرید:

adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
    --es uri_0 https://a.com/sample1.mp4 \
    --es uri_1 https://b.com/sample2.fake_mpd \
    --es extension_1 mpd