সরাসরি সম্প্রচার

ExoPlayer কোনো বিশেষ কনফিগারেশন ছাড়াই সর্বাধিক অভিযোজিত লাইভ স্ট্রীমগুলিকে বাক্সের বাইরে খেলে৷ আরো বিস্তারিত জানার জন্য সমর্থিত ফরম্যাট পৃষ্ঠা দেখুন।

অভিযোজিত লাইভ স্ট্রিমগুলি উপলব্ধ মিডিয়ার একটি উইন্ডো অফার করে যা বর্তমান রিয়েল-টাইমের সাথে সরানোর জন্য নিয়মিত বিরতিতে আপডেট করা হয়। তার মানে প্লেব্যাক অবস্থান সবসময় এই উইন্ডোতে কোথাও থাকবে, বেশিরভাগ ক্ষেত্রেই বর্তমান রিয়েল-টাইমের কাছাকাছি যেখানে স্ট্রিমটি তৈরি করা হচ্ছে। বর্তমান রিয়েল-টাইম এবং প্লেব্যাক অবস্থানের মধ্যে পার্থক্যকে লাইভ অফসেট বলা হয়।

লাইভ প্লেব্যাক সনাক্ত করা এবং পর্যবেক্ষণ করা

প্রতিবার একটি লাইভ উইন্ডো আপডেট করা হলে, রেজিস্টার্ড Player.Listener শ্রোতা দৃষ্টান্তগুলি একটি onTimelineChanged ইভেন্ট পাবে৷ আপনি বিভিন্ন Player এবং Timeline.Window পদ্ধতিগুলি জিজ্ঞাসা করে বর্তমান লাইভ প্লেব্যাক সম্পর্কে বিশদ পুনরুদ্ধার করতে পারেন, নীচে তালিকাভুক্ত এবং নিম্নলিখিত চিত্রে দেখানো হয়েছে৷

লাইভ উইন্ডো

  • Player.isCurrentWindowLive ইঙ্গিত করে যে বর্তমানে যে মিডিয়া আইটেমটি চলছে সেটি একটি লাইভ স্ট্রিম কিনা। লাইভ স্ট্রিম শেষ হয়ে গেলেও এই মানটি এখনও সত্য।
  • Player.isCurrentWindowDynamic নির্দেশ করে যে বর্তমানে প্লে করা মিডিয়া আইটেম এখনও আপডেট করা হচ্ছে কিনা। এটি সাধারণত লাইভ স্ট্রিমগুলির জন্য সত্য যেগুলি এখনও শেষ হয়নি৷ মনে রাখবেন যে এই পতাকাটি কিছু ক্ষেত্রে অ-লাইভ স্ট্রিমগুলির জন্যও সত্য।
  • Player.getCurrentLiveOffset বর্তমান রিয়েল টাইম এবং প্লেব্যাক অবস্থানের মধ্যে অফসেট প্রদান করে (যদি উপলব্ধ থাকে)।
  • Player.getDuration বর্তমান লাইভ উইন্ডোর দৈর্ঘ্য প্রদান করে।
  • Player.getCurrentPosition লাইভ উইন্ডোর শুরুর সাপেক্ষে প্লেব্যাক অবস্থান প্রদান করে।
  • Player.getCurrentMediaItem বর্তমান মিডিয়া আইটেম রিটার্ন করে, যেখানে MediaItem.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটারের জন্য অ্যাপ-প্রদত্ত ওভাররাইড রয়েছে।
  • Player.getCurrentTimeline একটি Timeline বর্তমান মিডিয়া কাঠামো প্রদান করে। Player.getCurrentMediaItemIndex এবং Timeline.getWindow ব্যবহার করে Timeline থেকে বর্তমান Timeline.Window পুনরুদ্ধার করা যেতে পারে। Window মধ্যে:
    • Window.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটার রয়েছে। এই মানগুলি মিডিয়ার তথ্য এবং MediaItem.liveConfiguration এ সেট করা যেকোনো অ্যাপ-প্রদত্ত ওভাররাইডের উপর ভিত্তি করে।
    • Window.windowStartTimeMs হল Unix Epoch থেকে সেই সময় যেখানে লাইভ উইন্ডো শুরু হয়।
    • Window.getCurrentUnixTimeMs হল বর্তমান রিয়েল-টাইমের ইউনিক্স যুগের পরের সময়। এই মানটি সার্ভার এবং ক্লায়েন্টের মধ্যে পরিচিত ঘড়ির পার্থক্য দ্বারা সংশোধন করা যেতে পারে।
    • Window.getDefaultPositionMs হল লাইভ উইন্ডোর অবস্থান যেখানে প্লেয়ার ডিফল্টরূপে প্লেব্যাক শুরু করবে।

লাইভ স্ট্রীম খুঁজছেন

আপনি Player.seekTo ব্যবহার করে লাইভ উইন্ডোর মধ্যে যেকোনো জায়গায় যেতে পারেন। পাস করা অনুসন্ধানের অবস্থানটি লাইভ উইন্ডোর শুরুর সাথে সম্পর্কিত। উদাহরণস্বরূপ, seekTo(0) লাইভ উইন্ডোর শুরুতে চাইবে। প্লেয়ার চেষ্টা করবে একই লাইভ অফসেট রাখার জন্য যেভাবে একটি চাওয়ার পরে চাওয়া-পাওয়া পজিশন।

লাইভ উইন্ডোতেও একটি ডিফল্ট অবস্থান রয়েছে যেখানে প্লেব্যাক শুরু হওয়ার কথা। এই অবস্থানটি সাধারণত লাইভ প্রান্তের কাছাকাছি কোথাও থাকে। আপনি Player.seekToDefaultPosition কল করে ডিফল্ট অবস্থানে যেতে পারেন।

লাইভ প্লেব্যাক UI

ExoPlayer-এর ডিফল্ট UI উপাদানগুলি লাইভ উইন্ডোর সময়কাল এবং এর মধ্যে বর্তমান প্লেব্যাক অবস্থান দেখায়। এর মানে প্রতিবার লাইভ উইন্ডো আপডেট করা হলে পজিশনটি পিছনের দিকে লাফ দিতে দেখা যাবে। আপনার যদি ভিন্ন আচরণের প্রয়োজন হয়, উদাহরণস্বরূপ ইউনিক্স সময় বা বর্তমান লাইভ অফসেট দেখানো, আপনি PlayerControlView ফর্ক করতে পারেন এবং আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন।

লাইভ প্লেব্যাক পরামিতি কনফিগার করা হচ্ছে

ExoPlayer লাইভ প্রান্ত থেকে প্লেব্যাক অবস্থানের অফসেট এবং এই অফসেট সামঞ্জস্য করতে ব্যবহার করা যেতে পারে এমন প্লেব্যাকের গতির পরিসীমা নিয়ন্ত্রণ করতে কিছু প্যারামিটার ব্যবহার করে৷

ExoPlayer এই প্যারামিটারগুলির জন্য তিনটি স্থান থেকে মান পায়, অগ্রাধিকারের ক্রমানুসারে (প্রথম পাওয়া মানটি ব্যবহার করা হয়):

  • প্রতি MediaItem মান MediaItem.Builder.setLiveConfiguration এ পাস করা হয়েছে।
  • গ্লোবাল ডিফল্ট মানগুলি DefaultMediaSourceFactory সেট করা হয়েছে।
  • মান মিডিয়া থেকে সরাসরি পড়া.

