এইচএলএস

ExoPlayer একাধিক ধারক বিন্যাস সহ HLS সমর্থন করে। অন্তর্ভুক্ত অডিও এবং ভিডিও নমুনা ফর্ম্যাটগুলিকে অবশ্যই সমর্থিত হতে হবে (বিশদ বিবরণের জন্য নমুনা বিন্যাস বিভাগটি দেখুন)৷ আমরা দৃঢ়ভাবে HLS বিষয়বস্তু প্রযোজকদের উচ্চ মানের HLS স্ট্রীম তৈরি করতে উৎসাহিত করি, যেমন এখানে বর্ণনা করা হয়েছে।

বৈশিষ্ট্য সমর্থিত মন্তব্য
পাত্রে
MPEG-TS হ্যাঁ
FMP4/CMAF হ্যাঁ
ADTS (AAC) হ্যাঁ
MP3 হ্যাঁ
ক্লোজড ক্যাপশন/সাবটাইটেল
CEA-608 হ্যাঁ
CEA-708 হ্যাঁ
ওয়েবভিটিটি হ্যাঁ
মেটাডেটা
ID3 হ্যাঁ
SCTE-35 না
বিষয়বস্তু সুরক্ষা
AES-128 হ্যাঁ
নমুনা AES-128 না
ওয়াইডভাইন হ্যাঁ API 19+ ("cenc" স্কিম) এবং 25+ ("cbcs" স্কিম)
PlayReady SL2000 হ্যাঁ শুধুমাত্র Android TV
সার্ভার নিয়ন্ত্রণ
ডেল্টা আপডেট হ্যাঁ
প্লেলিস্ট পুনরায় লোড ব্লক করা হচ্ছে হ্যাঁ
প্রিলোড ইঙ্গিত লোড ব্লক করা হ্যাঁ অনির্ধারিত দৈর্ঘ্য সহ বাইটরেঞ্জ ব্যতীত
লাইভ প্লেব্যাক
নিয়মিত লাইভ প্লেব্যাক হ্যাঁ
কম লেটেন্সি HLS (অ্যাপল) হ্যাঁ
কম লেটেন্সি HLS (সম্প্রদায়) না
কমন মিডিয়া ক্লায়েন্ট ডেটা (CMCD) হ্যাঁ ইন্টিগ্রেশন গাইড

MediaItem ব্যবহার করে

একটি HLS স্ট্রিম খেলতে, আপনাকে HLS মডিউলের উপর নির্ভর করতে হবে।

কোটলিন

implementation("androidx.media3:media3-exoplayer-hls:1.5.0")

গ্রোভি

implementation "androidx.media3:media3-exoplayer-hls:1.5.0"

তারপরে আপনি একটি HLS প্লেলিস্ট URI-এর জন্য একটি MediaItem তৈরি করতে পারেন এবং এটি প্লেয়ারের কাছে পাঠাতে পারেন৷

কোটলিন

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// Prepare the player.
player.prepare()

জাভা

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri));
// Prepare the player.
player.prepare();

যদি আপনার URI .m3u8 দিয়ে শেষ না হয়, তাহলে আপনি MimeTypes.APPLICATION_M3U8 পাস করতে পারেন setMimeType of MediaItem.Builder কে স্পষ্টভাবে বিষয়বস্তুর ধরন নির্দেশ করতে।

মিডিয়া আইটেমের URI হয় একটি মিডিয়া প্লেলিস্ট বা একটি মাল্টিভেরিয়েন্ট প্লেলিস্ট নির্দেশ করতে পারে৷ যদি URI একটি মাল্টিভেরিয়েন্ট প্লেলিস্টের দিকে নির্দেশ করে যা একাধিক #EXT-X-STREAM-INF ট্যাগ ঘোষণা করে, তাহলে ExoPlayer স্বয়ংক্রিয়ভাবে ভেরিয়েন্টের মধ্যে মানিয়ে নেবে, উপলব্ধ ব্যান্ডউইথ এবং ডিভাইসের ক্ষমতা উভয়ই বিবেচনায় নিয়ে।

HlsMediaSource ব্যবহার করে

আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি HlsMediaSource তৈরি করতে পারেন এবং একটি MediaItem এর পরিবর্তে সরাসরি প্লেয়ারে পাঠাতে পারেন৷

কোটলিন

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

জাভা

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

ম্যানিফেস্ট অ্যাক্সেস করা

