ExoPlayer ডেমো অ্যাপ্লিকেশন

ExoPlayer এর প্রধান ডেমো অ্যাপ্লিকেশন দুটি প্রাথমিক উদ্দেশ্য পরিবেশন করে:

  1. ExoPlayer ব্যবহারের তুলনামূলকভাবে সহজ কিন্তু সম্পূর্ণ বৈশিষ্ট্যযুক্ত উদাহরণ প্রদান করতে। ডেমো অ্যাপটি একটি সুবিধাজনক সূচনা পয়েন্ট হিসেবে ব্যবহার করা যেতে পারে যেখান থেকে আপনার নিজের অ্যাপ তৈরি করতে।
  2. ExoPlayer চেষ্টা করা সহজ করতে। ডেমো অ্যাপটি অন্তর্ভুক্ত নমুনাগুলি ছাড়াও আপনার নিজস্ব সামগ্রীর প্লেব্যাক পরীক্ষা করতে ব্যবহার করা যেতে পারে।

এই পৃষ্ঠাটি বর্ণনা করে কিভাবে ডেমো অ্যাপ পেতে, কম্পাইল এবং চালাতে হয়। এটি আপনার নিজস্ব মিডিয়া চালানোর জন্য কীভাবে এটি ব্যবহার করবেন তাও বর্ণনা করে৷

কোড পাচ্ছেন

মূল ডেমো অ্যাপের সোর্স কোডটি আমাদের গিটহাব প্রকল্পের demos/main ফোল্ডারে পাওয়া যাবে। আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে প্রকল্পটিকে একটি স্থানীয় ডিরেক্টরিতে ক্লোন করুন:

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

এরপরে, অ্যান্ড্রয়েড স্টুডিওতে প্রকল্পটি খুলুন। অ্যান্ড্রয়েড প্রজেক্ট ভিউতে আপনার নিম্নলিখিতগুলি দেখতে হবে (ডেমো অ্যাপের প্রাসঙ্গিক ফোল্ডারগুলি প্রসারিত করা হয়েছে):

অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্ট

সংকলন এবং চলমান

ডেমো অ্যাপ কম্পাইল এবং চালাতে, অ্যান্ড্রয়েড স্টুডিওতে demo কনফিগারেশন নির্বাচন করুন এবং চালান। ডেমো অ্যাপটি একটি সংযুক্ত অ্যান্ড্রয়েড ডিভাইসে ইনস্টল এবং চালানো হবে। আমরা সম্ভব হলে একটি শারীরিক ডিভাইস ব্যবহার করার পরামর্শ দিই। আপনি যদি এর পরিবর্তে একটি এমুলেটর ব্যবহার করতে চান, তাহলে অনুগ্রহ করে সমর্থিত ডিভাইসের এমুলেটর বিভাগটি পড়ুন এবং নিশ্চিত করুন যে আপনার ভার্চুয়াল ডিভাইসটি কমপক্ষে 23-এর API স্তর সহ একটি সিস্টেম চিত্র ব্যবহার করে।

নমুনা চয়নকারী অ্যাক্টিভিটি এবং প্লেয়ার অ্যাক্টিভিটি

ডেমো অ্যাপটি নমুনার একটি তালিকা উপস্থাপন করে ( SampleChooserActivity )। একটি নমুনা নির্বাচন প্লেব্যাকের জন্য একটি দ্বিতীয় কার্যকলাপ ( PlayerActivity ) খুলবে৷ ডেমোতে প্লেব্যাক নিয়ন্ত্রণ এবং ট্র্যাক নির্বাচন কার্যকারিতা রয়েছে। এটি সিস্টেম লগে দরকারী ডিবাগ তথ্য আউটপুট করতে ExoPlayer এর EventLogger ইউটিলিটি ক্লাস ব্যবহার করে। এই লগিংটি দেখা যেতে পারে (অন্যান্য ট্যাগের জন্য ত্রুটি স্তরের লগিং সহ) কমান্ড সহ:

adb logcat EventLogger:V *:E

বান্ডিল ডিকোডার সক্রিয় করা হচ্ছে

ExoPlayer-এর অনেকগুলি এক্সটেনশন রয়েছে যা AV1, VP9, ​​Opus, FLAC, এবং FFmpeg (শুধু অডিও) সহ বান্ডিল করা সফ্টওয়্যার ডিকোডার ব্যবহারের অনুমতি দেয়। ডেমো অ্যাপটি এই এক্সটেনশনগুলিকে অন্তর্ভুক্ত এবং ব্যবহার করার জন্য তৈরি করা যেতে পারে:

  1. আপনি অন্তর্ভুক্ত করতে চান এমন প্রতিটি এক্সটেনশন তৈরি করুন। মনে রাখবেন এটি একটি ম্যানুয়াল প্রক্রিয়া। নির্দেশাবলীর জন্য প্রতিটি এক্সটেনশনের README.md ফাইলটি পড়ুন।
  2. অ্যান্ড্রয়েড স্টুডিওর বিল্ড ভেরিয়েন্ট ভিউতে, ডেমো মডিউলের জন্য বিল্ড ভেরিয়েন্টটিকে withDecoderExtensionsDebug বা withDecoderExtensionsRelease মত সেট করুন যা নিচের ছবিতে দেখানো হয়েছে।

    ডেমো নির্বাচন করা হচ্ছে `ডিকোডার এক্সটেনশনডিবাগ` বিল্ড ভেরিয়েন্টের সাথে

  3. স্বাভাবিক হিসাবে demo কনফিগারেশন কম্পাইল, ইনস্টল এবং চালান।