কোটলিন

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

জাভা

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

উপলব্ধ কনফিগারেশন মান হল:

  • targetOffsetMs : টার্গেট লাইভ অফসেট। প্লেব্যাক সম্ভব হলে প্লেব্যাকের সময় এই লাইভ অফসেটের কাছাকাছি যাওয়ার চেষ্টা করবে।
  • minOffsetMs : ন্যূনতম অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের নিচে যাওয়ার চেষ্টা করবে না।
  • maxOffsetMs : সর্বাধিক অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের উপরে যাওয়ার চেষ্টা করবে না।
  • minPlaybackSpeed : ন্যূনতম প্লেব্যাক গতি প্লেয়ার যখন লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করে পিছিয়ে পড়তে ব্যবহার করতে পারে।
  • maxPlaybackSpeed ​​: প্লেব্যাকের সর্বোচ্চ গতি যা প্লেয়ার ব্যবহার করতে পারে লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করার সময়।

প্লেব্যাক গতি সমন্বয়

কম লেটেন্সি লাইভ স্ট্রিম চালানোর সময়, ExoPlayer প্লেব্যাকের গতি সামান্য পরিবর্তন করে লাইভ অফসেট সামঞ্জস্য করে। প্লেয়ার মিডিয়া বা অ্যাপ দ্বারা প্রদত্ত টার্গেট লাইভ অফসেটের সাথে মেলানোর চেষ্টা করবে, তবে নেটওয়ার্কের অবস্থার পরিবর্তনে প্রতিক্রিয়া জানাতেও চেষ্টা করবে। উদাহরণস্বরূপ, যদি প্লেব্যাকের সময় রিবাফার হয়, প্লেয়ার লাইভ প্রান্ত থেকে আরও দূরে সরে যেতে প্লেব্যাককে কিছুটা কমিয়ে দেবে। যদি নেটওয়ার্ক আবার লাইভ প্রান্তের কাছাকাছি বাজানো সমর্থন করার জন্য যথেষ্ট স্থিতিশীল হয়ে ওঠে, প্লেয়ারটি লক্ষ্য লাইভ অফসেটের দিকে ফিরে যাওয়ার জন্য প্লেব্যাকের গতি বাড়িয়ে দেবে।

যদি স্বয়ংক্রিয় প্লেব্যাক গতির সামঞ্জস্য না হয়, তাহলে minPlaybackSpeed ​​এবং maxPlaybackSpeed ​​বৈশিষ্ট্যগুলিকে 1.0f এ সেট করে এটি নিষ্ক্রিয় করা যেতে পারে। একইভাবে, এটি 1.0f ছাড়া অন্য মানগুলিতে স্পষ্টভাবে সেট করে নন-লো-লেটেন্সি লাইভ স্ট্রিমগুলির জন্য সক্ষম করা যেতে পারে। এই বৈশিষ্ট্যগুলি কীভাবে সেট করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য উপরের কনফিগারেশন বিভাগটি দেখুন।

প্লেব্যাক গতি সমন্বয় অ্যালগরিদম কাস্টমাইজ করা

যদি গতি সামঞ্জস্য সক্ষম করা হয়, তাহলে একটি LivePlaybackSpeedControl সংজ্ঞায়িত করে যে কী সমন্বয় করা হবে। একটি কাস্টম LivePlaybackSpeedControl বাস্তবায়ন করা, অথবা ডিফল্ট বাস্তবায়ন কাস্টমাইজ করা সম্ভব, যা হল DefaultLivePlaybackSpeedControl । উভয় ক্ষেত্রেই, প্লেয়ার তৈরি করার সময় একটি উদাহরণ সেট করা যেতে পারে:

কোটলিন

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

জাভা

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

DefaultLivePlaybackSpeedControl এর প্রাসঙ্গিক কাস্টমাইজেশন প্যারামিটারগুলি হল:

  • fallbackMinPlaybackSpeed ​​এবং fallbackMaxPlaybackSpeed ​​: ন্যূনতম এবং সর্বোচ্চ প্লেব্যাক গতি যা সামঞ্জস্যের জন্য ব্যবহার করা যেতে পারে যদি মিডিয়া বা অ্যাপ-প্রদত্ত MediaItem সীমা নির্ধারণ না করে।
  • proportionalControlFactor : গতির সমন্বয় কতটা মসৃণ তা নিয়ন্ত্রণ করে। একটি উচ্চ মান সামঞ্জস্যগুলিকে আরও আকস্মিক এবং প্রতিক্রিয়াশীল করে তোলে, তবে শ্রবণযোগ্য হওয়ার সম্ভাবনাও বেশি। একটি ছোট মান গতির মধ্যে একটি মসৃণ রূপান্তর ঘটায়, ধীর হওয়ার খরচে।
  • targetLiveOffsetIncrementOnRebufferMs : এই মানটি লক্ষ্য লাইভ অফসেটে যোগ করা হয় যখনই একটি রিবাফার ঘটে, যাতে আরও সতর্কতার সাথে এগিয়ে যায়। মানটি 0 এ সেট করে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করা যেতে পারে।
  • minPossibleLiveOffsetSmoothingFactor : একটি সূচকীয় স্মুথিং ফ্যাক্টর যা বর্তমানে বাফার করা মিডিয়ার উপর ভিত্তি করে ন্যূনতম সম্ভাব্য লাইভ অফসেট ট্র্যাক করতে ব্যবহৃত হয়। 1 এর খুব কাছাকাছি একটি মান মানে অনুমানটি আরও সতর্ক এবং উন্নত নেটওয়ার্ক অবস্থার সাথে সামঞ্জস্য করতে বেশি সময় লাগতে পারে, যেখানে একটি কম মানের মানে অনুমানটি রিবাফারের উচ্চ ঝুঁকিতে দ্রুত সামঞ্জস্য করবে৷

বিহাইন্ডলাইভউইন্ডোএক্সেপশন এবং ERROR_CODE_BEHIND_LIVE_WINDOW

প্লেব্যাক পজিশন লাইভ উইন্ডোর পিছনে পড়ে যেতে পারে, উদাহরণস্বরূপ যদি প্লেয়ারটি যথেষ্ট দীর্ঘ সময়ের জন্য থামানো বা বাফার করা হয়। যদি এটি ঘটে তবে প্লেব্যাক ব্যর্থ হবে এবং ত্রুটি কোড ERROR_CODE_BEHIND_LIVE_WINDOW এর সাথে একটি ব্যতিক্রম Player.Listener.onPlayerError এর মাধ্যমে রিপোর্ট করা হবে। অ্যাপ্লিকেশন কোড ডিফল্ট অবস্থানে প্লেব্যাক পুনরায় শুরু করে এই ধরনের ত্রুটিগুলি পরিচালনা করতে ইচ্ছুক হতে পারে। ডেমো অ্যাপের প্লেয়ার অ্যাক্টিভিটি এই পদ্ধতির উদাহরণ দেয়।

কোটলিন

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

জাভা

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}

,