আপনি Player.getCurrentManifest এ কল করে বর্তমান ম্যানিফেস্টটি পুনরুদ্ধার করতে পারেন। HLS-এর জন্য, আপনাকে ফিরে আসা বস্তুটিকে HlsManifest এ কাস্ট করতে হবে। Player.Listener এর onTimelineChanged কলব্যাক যখনই ম্যানিফেস্ট লোড হয় তখনও কল করা হয়। এটি অন-ডিমান্ড কন্টেন্টের জন্য একবার এবং লাইভ কন্টেন্টের জন্য সম্ভবত অনেকবার ঘটবে। নিম্নলিখিত কোড স্নিপেট দেখায় যে যখনই ম্যানিফেস্ট লোড হয় তখন একটি অ্যাপ কীভাবে কিছু করতে পারে।

কোটলিন

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is HlsManifest) {
        // Do something with the manifest.
      }
    }
  }
)

জাভা

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

প্লেব্যাক কাস্টমাইজ করা

ExoPlayer আপনার অ্যাপের প্রয়োজন অনুযায়ী প্লেব্যাকের অভিজ্ঞতার জন্য একাধিক উপায় প্রদান করে। উদাহরণের জন্য কাস্টমাইজেশন পৃষ্ঠা দেখুন।

খণ্ডহীন প্রস্তুতি অক্ষম করা হচ্ছে

ডিফল্টরূপে, ExoPlayer খণ্ডহীন প্রস্তুতি ব্যবহার করবে। এর মানে হল যে ExoPlayer শুধুমাত্র মাল্টিভেরিয়েন্ট প্লেলিস্টের তথ্য ব্যবহার করবে স্ট্রীম প্রস্তুত করতে, যেটি কাজ করে যদি #EXT-X-STREAM-INF ট্যাগগুলিতে CODECS অ্যাট্রিবিউট থাকে।

আপনার মিডিয়া সেগমেন্টে মিক্সড ক্লোজড-ক্যাপশন ট্র্যাক থাকলে আপনাকে এই বৈশিষ্ট্যটি অক্ষম করতে হতে পারে যেগুলি #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS ট্যাগ সহ মাল্টিভেরিয়েন্ট প্লেলিস্টে ঘোষণা করা হয়নি৷ অন্যথায়, এই ক্লোজড-ক্যাপশন ট্র্যাকগুলি সনাক্ত করা এবং চালানো হবে না৷ নিম্নলিখিত স্নিপেটে দেখানো হিসাবে আপনি HlsMediaSource.Factory এ খণ্ডহীন প্রস্তুতি নিষ্ক্রিয় করতে পারেন। মনে রাখবেন যে এটি স্টার্ট আপের সময় বাড়িয়ে দেবে কারণ এই অতিরিক্ত ট্র্যাকগুলি আবিষ্কার করতে ExoPlayer-কে একটি মিডিয়া সেগমেন্ট ডাউনলোড করতে হবে এবং এর পরিবর্তে মাল্টিভেরিয়েন্ট প্লেলিস্টে ক্লোজড-ক্যাপশন ট্র্যাকগুলি ঘোষণা করা বাঞ্ছনীয়৷

কোটলিন

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

জাভা

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

উচ্চ মানের HLS সামগ্রী তৈরি করা

ExoPlayer থেকে সর্বাধিক সুবিধা পেতে, আপনার HLS বিষয়বস্তু উন্নত করতে আপনি অনুসরণ করতে পারেন এমন কিছু নির্দেশিকা রয়েছে। সম্পূর্ণ ব্যাখ্যার জন্য ExoPlayer-এ HLS প্লেব্যাক সম্পর্কে আমাদের মিডিয়াম পোস্ট পড়ুন। প্রধান পয়েন্ট হল:

  • সুনির্দিষ্ট সেগমেন্ট সময়কাল ব্যবহার করুন.
  • একটি অবিচ্ছিন্ন মিডিয়া স্ট্রিম ব্যবহার করুন; সেগমেন্ট জুড়ে মিডিয়া কাঠামোর পরিবর্তন এড়ান।
  • #EXT-X-INDEPENDENT-SEGMENTS ট্যাগ ব্যবহার করুন।
  • ভিডিও এবং অডিও উভয়ই অন্তর্ভুক্ত ফাইলগুলির বিপরীতে, ডিমাক্সড স্ট্রীম পছন্দ করুন।
  • মাল্টিভেরিয়েন্ট প্লেলিস্টে আপনি যা করতে পারেন সমস্ত তথ্য অন্তর্ভুক্ত করুন।

নিম্নলিখিত নির্দেশিকাগুলি লাইভ স্ট্রিমগুলির জন্য বিশেষভাবে প্রযোজ্য:

  • #EXT-X-PROGRAM-DATE-TIME ট্যাগ ব্যবহার করুন।
  • #EXT-X-DISCONTINUITY-SEQUENCE ট্যাগ ব্যবহার করুন।
  • একটি দীর্ঘ লাইভ উইন্ডো প্রদান. এক মিনিট বা তার বেশি দুর্দান্ত।
,

