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হলো ইউনিক্স যুগের পর থেকে সেই সময় যখন লাইভ উইন্ডো শুরু হয়। -
Window.getCurrentUnixTimeMsহল বর্তমান রিয়েল-টাইমের ইউনিক্স যুগের পর থেকে সময়। এই মানটি সার্ভার এবং ক্লায়েন্টের মধ্যে একটি পরিচিত ঘড়ির পার্থক্য দ্বারা সংশোধন করা যেতে পারে। -
Window.getDefaultPositionMsহলো লাইভ উইন্ডোর সেই অবস্থান যেখানে প্লেয়ারটি ডিফল্টভাবে প্লেব্যাক শুরু করবে।
-
লাইভ স্ট্রিমগুলিতে খুঁজছি
আপনি Player.seekTo ব্যবহার করে লাইভ উইন্ডোর যেকোনো জায়গায় seek করতে পারেন। পাস করা seek পজিশনটি লাইভ উইন্ডোর শুরুর সাথে সম্পর্কিত। উদাহরণস্বরূপ, seekTo(0) লাইভ উইন্ডোর শুরুতে seek করবে। প্লেয়ার seek-এর পরে seeked-to পজিশনের মতো একই লাইভ অফসেট রাখার চেষ্টা করবে।
লাইভ উইন্ডোর একটি ডিফল্ট অবস্থানও থাকে যেখানে প্লেব্যাক শুরু হওয়ার কথা। এই অবস্থানটি সাধারণত লাইভ প্রান্তের কাছাকাছি কোথাও থাকে। আপনি Player.seekToDefaultPosition কল করে ডিফল্ট অবস্থানে যেতে পারেন।
লাইভ প্লেব্যাক UI
ExoPlayer এর ডিফল্ট UI উপাদানগুলি লাইভ উইন্ডোর সময়কাল এবং এর মধ্যে বর্তমান প্লেব্যাক অবস্থান দেখায়। এর অর্থ হল প্রতিবার লাইভ উইন্ডো আপডেট করার সময় অবস্থানটি পিছনের দিকে লাফিয়ে লাফিয়ে উঠবে। যদি আপনার ভিন্ন আচরণের প্রয়োজন হয়, উদাহরণস্বরূপ Unix সময় দেখানো বা বর্তমান লাইভ অফসেট দেখানো, তাহলে আপনি PlayerControlView ফোর্ক করতে পারেন এবং আপনার প্রয়োজন অনুসারে এটি পরিবর্তন করতে পারেন।
লাইভ প্লেব্যাক প্যারামিটার কনফিগার করা
এক্সোপ্লেয়ার লাইভ এজ থেকে প্লেব্যাক পজিশনের অফসেট এবং এই অফসেট সামঞ্জস্য করতে ব্যবহার করা যেতে পারে এমন প্লেব্যাক গতির পরিসর নিয়ন্ত্রণ করতে কিছু প্যারামিটার ব্যবহার করে।
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 এর খুব কাছাকাছি মান মানে হল অনুমানটি আরও সতর্ক এবং উন্নত নেটওয়ার্ক অবস্থার সাথে সামঞ্জস্য করতে আরও বেশি সময় লাগতে পারে, যেখানে কম মানের অর্থ হল অনুমানটি দ্রুত সামঞ্জস্য হবে এবং রিবাফারে যাওয়ার ঝুঁকি বেশি হবে।
BehindLiveWindowException এবং ERROR_CODE_BEHIND_LIVE_WINDOW
প্লেব্যাক পজিশন লাইভ উইন্ডোর পিছনে পড়ে যেতে পারে, উদাহরণস্বরূপ, যদি প্লেয়ারটি যথেষ্ট সময় ধরে পজ করা থাকে বা বাফার করা থাকে। যদি এটি ঘটে তবে প্লেব্যাক ব্যর্থ হবে এবং ত্রুটি কোড ERROR_CODE_BEHIND_LIVE_WINDOW সহ একটি ব্যতিক্রম Player.Listener.onPlayerError এর মাধ্যমে রিপোর্ট করা হবে। অ্যাপ্লিকেশন কোডটি ডিফল্ট অবস্থানে প্লেব্যাক পুনরায় শুরু করে এই ধরনের ত্রুটিগুলি পরিচালনা করতে চাইতে পারে। ডেমো অ্যাপের PlayerActivity এই পদ্ধতির উদাহরণ।
কোটলিন
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 } }