ExoPlayer কোনো বিশেষ কনফিগারেশন ছাড়াই সর্বাধিক অভিযোজিত লাইভ স্ট্রীমগুলিকে বাক্সের বাইরে খেলে৷ আরো বিস্তারিত জানার জন্য সমর্থিত ফরম্যাট পৃষ্ঠা দেখুন।

অভিযোজিত লাইভ স্ট্রিমগুলি উপলব্ধ মিডিয়ার একটি উইন্ডো অফার করে যা বর্তমান রিয়েল-টাইমের সাথে সরানোর জন্য নিয়মিত বিরতিতে আপডেট করা হয়। তার মানে প্লেব্যাক অবস্থান সবসময় এই উইন্ডোতে কোথাও থাকবে, বেশিরভাগ ক্ষেত্রেই বর্তমান রিয়েল-টাইমের কাছাকাছি যেখানে স্ট্রিমটি তৈরি করা হচ্ছে। বর্তমান রিয়েল-টাইম এবং প্লেব্যাক অবস্থানের মধ্যে পার্থক্যকে লাইভ অফসেট বলা হয়।

লাইভ প্লেব্যাক সনাক্ত করা এবং পর্যবেক্ষণ করা

প্রতিবার একটি লাইভ উইন্ডো আপডেট করা হলে, রেজিস্টার্ড Player.Listener শ্রোতা দৃষ্টান্তগুলি একটি onTimelineChanged ইভেন্ট পাবে৷ আপনি বিভিন্ন Player এবং Timeline.Window পদ্ধতিগুলি জিজ্ঞাসা করে বর্তমান লাইভ প্লেব্যাক সম্পর্কে বিশদ পুনরুদ্ধার করতে পারেন, নীচে তালিকাভুক্ত এবং নিম্নলিখিত চিত্রে দেখানো হয়েছে৷

লাইভ উইন্ডো

  • Player.isCurrentWindowLive ইঙ্গিত করে যে বর্তমানে যে মিডিয়া আইটেমটি চলছে সেটি একটি লাইভ স্ট্রিম কিনা। লাইভ স্ট্রিম শেষ হয়ে গেলেও এই মানটি এখনও সত্য।
  • Player.isCurrentWindowDynamic নির্দেশ করে যে বর্তমানে প্লে করা মিডিয়া আইটেম এখনও আপডেট করা হচ্ছে কিনা। এটি সাধারণত লাইভ স্ট্রিমগুলির জন্য সত্য যেগুলি এখনও শেষ হয়নি৷ মনে রাখবেন যে এই পতাকাটি কিছু ক্ষেত্রে অ-লাইভ স্ট্রিমগুলির জন্যও সত্য।
  • Player.getCurrentLiveOffset বর্তমান রিয়েল টাইম এবং প্লেব্যাক অবস্থানের মধ্যে অফসেট প্রদান করে (যদি উপলব্ধ থাকে)।
  • Player.getDuration বর্তমান লাইভ উইন্ডোর দৈর্ঘ্য প্রদান করে।
  • Player.getCurrentPosition লাইভ উইন্ডোর শুরুর সাপেক্ষে প্লেব্যাক অবস্থান প্রদান করে।
  • Player.getCurrentMediaItem বর্তমান মিডিয়া আইটেম রিটার্ন করে, যেখানে MediaItem.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটারের জন্য অ্যাপ-প্রদত্ত ওভাররাইড রয়েছে।
  • Player.getCurrentTimeline একটি Timeline বর্তমান মিডিয়া কাঠামো প্রদান করে। Player.getCurrentMediaItemIndex এবং Timeline.getWindow ব্যবহার করে Timeline থেকে বর্তমান Timeline.Window পুনরুদ্ধার করা যেতে পারে। Window মধ্যে:
    • Window.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটার রয়েছে। এই মানগুলি মিডিয়ার তথ্য এবং MediaItem.liveConfiguration এ সেট করা যেকোনো অ্যাপ-প্রদত্ত ওভাররাইডের উপর ভিত্তি করে।
    • Window.windowStartTimeMs হল Unix Epoch থেকে সেই সময় যেখানে লাইভ উইন্ডো শুরু হয়।
    • Window.getCurrentUnixTimeMs হল বর্তমান রিয়েল-টাইমের ইউনিক্স যুগের পরের সময়। এই মানটি সার্ভার এবং ক্লায়েন্টের মধ্যে পরিচিত ঘড়ির পার্থক্য দ্বারা সংশোধন করা যেতে পারে।
    • Window.getDefaultPositionMs হল লাইভ উইন্ডোর অবস্থান যেখানে প্লেয়ার ডিফল্টরূপে প্লেব্যাক শুরু করবে।

লাইভ স্ট্রীম খুঁজছেন

আপনি Player.seekTo ব্যবহার করে লাইভ উইন্ডোর মধ্যে যেকোনো জায়গায় যেতে পারেন। পাস করা অনুসন্ধানের অবস্থানটি লাইভ উইন্ডোর শুরুর সাথে সম্পর্কিত। উদাহরণস্বরূপ, seekTo(0) লাইভ উইন্ডোর শুরুতে চাইবে। প্লেয়ার চেষ্টা করবে একই লাইভ অফসেট রাখার জন্য যেভাবে একটি চাওয়ার পরে চাওয়া-পাওয়া পজিশন।

লাইভ উইন্ডোতেও একটি ডিফল্ট অবস্থান রয়েছে যেখানে প্লেব্যাক শুরু হওয়ার কথা। এই অবস্থানটি সাধারণত লাইভ প্রান্তের কাছাকাছি কোথাও থাকে। আপনি Player.seekToDefaultPosition কল করে ডিফল্ট অবস্থানে যেতে পারেন।

লাইভ প্লেব্যাক UI

ExoPlayer-এর ডিফল্ট UI উপাদানগুলি লাইভ উইন্ডোর সময়কাল এবং এর মধ্যে বর্তমান প্লেব্যাক অবস্থান দেখায়। এর মানে প্রতিবার লাইভ উইন্ডো আপডেট করা হলে পজিশনটি পিছনের দিকে লাফ দিতে দেখা যাবে। আপনার যদি ভিন্ন আচরণের প্রয়োজন হয়, উদাহরণস্বরূপ ইউনিক্স সময় বা বর্তমান লাইভ অফসেট দেখানো, আপনি PlayerControlView ফর্ক করতে পারেন এবং আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন।

লাইভ প্লেব্যাক পরামিতি কনফিগার করা হচ্ছে

ExoPlayer লাইভ প্রান্ত থেকে প্লেব্যাক অবস্থানের অফসেট এবং এই অফসেট সামঞ্জস্য করতে ব্যবহার করা যেতে পারে এমন প্লেব্যাকের গতির পরিসীমা নিয়ন্ত্রণ করতে কিছু প্যারামিটার ব্যবহার করে৷

ExoPlayer এই প্যারামিটারগুলির জন্য তিনটি স্থান থেকে মান পায়, অগ্রাধিকারের ক্রমানুসারে (প্রথম পাওয়া মানটি ব্যবহার করা হয়):

  • প্রতি MediaItem মান MediaItem.Builder.setLiveConfiguration এ পাস করা হয়েছে।
  • গ্লোবাল ডিফল্ট মানগুলি DefaultMediaSourceFactory সেট করা হয়েছে।
  • মান মিডিয়া থেকে সরাসরি পড়া.