ExoPlayer একাধিক ধারক বিন্যাস সহ HLS সমর্থন করে। অন্তর্ভুক্ত অডিও এবং ভিডিও নমুনা ফর্ম্যাটগুলিকে অবশ্যই সমর্থিত হতে হবে (বিশদ বিবরণের জন্য নমুনা বিন্যাস বিভাগটি দেখুন)৷ আমরা দৃঢ়ভাবে HLS বিষয়বস্তু প্রযোজকদের উচ্চ মানের HLS স্ট্রীম তৈরি করতে উৎসাহিত করি, যেমন এখানে বর্ণনা করা হয়েছে।

বৈশিষ্ট্য সমর্থিত মন্তব্য
পাত্রে
MPEG-TS হ্যাঁ
FMP4/CMAF হ্যাঁ
ADTS (AAC) হ্যাঁ
MP3 হ্যাঁ
ক্লোজড ক্যাপশন/সাবটাইটেল
CEA-608 হ্যাঁ
CEA-708 হ্যাঁ
ওয়েবভিটিটি হ্যাঁ
মেটাডেটা
ID3 হ্যাঁ
SCTE-35 না
বিষয়বস্তু সুরক্ষা
AES-128 হ্যাঁ
নমুনা AES-128 না
ওয়াইডভাইন হ্যাঁ API 19+ ("cenc" স্কিম) এবং 25+ ("cbcs" স্কিম)
PlayReady SL2000 হ্যাঁ শুধুমাত্র Android TV
সার্ভার নিয়ন্ত্রণ
ডেল্টা আপডেট হ্যাঁ
প্লেলিস্ট পুনরায় লোড ব্লক করা হচ্ছে হ্যাঁ
প্রিলোড ইঙ্গিত লোড ব্লক করা হ্যাঁ অনির্ধারিত দৈর্ঘ্য সহ বাইটরেঞ্জ ব্যতীত
লাইভ প্লেব্যাক
নিয়মিত লাইভ প্লেব্যাক হ্যাঁ
কম লেটেন্সি HLS (অ্যাপল) হ্যাঁ
কম লেটেন্সি HLS (সম্প্রদায়) না
কমন মিডিয়া ক্লায়েন্ট ডেটা (CMCD) হ্যাঁ ইন্টিগ্রেশন গাইড

MediaItem ব্যবহার করে

একটি HLS স্ট্রিম খেলতে, আপনাকে HLS মডিউলের উপর নির্ভর করতে হবে।

কোটলিন

implementation("androidx.media3:media3-exoplayer-hls:1.5.0")

গ্রোভি

implementation "androidx.media3:media3-exoplayer-hls:1.5.0"

তারপরে আপনি একটি HLS প্লেলিস্ট URI-এর জন্য একটি MediaItem তৈরি করতে পারেন এবং এটি প্লেয়ারের কাছে পাঠাতে পারেন৷

কোটলিন

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// Prepare the player.
player.prepare()

জাভা

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri));
// Prepare the player.
player.prepare();

যদি আপনার URI .m3u8 দিয়ে শেষ না হয়, তাহলে আপনি MimeTypes.APPLICATION_M3U8 পাস করতে পারেন setMimeType of MediaItem.Builder কে স্পষ্টভাবে বিষয়বস্তুর ধরন নির্দেশ করতে।

মিডিয়া আইটেমের URI হয় একটি মিডিয়া প্লেলিস্ট বা একটি মাল্টিভেরিয়েন্ট প্লেলিস্ট নির্দেশ করতে পারে৷ যদি URI একটি মাল্টিভেরিয়েন্ট প্লেলিস্টের দিকে নির্দেশ করে যা একাধিক #EXT-X-STREAM-INF ট্যাগ ঘোষণা করে, তাহলে ExoPlayer স্বয়ংক্রিয়ভাবে ভেরিয়েন্টের মধ্যে মানিয়ে নেবে, উপলব্ধ ব্যান্ডউইথ এবং ডিভাইসের ক্ষমতা উভয়ই বিবেচনায় নিয়ে।

HlsMediaSource ব্যবহার করে

আরও কাস্টমাইজেশন বিকল্পের জন্য, আপনি একটি HlsMediaSource তৈরি করতে পারেন এবং একটি MediaItem এর পরিবর্তে সরাসরি প্লেয়ারে পাঠাতে পারেন৷

কোটলিন

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

জাভা

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

ম্যানিফেস্ট অ্যাক্সেস করা