ডিফল্টরূপে একটি এক্সটেনশন ডিকোডার ব্যবহার করা হবে শুধুমাত্র যদি একটি উপযুক্ত প্ল্যাটফর্ম ডিকোডার বিদ্যমান না থাকে। এটি নির্দিষ্ট করা সম্ভব যে এক্সটেনশন ডিকোডারগুলিকে পছন্দ করা উচিত, যেমনটি নিম্নলিখিত বিভাগে বর্ণিত হয়েছে৷

আপনার নিজস্ব বিষয়বস্তু বাজানো

ডেমো অ্যাপে আপনার নিজস্ব সামগ্রী চালানোর একাধিক উপায় রয়েছে।

1. সম্পদ/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. 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",
        "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. 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",
            "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
}

নমুনা চয়নকারী কার্যকলাপে, ওভারফ্লো মেনুতে এক্সটেনশন ডিকোডার পছন্দ করবেন কিনা তা নির্দিষ্ট করার বিকল্প রয়েছে৷

স্থানীয় ফাইল ইউআরআই এবং স্কোপড স্টোরেজ সীমাবদ্ধতা

স্থানীয় ফাইল ইউআরআই নির্দিষ্ট করার সময়, ডেমো অ্যাপ এই ফাইলগুলি পড়ার জন্য প্রয়োজনীয় স্টোরেজ অ্যাক্সেসের অনুমতির অনুরোধ করে। যাইহোক, অ্যান্ড্রয়েড 13 থেকে, ইচ্ছামত ফাইল লোড করা সম্ভব নয় যেগুলি একটি সাধারণ মিডিয়া ফাইল এক্সটেনশনে শেষ হয় না (যেমন .mp4 )। আপনার যদি এমন একটি ফাইল লোড করার প্রয়োজন হয়, আপনি এটিকে ডেমো অ্যাপের নির্দিষ্ট স্টোরেজ ডিরেক্টরিতে রাখতে পারেন যার কোনো অ্যাক্সেস সীমাবদ্ধতা নেই। এটি সাধারণত /sdcard/Android/data/androidx.media3.demo.main/files এ অবস্থিত।

2. একটি বহিরাগত 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 লিঙ্কে (উদাহরণস্বরূপ, ব্রাউজারে বা একটি ইমেল ক্লায়েন্টে) ক্লিক করলে এটি ডেমো অ্যাপে ওপেন হবে। তাই একটি *.exolist.json JSON ফাইল হোস্ট করা অন্যদের ডেমো অ্যাপে চেষ্টা করার জন্য সামগ্রী বিতরণের একটি সহজ উপায় প্রদান করে।

3. একটি উদ্দেশ্য ফায়ারিং

ইন্টেন্টগুলি নমুনার তালিকা বাইপাস করতে এবং সরাসরি প্লেব্যাকে লঞ্চ করতে ব্যবহার করা যেতে পারে। একটি একক নমুনা চালানোর জন্য, অভিপ্রায়ের ক্রিয়াটি 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
    • clip_start_position_ms [লং] একটি স্টার্ট পয়েন্ট যেখানে নমুনাটি মিলিসেকেন্ডে ক্লিপ করা উচিত।
    • clip_end_position_ms [লং] একটি শেষ বিন্দু যা থেকে নমুনাটি মিলিসেকেন্ডে ক্লিপ করা উচিত।
    • drm_scheme [স্ট্রিং] DRM স্কিম যদি সুরক্ষিত থাকে। বৈধ মান হল widevine , playready এবং clearkey । DRM স্কিম UUID গুলিও গ্রহণ করা হয়৷
    • drm_license_uri [স্ট্রিং] লাইসেন্স সার্ভারের URI যদি সুরক্ষিত থাকে।
    • drm_force_default_license_uri [বুলিয়ান] তাদের নিজস্ব লাইসেন্স URI অন্তর্ভুক্ত কী অনুরোধের জন্য drm_license_uri ব্যবহার করতে বাধ্য করা হবে কিনা।
    • drm_key_request_properties [স্ট্রিং অ্যারে] মূল অনুরোধ শিরোনাম নাম1, মান1, নাম2, মান2 ইত্যাদি হিসাবে প্যাক করা হয় যদি সুরক্ষিত থাকে।
    • drm_session_for_clear_content [বুলিয়ান] ভিডিও এবং অডিও ট্র্যাক সাফ করার জন্য একটি DRM সেশন সংযুক্ত করতে হবে কিনা।
    • drm_multi_session [বুলিয়ান] সুরক্ষিত থাকলে কী রোটেশন সক্ষম করে।
    • subtitle_uri [স্ট্রিং] একটি সাবটাইটেল সাইডকার ফাইলের URI।
    • subtitle_mime_type [স্ট্রিং] সাবটাইটেল_উরির MIME প্রকার (সাবটাইটেল_উরি সেট করা থাকলে প্রয়োজনীয়)।
    • subtitle_language [String] সাবটাইটেল ফাইলের BCP47 ভাষার কোড (যদি subtitle_uri সেট করা না থাকে তাহলে উপেক্ষা করা হয়)।
    • ad_tag_uri [স্ট্রিং] [IMA এক্সটেনশন][] ব্যবহার করে লোড করার জন্য একটি বিজ্ঞাপন ট্যাগের URI।
    • prefer_extension_decoders [বুলিয়ান] এক্সটেনশন ডিকোডার প্ল্যাটফর্ম বেশী পছন্দ করা হয় কিনা।

adb shell am start , একটি ঐচ্ছিক স্ট্রিং অতিরিক্ত --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_<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