কোটলিন

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

জাভা

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

উপলব্ধ কনফিগারেশন মান হল:

  • targetOffsetMs : টার্গেট লাইভ অফসেট। প্লেব্যাক সম্ভব হলে প্লেব্যাকের সময় এই লাইভ অফসেটের কাছাকাছি যাওয়ার চেষ্টা করবে।
  • minOffsetMs : ন্যূনতম অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের নিচে যাওয়ার চেষ্টা করবে না।
  • maxOffsetMs : সর্বাধিক অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের উপরে যাওয়ার চেষ্টা করবে না।
  • minPlaybackSpeed : ন্যূনতম প্লেব্যাক গতি প্লেয়ার যখন লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করে পিছিয়ে পড়তে ব্যবহার করতে পারে।
  • maxPlaybackSpeed ​​: প্লেব্যাকের সর্বোচ্চ গতি যা প্লেয়ার ব্যবহার করতে পারে লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করার সময়।

প্লেব্যাক গতি সমন্বয়

কম লেটেন্সি লাইভ স্ট্রিম চালানোর সময়, ExoPlayer প্লেব্যাকের গতি সামান্য পরিবর্তন করে লাইভ অফসেট সামঞ্জস্য করে। প্লেয়ার মিডিয়া বা অ্যাপ দ্বারা প্রদত্ত টার্গেট লাইভ অফসেটের সাথে মেলানোর চেষ্টা করবে, তবে নেটওয়ার্কের অবস্থার পরিবর্তনে প্রতিক্রিয়া জানাতেও চেষ্টা করবে। উদাহরণস্বরূপ, যদি প্লেব্যাকের সময় রিবাফার হয়, প্লেয়ার লাইভ প্রান্ত থেকে আরও দূরে সরে যেতে প্লেব্যাককে কিছুটা কমিয়ে দেবে। যদি নেটওয়ার্ক আবার লাইভ প্রান্তের কাছাকাছি বাজানো সমর্থন করার জন্য যথেষ্ট স্থিতিশীল হয়ে ওঠে, প্লেয়ারটি লক্ষ্য লাইভ অফসেটের দিকে ফিরে যাওয়ার জন্য প্লেব্যাকের গতি বাড়িয়ে দেবে।

যদি স্বয়ংক্রিয় প্লেব্যাক গতির সামঞ্জস্য না হয়, তাহলে minPlaybackSpeed ​​এবং maxPlaybackSpeed ​​বৈশিষ্ট্যগুলিকে 1.0f এ সেট করে এটি নিষ্ক্রিয় করা যেতে পারে। একইভাবে, এটি 1.0f ছাড়া অন্য মানগুলিতে স্পষ্টভাবে সেট করে নন-লো-লেটেন্সি লাইভ স্ট্রিমগুলির জন্য সক্ষম করা যেতে পারে। এই বৈশিষ্ট্যগুলি কীভাবে সেট করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য উপরের কনফিগারেশন বিভাগটি দেখুন।

প্লেব্যাক গতি সমন্বয় অ্যালগরিদম কাস্টমাইজ করা

যদি গতি সামঞ্জস্য সক্ষম করা হয়, তাহলে একটি LivePlaybackSpeedControl সংজ্ঞায়িত করে যে কী সমন্বয় করা হবে। একটি কাস্টম LivePlaybackSpeedControl বাস্তবায়ন করা, অথবা ডিফল্ট বাস্তবায়ন কাস্টমাইজ করা সম্ভব, যা হল DefaultLivePlaybackSpeedControl । উভয় ক্ষেত্রেই, প্লেয়ার তৈরি করার সময় একটি উদাহরণ সেট করা যেতে পারে:

কোটলিন

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

জাভা

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

DefaultLivePlaybackSpeedControl এর প্রাসঙ্গিক কাস্টমাইজেশন প্যারামিটারগুলি হল:

  • fallbackMinPlaybackSpeed ​​এবং fallbackMaxPlaybackSpeed ​​: ন্যূনতম এবং সর্বোচ্চ প্লেব্যাক গতি যা সামঞ্জস্যের জন্য ব্যবহার করা যেতে পারে যদি মিডিয়া বা অ্যাপ-প্রদত্ত MediaItem সীমা নির্ধারণ না করে।
  • proportionalControlFactor : গতির সমন্বয় কতটা মসৃণ তা নিয়ন্ত্রণ করে। একটি উচ্চ মান সামঞ্জস্যগুলিকে আরও আকস্মিক এবং প্রতিক্রিয়াশীল করে তোলে, তবে শ্রবণযোগ্য হওয়ার সম্ভাবনাও বেশি। একটি ছোট মান গতির মধ্যে একটি মসৃণ রূপান্তর ঘটায়, ধীর হওয়ার খরচে।
  • targetLiveOffsetIncrementOnRebufferMs : এই মানটি লক্ষ্য লাইভ অফসেটে যোগ করা হয় যখনই একটি রিবাফার ঘটে, যাতে আরও সতর্কতার সাথে এগিয়ে যায়। মানটি 0 এ সেট করে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করা যেতে পারে।
  • minPossibleLiveOffsetSmoothingFactor : একটি সূচকীয় স্মুথিং ফ্যাক্টর যা বর্তমানে বাফার করা মিডিয়ার উপর ভিত্তি করে ন্যূনতম সম্ভাব্য লাইভ অফসেট ট্র্যাক করতে ব্যবহৃত হয়। 1 এর খুব কাছাকাছি একটি মান মানে অনুমানটি আরও সতর্ক এবং উন্নত নেটওয়ার্ক অবস্থার সাথে সামঞ্জস্য করতে বেশি সময় লাগতে পারে, যেখানে একটি কম মানের মানে অনুমানটি রিবাফারের উচ্চ ঝুঁকিতে দ্রুত সামঞ্জস্য করবে৷

বিহাইন্ডলাইভউইন্ডোএক্সেপশন এবং ERROR_CODE_BEHIND_LIVE_WINDOW

প্লেব্যাক পজিশন লাইভ উইন্ডোর পিছনে পড়ে যেতে পারে, উদাহরণস্বরূপ যদি প্লেয়ারটি যথেষ্ট দীর্ঘ সময়ের জন্য থামানো বা বাফার করা হয়। যদি এটি ঘটে তবে প্লেব্যাক ব্যর্থ হবে এবং ত্রুটি কোড ERROR_CODE_BEHIND_LIVE_WINDOW এর সাথে একটি ব্যতিক্রম Player.Listener.onPlayerError এর মাধ্যমে রিপোর্ট করা হবে। অ্যাপ্লিকেশন কোড ডিফল্ট অবস্থানে প্লেব্যাক পুনরায় শুরু করে এই ধরনের ত্রুটিগুলি পরিচালনা করতে ইচ্ছুক হতে পারে। ডেমো অ্যাপের প্লেয়ার অ্যাক্টিভিটি এই পদ্ধতির উদাহরণ দেয়।

কোটলিন

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

জাভা

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}

,

ExoPlayer কোনো বিশেষ কনফিগারেশন ছাড়াই সর্বাধিক অভিযোজিত লাইভ স্ট্রীমগুলিকে বাক্সের বাইরে খেলে৷ আরো বিস্তারিত জানার জন্য সমর্থিত ফরম্যাট পৃষ্ঠা দেখুন।