আপনি Player.getCurrentManifest এ কল করে বর্তমান ম্যানিফেস্টটি পুনরুদ্ধার করতে পারেন। HLS-এর জন্য, আপনাকে ফিরে আসা বস্তুটিকে HlsManifest এ কাস্ট করতে হবে। Player.Listener এর onTimelineChanged কলব্যাক যখনই ম্যানিফেস্ট লোড হয় তখনও কল করা হয়। এটি অন-ডিমান্ড কন্টেন্টের জন্য একবার এবং লাইভ কন্টেন্টের জন্য সম্ভবত অনেকবার ঘটবে। নিম্নলিখিত কোড স্নিপেট দেখায় যে যখনই ম্যানিফেস্ট লোড হয় তখন একটি অ্যাপ কীভাবে কিছু করতে পারে।

কোটলিন

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is HlsManifest) {
        // Do something with the manifest.
      }
    }
  }
)

জাভা

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

প্লেব্যাক কাস্টমাইজ করা

ExoPlayer আপনার অ্যাপের প্রয়োজন অনুযায়ী প্লেব্যাকের অভিজ্ঞতার জন্য একাধিক উপায় প্রদান করে। উদাহরণের জন্য কাস্টমাইজেশন পৃষ্ঠা দেখুন।

খণ্ডহীন প্রস্তুতি অক্ষম করা হচ্ছে

ডিফল্টরূপে, ExoPlayer খণ্ডহীন প্রস্তুতি ব্যবহার করবে। এর মানে হল যে ExoPlayer শুধুমাত্র মাল্টিভেরিয়েন্ট প্লেলিস্টের তথ্য ব্যবহার করবে স্ট্রীম প্রস্তুত করতে, যেটি কাজ করে যদি #EXT-X-STREAM-INF ট্যাগগুলিতে CODECS অ্যাট্রিবিউট থাকে।

আপনার মিডিয়া সেগমেন্টে মিক্সড ক্লোজড-ক্যাপশন ট্র্যাক থাকলে আপনাকে এই বৈশিষ্ট্যটি অক্ষম করতে হতে পারে যেগুলি #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS ট্যাগ সহ মাল্টিভেরিয়েন্ট প্লেলিস্টে ঘোষণা করা হয়নি৷ অন্যথায়, এই ক্লোজড-ক্যাপশন ট্র্যাকগুলি সনাক্ত করা এবং চালানো হবে না৷ নিম্নলিখিত স্নিপেটে দেখানো হিসাবে আপনি HlsMediaSource.Factory এ খণ্ডহীন প্রস্তুতি নিষ্ক্রিয় করতে পারেন। মনে রাখবেন যে এটি স্টার্ট আপের সময় বাড়িয়ে দেবে কারণ এই অতিরিক্ত ট্র্যাকগুলি আবিষ্কার করতে ExoPlayer-কে একটি মিডিয়া সেগমেন্ট ডাউনলোড করতে হবে এবং এর পরিবর্তে মাল্টিভেরিয়েন্ট প্লেলিস্টে ক্লোজড-ক্যাপশন ট্র্যাকগুলি ঘোষণা করা বাঞ্ছনীয়৷

কোটলিন

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

জাভা

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

উচ্চ মানের HLS সামগ্রী তৈরি করা

ExoPlayer থেকে সর্বাধিক সুবিধা পেতে, আপনার HLS বিষয়বস্তু উন্নত করতে আপনি অনুসরণ করতে পারেন এমন কিছু নির্দেশিকা রয়েছে। সম্পূর্ণ ব্যাখ্যার জন্য ExoPlayer-এ HLS প্লেব্যাক সম্পর্কে আমাদের মিডিয়াম পোস্ট পড়ুন। প্রধান পয়েন্ট হল:

  • সুনির্দিষ্ট সেগমেন্ট সময়কাল ব্যবহার করুন.
  • একটি অবিচ্ছিন্ন মিডিয়া স্ট্রিম ব্যবহার করুন; সেগমেন্ট জুড়ে মিডিয়া কাঠামোর পরিবর্তন এড়ান।
  • #EXT-X-INDEPENDENT-SEGMENTS ট্যাগ ব্যবহার করুন।
  • ভিডিও এবং অডিও উভয়ই অন্তর্ভুক্ত ফাইলগুলির বিপরীতে, ডিমাক্সড স্ট্রীম পছন্দ করুন।
  • মাল্টিভেরিয়েন্ট প্লেলিস্টে আপনি যা করতে পারেন সমস্ত তথ্য অন্তর্ভুক্ত করুন।

নিম্নলিখিত নির্দেশিকাগুলি লাইভ স্ট্রিমগুলির জন্য বিশেষভাবে প্রযোজ্য:

  • #EXT-X-PROGRAM-DATE-TIME ট্যাগ ব্যবহার করুন।
  • #EXT-X-DISCONTINUITY-SEQUENCE ট্যাগ ব্যবহার করুন।
  • একটি দীর্ঘ লাইভ উইন্ডো প্রদান. এক মিনিট বা তার বেশি দুর্দান্ত।