অভিযোজিত লাইভ স্ট্রিমগুলি উপলব্ধ মিডিয়ার একটি উইন্ডো অফার করে যা বর্তমান রিয়েল-টাইমের সাথে সরানোর জন্য নিয়মিত বিরতিতে আপডেট করা হয়। তার মানে প্লেব্যাক অবস্থান সবসময় এই উইন্ডোতে কোথাও থাকবে, বেশিরভাগ ক্ষেত্রেই বর্তমান রিয়েল-টাইমের কাছাকাছি যেখানে স্ট্রিমটি তৈরি করা হচ্ছে। বর্তমান রিয়েল-টাইম এবং প্লেব্যাক অবস্থানের মধ্যে পার্থক্যকে লাইভ অফসেট বলা হয়।

লাইভ প্লেব্যাক সনাক্ত করা এবং পর্যবেক্ষণ করা

প্রতিবার একটি লাইভ উইন্ডো আপডেট করা হলে, রেজিস্টার্ড Player.Listener শ্রোতা দৃষ্টান্তগুলি একটি onTimelineChanged ইভেন্ট পাবে৷ আপনি বিভিন্ন Player এবং Timeline.Window পদ্ধতিগুলি জিজ্ঞাসা করে বর্তমান লাইভ প্লেব্যাক সম্পর্কে বিশদ পুনরুদ্ধার করতে পারেন, নীচে তালিকাভুক্ত এবং নিম্নলিখিত চিত্রে দেখানো হয়েছে৷

লাইভ উইন্ডো

  • Player.isCurrentWindowLive ইঙ্গিত করে যে বর্তমানে যে মিডিয়া আইটেমটি চলছে সেটি একটি লাইভ স্ট্রিম কিনা। লাইভ স্ট্রিম শেষ হয়ে গেলেও এই মানটি এখনও সত্য।
  • Player.isCurrentWindowDynamic নির্দেশ করে যে বর্তমানে প্লে করা মিডিয়া আইটেম এখনও আপডেট করা হচ্ছে কিনা। এটি সাধারণত লাইভ স্ট্রিমগুলির জন্য সত্য যেগুলি এখনও শেষ হয়নি৷ মনে রাখবেন যে এই পতাকাটি কিছু ক্ষেত্রে অ-লাইভ স্ট্রিমগুলির জন্যও সত্য।
  • Player.getCurrentLiveOffset বর্তমান রিয়েল টাইম এবং প্লেব্যাক অবস্থানের মধ্যে অফসেট প্রদান করে (যদি উপলব্ধ থাকে)।
  • Player.getDuration বর্তমান লাইভ উইন্ডোর দৈর্ঘ্য প্রদান করে।
  • Player.getCurrentPosition লাইভ উইন্ডোর শুরুর সাপেক্ষে প্লেব্যাক অবস্থান প্রদান করে।
  • Player.getCurrentMediaItem বর্তমান মিডিয়া আইটেম রিটার্ন করে, যেখানে MediaItem.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটারের জন্য অ্যাপ-প্রদত্ত ওভাররাইড রয়েছে।
  • Player.getCurrentTimeline একটি Timeline বর্তমান মিডিয়া কাঠামো প্রদান করে। Player.getCurrentMediaItemIndex এবং Timeline.getWindow ব্যবহার করে Timeline থেকে বর্তমান Timeline.Window পুনরুদ্ধার করা যেতে পারে। Window মধ্যে:
    • Window.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটার রয়েছে। এই মানগুলি মিডিয়ার তথ্য এবং MediaItem.liveConfiguration এ সেট করা যেকোনো অ্যাপ-প্রদত্ত ওভাররাইডের উপর ভিত্তি করে।
    • Window.windowStartTimeMs হল Unix Epoch থেকে সেই সময় যেখানে লাইভ উইন্ডো শুরু হয়।
    • Window.getCurrentUnixTimeMs হল বর্তমান রিয়েল-টাইমের ইউনিক্স যুগের পরের সময়। এই মানটি সার্ভার এবং ক্লায়েন্টের মধ্যে পরিচিত ঘড়ির পার্থক্য দ্বারা সংশোধন করা যেতে পারে।
    • Window.getDefaultPositionMs হল লাইভ উইন্ডোর অবস্থান যেখানে প্লেয়ার ডিফল্টরূপে প্লেব্যাক শুরু করবে।

লাইভ স্ট্রীম খুঁজছেন

আপনি Player.seekTo ব্যবহার করে লাইভ উইন্ডোর মধ্যে যেকোনো জায়গায় যেতে পারেন। পাস করা অনুসন্ধানের অবস্থানটি লাইভ উইন্ডোর শুরুর সাথে সম্পর্কিত। উদাহরণস্বরূপ, seekTo(0) লাইভ উইন্ডোর শুরুতে চাইবে। প্লেয়ার চেষ্টা করবে একই লাইভ অফসেট রাখার জন্য যেভাবে একটি চাওয়ার পরে চাওয়া-পাওয়া পজিশন।

লাইভ উইন্ডোতেও একটি ডিফল্ট অবস্থান রয়েছে যেখানে প্লেব্যাক শুরু হওয়ার কথা। এই অবস্থানটি সাধারণত লাইভ প্রান্তের কাছাকাছি কোথাও থাকে। আপনি Player.seekToDefaultPosition কল করে ডিফল্ট অবস্থানে যেতে পারেন।

লাইভ প্লেব্যাক UI

ExoPlayer-এর ডিফল্ট UI উপাদানগুলি লাইভ উইন্ডোর সময়কাল এবং এর মধ্যে বর্তমান প্লেব্যাক অবস্থান দেখায়। এর মানে প্রতিবার লাইভ উইন্ডো আপডেট করা হলে পজিশনটি পিছনের দিকে লাফ দিতে দেখা যাবে। আপনার যদি ভিন্ন আচরণের প্রয়োজন হয়, উদাহরণস্বরূপ ইউনিক্স সময় বা বর্তমান লাইভ অফসেট দেখানো, আপনি PlayerControlView ফর্ক করতে পারেন এবং আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন।

লাইভ প্লেব্যাক পরামিতি কনফিগার করা হচ্ছে

ExoPlayer লাইভ প্রান্ত থেকে প্লেব্যাক অবস্থানের অফসেট এবং এই অফসেট সামঞ্জস্য করতে ব্যবহার করা যেতে পারে এমন প্লেব্যাকের গতির পরিসীমা নিয়ন্ত্রণ করতে কিছু প্যারামিটার ব্যবহার করে৷

ExoPlayer এই প্যারামিটারগুলির জন্য তিনটি স্থান থেকে মান পায়, অগ্রাধিকারের ক্রমানুসারে (প্রথম পাওয়া মানটি ব্যবহার করা হয়):

  • প্রতি MediaItem মান MediaItem.Builder.setLiveConfiguration এ পাস করা হয়েছে।
  • গ্লোবাল ডিফল্ট মানগুলি DefaultMediaSourceFactory সেট করা হয়েছে।
  • মান মিডিয়া থেকে সরাসরি পড়া.

কোটলিন

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

জাভা

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

উপলব্ধ কনফিগারেশন মান হল:

  • targetOffsetMs : টার্গেট লাইভ অফসেট। প্লেব্যাক সম্ভব হলে প্লেব্যাকের সময় এই লাইভ অফসেটের কাছাকাছি যাওয়ার চেষ্টা করবে।
  • minOffsetMs : ন্যূনতম অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের নিচে যাওয়ার চেষ্টা করবে না।
  • maxOffsetMs : সর্বাধিক অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের উপরে যাওয়ার চেষ্টা করবে না।
  • minPlaybackSpeed : ন্যূনতম প্লেব্যাক গতি প্লেয়ার যখন লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করে পিছিয়ে পড়তে ব্যবহার করতে পারে।
  • maxPlaybackSpeed ​​: প্লেব্যাকের সর্বোচ্চ গতি যা প্লেয়ার ব্যবহার করতে পারে লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করার সময়।

প্লেব্যাক গতি সমন্বয়

কম লেটেন্সি লাইভ স্ট্রিম চালানোর সময়, ExoPlayer প্লেব্যাকের গতি সামান্য পরিবর্তন করে লাইভ অফসেট সামঞ্জস্য করে। প্লেয়ার মিডিয়া বা অ্যাপ দ্বারা প্রদত্ত টার্গেট লাইভ অফসেটের সাথে মেলানোর চেষ্টা করবে, তবে নেটওয়ার্কের অবস্থার পরিবর্তনে প্রতিক্রিয়া জানাতেও চেষ্টা করবে। উদাহরণস্বরূপ, যদি প্লেব্যাকের সময় রিবাফার হয়, প্লেয়ার লাইভ প্রান্ত থেকে আরও দূরে সরে যেতে প্লেব্যাককে কিছুটা কমিয়ে দেবে। যদি নেটওয়ার্ক আবার লাইভ প্রান্তের কাছাকাছি বাজানো সমর্থন করার জন্য যথেষ্ট স্থিতিশীল হয়ে ওঠে, প্লেয়ারটি লক্ষ্য লাইভ অফসেটের দিকে ফিরে যাওয়ার জন্য প্লেব্যাকের গতি বাড়িয়ে দেবে।

যদি স্বয়ংক্রিয় প্লেব্যাক গতির সামঞ্জস্য না হয়, তাহলে minPlaybackSpeed ​​এবং maxPlaybackSpeed ​​বৈশিষ্ট্যগুলিকে 1.0f এ সেট করে এটি নিষ্ক্রিয় করা যেতে পারে। একইভাবে, এটি 1.0f ছাড়া অন্য মানগুলিতে স্পষ্টভাবে সেট করে নন-লো-লেটেন্সি লাইভ স্ট্রিমগুলির জন্য সক্ষম করা যেতে পারে। এই বৈশিষ্ট্যগুলি কীভাবে সেট করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য উপরের কনফিগারেশন বিভাগটি দেখুন।

প্লেব্যাক গতি সমন্বয় অ্যালগরিদম কাস্টমাইজ করা

যদি গতি সামঞ্জস্য সক্ষম করা হয়, তাহলে একটি LivePlaybackSpeedControl সংজ্ঞায়িত করে যে কী সমন্বয় করা হবে। একটি কাস্টম LivePlaybackSpeedControl বাস্তবায়ন করা, অথবা ডিফল্ট বাস্তবায়ন কাস্টমাইজ করা সম্ভব, যা হল DefaultLivePlaybackSpeedControl । উভয় ক্ষেত্রেই, প্লেয়ার তৈরি করার সময় একটি উদাহরণ সেট করা যেতে পারে:

কোটলিন

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

জাভা

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

DefaultLivePlaybackSpeedControl এর প্রাসঙ্গিক কাস্টমাইজেশন প্যারামিটারগুলি হল:

  • fallbackMinPlaybackSpeed ​​এবং fallbackMaxPlaybackSpeed ​​: ন্যূনতম এবং সর্বোচ্চ প্লেব্যাক গতি যা সামঞ্জস্যের জন্য ব্যবহার করা যেতে পারে যদি মিডিয়া বা অ্যাপ-প্রদত্ত MediaItem সীমা নির্ধারণ না করে।
  • proportionalControlFactor : গতির সমন্বয় কতটা মসৃণ তা নিয়ন্ত্রণ করে। একটি উচ্চ মান সামঞ্জস্যগুলিকে আরও আকস্মিক এবং প্রতিক্রিয়াশীল করে তোলে, তবে শ্রবণযোগ্য হওয়ার সম্ভাবনাও বেশি। একটি ছোট মান গতির মধ্যে একটি মসৃণ রূপান্তর ঘটায়, ধীর হওয়ার খরচে।
  • targetLiveOffsetIncrementOnRebufferMs : এই মানটি লক্ষ্য লাইভ অফসেটে যোগ করা হয় যখনই একটি রিবাফার ঘটে, যাতে আরও সতর্কতার সাথে এগিয়ে যায়। মানটি 0 এ সেট করে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করা যেতে পারে।
  • minPossibleLiveOffsetSmoothingFactor : একটি সূচকীয় স্মুথিং ফ্যাক্টর যা বর্তমানে বাফার করা মিডিয়ার উপর ভিত্তি করে ন্যূনতম সম্ভাব্য লাইভ অফসেট ট্র্যাক করতে ব্যবহৃত হয়। 1 এর খুব কাছাকাছি একটি মান মানে অনুমানটি আরও সতর্ক এবং উন্নত নেটওয়ার্ক অবস্থার সাথে সামঞ্জস্য করতে বেশি সময় লাগতে পারে, যেখানে একটি কম মানের মানে অনুমানটি রিবাফারের উচ্চ ঝুঁকিতে দ্রুত সামঞ্জস্য করবে৷

বিহাইন্ডলাইভউইন্ডোএক্সেপশন এবং ERROR_CODE_BEHIND_LIVE_WINDOW

প্লেব্যাক পজিশন লাইভ উইন্ডোর পিছনে পড়ে যেতে পারে, উদাহরণস্বরূপ যদি প্লেয়ারটি যথেষ্ট দীর্ঘ সময়ের জন্য থামানো বা বাফার করা হয়। যদি এটি ঘটে তবে প্লেব্যাক ব্যর্থ হবে এবং ত্রুটি কোড ERROR_CODE_BEHIND_LIVE_WINDOW এর সাথে একটি ব্যতিক্রম Player.Listener.onPlayerError এর মাধ্যমে রিপোর্ট করা হবে। অ্যাপ্লিকেশন কোড ডিফল্ট অবস্থানে প্লেব্যাক পুনরায় শুরু করে এই ধরনের ত্রুটিগুলি পরিচালনা করতে ইচ্ছুক হতে পারে। ডেমো অ্যাপের প্লেয়ার অ্যাক্টিভিটি এই পদ্ধতির উদাহরণ দেয়।

কোটলিন

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

জাভা

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}

,

ExoPlayer কোনো বিশেষ কনফিগারেশন ছাড়াই সর্বাধিক অভিযোজিত লাইভ স্ট্রীমগুলিকে বাক্সের বাইরে খেলে৷ আরো বিস্তারিত জানার জন্য সমর্থিত ফরম্যাট পৃষ্ঠা দেখুন।

অভিযোজিত লাইভ স্ট্রিমগুলি উপলব্ধ মিডিয়ার একটি উইন্ডো অফার করে যা বর্তমান রিয়েল-টাইমের সাথে সরানোর জন্য নিয়মিত বিরতিতে আপডেট করা হয়। তার মানে প্লেব্যাক অবস্থান সবসময় এই উইন্ডোতে কোথাও থাকবে, বেশিরভাগ ক্ষেত্রেই বর্তমান রিয়েল-টাইমের কাছাকাছি যেখানে স্ট্রিমটি তৈরি করা হচ্ছে। বর্তমান রিয়েল-টাইম এবং প্লেব্যাক অবস্থানের মধ্যে পার্থক্যকে লাইভ অফসেট বলা হয়।

লাইভ প্লেব্যাক সনাক্ত করা এবং পর্যবেক্ষণ করা

প্রতিবার একটি লাইভ উইন্ডো আপডেট করা হলে, রেজিস্টার্ড Player.Listener শ্রোতা দৃষ্টান্তগুলি একটি onTimelineChanged ইভেন্ট পাবে৷ আপনি বিভিন্ন Player এবং Timeline.Window পদ্ধতিগুলি জিজ্ঞাসা করে বর্তমান লাইভ প্লেব্যাক সম্পর্কে বিশদ পুনরুদ্ধার করতে পারেন, নীচে তালিকাভুক্ত এবং নিম্নলিখিত চিত্রে দেখানো হয়েছে৷

লাইভ উইন্ডো

  • Player.isCurrentWindowLive ইঙ্গিত করে যে বর্তমানে যে মিডিয়া আইটেমটি চলছে সেটি একটি লাইভ স্ট্রিম কিনা। লাইভ স্ট্রিম শেষ হয়ে গেলেও এই মানটি এখনও সত্য।
  • Player.isCurrentWindowDynamic নির্দেশ করে যে বর্তমানে প্লে করা মিডিয়া আইটেম এখনও আপডেট করা হচ্ছে কিনা। এটি সাধারণত লাইভ স্ট্রিমগুলির জন্য সত্য যেগুলি এখনও শেষ হয়নি৷ মনে রাখবেন যে এই পতাকাটি কিছু ক্ষেত্রে অ-লাইভ স্ট্রিমগুলির জন্যও সত্য।
  • Player.getCurrentLiveOffset বর্তমান রিয়েল টাইম এবং প্লেব্যাক অবস্থানের মধ্যে অফসেট প্রদান করে (যদি উপলব্ধ থাকে)।
  • Player.getDuration বর্তমান লাইভ উইন্ডোর দৈর্ঘ্য প্রদান করে।
  • Player.getCurrentPosition লাইভ উইন্ডোর শুরুর সাপেক্ষে প্লেব্যাক অবস্থান প্রদান করে।
  • Player.getCurrentMediaItem বর্তমান মিডিয়া আইটেম রিটার্ন করে, যেখানে MediaItem.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটারের জন্য অ্যাপ-প্রদত্ত ওভাররাইড রয়েছে।
  • Player.getCurrentTimeline একটি Timeline বর্তমান মিডিয়া কাঠামো প্রদান করে। Player.getCurrentMediaItemIndex এবং Timeline.getWindow ব্যবহার করে Timeline থেকে বর্তমান Timeline.Window পুনরুদ্ধার করা যেতে পারে। Window মধ্যে:
    • Window.liveConfiguration এ টার্গেট লাইভ অফসেট এবং লাইভ অফসেট অ্যাডজাস্টমেন্ট প্যারামিটার রয়েছে। এই মানগুলি মিডিয়ার তথ্য এবং MediaItem.liveConfiguration এ সেট করা যেকোনো অ্যাপ-প্রদত্ত ওভাররাইডের উপর ভিত্তি করে।
    • Window.windowStartTimeMs হল Unix Epoch থেকে সেই সময় যেখানে লাইভ উইন্ডো শুরু হয়।
    • Window.getCurrentUnixTimeMs হল বর্তমান রিয়েল-টাইমের ইউনিক্স যুগের পরের সময়। এই মানটি সার্ভার এবং ক্লায়েন্টের মধ্যে পরিচিত ঘড়ির পার্থক্য দ্বারা সংশোধন করা যেতে পারে।
    • Window.getDefaultPositionMs হল লাইভ উইন্ডোর অবস্থান যেখানে প্লেয়ার ডিফল্টরূপে প্লেব্যাক শুরু করবে।

লাইভ স্ট্রীম খুঁজছেন

আপনি Player.seekTo ব্যবহার করে লাইভ উইন্ডোর মধ্যে যেকোনো জায়গায় যেতে পারেন। পাস করা অনুসন্ধানের অবস্থানটি লাইভ উইন্ডোর শুরুর সাথে সম্পর্কিত। উদাহরণস্বরূপ, seekTo(0) লাইভ উইন্ডোর শুরুতে চাইবে। প্লেয়ার চেষ্টা করবে একই লাইভ অফসেট রাখার জন্য যেভাবে একটি চাওয়ার পরে চাওয়া-পাওয়া পজিশন।

লাইভ উইন্ডোতেও একটি ডিফল্ট অবস্থান রয়েছে যেখানে প্লেব্যাক শুরু হওয়ার কথা। এই অবস্থানটি সাধারণত লাইভ প্রান্তের কাছাকাছি কোথাও থাকে। আপনি Player.seekToDefaultPosition কল করে ডিফল্ট অবস্থানে যেতে পারেন।

লাইভ প্লেব্যাক UI

ExoPlayer-এর ডিফল্ট UI উপাদানগুলি লাইভ উইন্ডোর সময়কাল এবং এর মধ্যে বর্তমান প্লেব্যাক অবস্থান দেখায়। এর মানে প্রতিবার লাইভ উইন্ডো আপডেট করা হলে পজিশনটি পিছনের দিকে লাফ দিতে দেখা যাবে। আপনার যদি ভিন্ন আচরণের প্রয়োজন হয়, উদাহরণস্বরূপ ইউনিক্স সময় বা বর্তমান লাইভ অফসেট দেখানো, আপনি PlayerControlView ফর্ক করতে পারেন এবং আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন।

লাইভ প্লেব্যাক পরামিতি কনফিগার করা হচ্ছে

ExoPlayer লাইভ প্রান্ত থেকে প্লেব্যাক অবস্থানের অফসেট এবং এই অফসেট সামঞ্জস্য করতে ব্যবহার করা যেতে পারে এমন প্লেব্যাকের গতির পরিসীমা নিয়ন্ত্রণ করতে কিছু প্যারামিটার ব্যবহার করে৷

ExoPlayer এই প্যারামিটারগুলির জন্য তিনটি স্থান থেকে মান পায়, অগ্রাধিকারের ক্রমানুসারে (প্রথম পাওয়া মানটি ব্যবহার করা হয়):

  • প্রতি MediaItem মান MediaItem.Builder.setLiveConfiguration এ পাস করা হয়েছে।
  • গ্লোবাল ডিফল্ট মানগুলি DefaultMediaSourceFactory সেট করা হয়েছে।
  • মান মিডিয়া থেকে সরাসরি পড়া.

কোটলিন

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

জাভা

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

উপলব্ধ কনফিগারেশন মান হল:

  • targetOffsetMs : টার্গেট লাইভ অফসেট। প্লেব্যাক সম্ভব হলে প্লেব্যাকের সময় এই লাইভ অফসেটের কাছাকাছি যাওয়ার চেষ্টা করবে।
  • minOffsetMs : ন্যূনতম অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের নিচে যাওয়ার চেষ্টা করবে না।
  • maxOffsetMs : সর্বাধিক অনুমোদিত লাইভ অফসেট। এমনকি বর্তমান নেটওয়ার্ক অবস্থার সাথে অফসেট সামঞ্জস্য করার সময়, প্লেব্যাকের সময় প্লেয়ার এই অফসেটের উপরে যাওয়ার চেষ্টা করবে না।
  • minPlaybackSpeed : ন্যূনতম প্লেব্যাক গতি প্লেয়ার যখন লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করে পিছিয়ে পড়তে ব্যবহার করতে পারে।
  • maxPlaybackSpeed ​​: প্লেব্যাকের সর্বোচ্চ গতি যা প্লেয়ার ব্যবহার করতে পারে লক্ষ্য লাইভ অফসেটে পৌঁছানোর চেষ্টা করার সময়।

প্লেব্যাক গতি সমন্বয়

কম লেটেন্সি লাইভ স্ট্রিম চালানোর সময়, ExoPlayer প্লেব্যাকের গতি সামান্য পরিবর্তন করে লাইভ অফসেট সামঞ্জস্য করে। প্লেয়ার মিডিয়া বা অ্যাপ দ্বারা প্রদত্ত টার্গেট লাইভ অফসেটের সাথে মেলানোর চেষ্টা করবে, তবে নেটওয়ার্কের অবস্থার পরিবর্তনে প্রতিক্রিয়া জানাতেও চেষ্টা করবে। উদাহরণস্বরূপ, যদি প্লেব্যাকের সময় রিবাফার হয়, প্লেয়ার লাইভ প্রান্ত থেকে আরও দূরে সরে যেতে প্লেব্যাককে কিছুটা কমিয়ে দেবে। যদি নেটওয়ার্ক আবার লাইভ প্রান্তের কাছাকাছি বাজানো সমর্থন করার জন্য যথেষ্ট স্থিতিশীল হয়ে ওঠে, প্লেয়ারটি লক্ষ্য লাইভ অফসেটের দিকে ফিরে যাওয়ার জন্য প্লেব্যাকের গতি বাড়িয়ে দেবে।

যদি স্বয়ংক্রিয় প্লেব্যাক গতির সামঞ্জস্য না হয়, তাহলে minPlaybackSpeed ​​এবং maxPlaybackSpeed ​​বৈশিষ্ট্যগুলিকে 1.0f এ সেট করে এটি নিষ্ক্রিয় করা যেতে পারে। একইভাবে, এটি 1.0f ছাড়া অন্য মানগুলিতে স্পষ্টভাবে সেট করে নন-লো-লেটেন্সি লাইভ স্ট্রিমগুলির জন্য সক্ষম করা যেতে পারে। এই বৈশিষ্ট্যগুলি কীভাবে সেট করা যায় সে সম্পর্কে আরও বিশদ বিবরণের জন্য উপরের কনফিগারেশন বিভাগটি দেখুন।

প্লেব্যাক গতি সমন্বয় অ্যালগরিদম কাস্টমাইজ করা

যদি গতি সামঞ্জস্য সক্ষম করা হয়, তাহলে একটি LivePlaybackSpeedControl সংজ্ঞায়িত করে যে কী সমন্বয় করা হবে। একটি কাস্টম LivePlaybackSpeedControl বাস্তবায়ন করা, অথবা ডিফল্ট বাস্তবায়ন কাস্টমাইজ করা সম্ভব, যা হল DefaultLivePlaybackSpeedControl । উভয় ক্ষেত্রেই, প্লেয়ার তৈরি করার সময় একটি উদাহরণ সেট করা যেতে পারে:

কোটলিন

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

জাভা

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

DefaultLivePlaybackSpeedControl এর প্রাসঙ্গিক কাস্টমাইজেশন প্যারামিটারগুলি হল:

  • fallbackMinPlaybackSpeed ​​এবং fallbackMaxPlaybackSpeed ​​: ন্যূনতম এবং সর্বোচ্চ প্লেব্যাক গতি যা সামঞ্জস্যের জন্য ব্যবহার করা যেতে পারে যদি মিডিয়া বা অ্যাপ-প্রদত্ত MediaItem সীমা নির্ধারণ না করে।
  • proportionalControlFactor : গতির সমন্বয় কতটা মসৃণ তা নিয়ন্ত্রণ করে। একটি উচ্চ মান সামঞ্জস্যগুলিকে আরও আকস্মিক এবং প্রতিক্রিয়াশীল করে তোলে, তবে শ্রবণযোগ্য হওয়ার সম্ভাবনাও বেশি। একটি ছোট মান গতির মধ্যে একটি মসৃণ রূপান্তর ঘটায়, ধীর হওয়ার খরচে।
  • targetLiveOffsetIncrementOnRebufferMs : এই মানটি লক্ষ্য লাইভ অফসেটে যোগ করা হয় যখনই একটি রিবাফার ঘটে, যাতে আরও সতর্কতার সাথে এগিয়ে যায়। মানটি 0 এ সেট করে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করা যেতে পারে।
  • minPossibleLiveOffsetSmoothingFactor : একটি সূচকীয় স্মুথিং ফ্যাক্টর যা বর্তমানে বাফার করা মিডিয়ার উপর ভিত্তি করে ন্যূনতম সম্ভাব্য লাইভ অফসেট ট্র্যাক করতে ব্যবহৃত হয়। 1 এর খুব কাছাকাছি একটি মান মানে অনুমানটি আরও সতর্ক এবং উন্নত নেটওয়ার্ক অবস্থার সাথে সামঞ্জস্য করতে বেশি সময় লাগতে পারে, যেখানে একটি কম মানের মানে অনুমানটি রিবাফারের উচ্চ ঝুঁকিতে দ্রুত সামঞ্জস্য করবে৷

বিহাইন্ডলাইভউইন্ডোএক্সেপশন এবং ERROR_CODE_BEHIND_LIVE_WINDOW

প্লেব্যাক পজিশন লাইভ উইন্ডোর পিছনে পড়ে যেতে পারে, উদাহরণস্বরূপ যদি প্লেয়ারটি যথেষ্ট দীর্ঘ সময়ের জন্য থামানো বা বাফার করা হয়। যদি এটি ঘটে তবে প্লেব্যাক ব্যর্থ হবে এবং ত্রুটি কোড ERROR_CODE_BEHIND_LIVE_WINDOW এর সাথে একটি ব্যতিক্রম Player.Listener.onPlayerError এর মাধ্যমে রিপোর্ট করা হবে। অ্যাপ্লিকেশন কোড ডিফল্ট অবস্থানে প্লেব্যাক পুনরায় শুরু করে এই ধরনের ত্রুটিগুলি পরিচালনা করতে ইচ্ছুক হতে পারে। ডেমো অ্যাপের প্লেয়ার অ্যাক্টিভিটি এই পদ্ধতির উদাহরণ দেয়।

কোটলিন

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

জাভা

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}