Media3 1.9.0 প্রকাশিত হয়েছে! সাধারণ বাগ ফিক্স এবং পারফরম্যান্সের উন্নতির পাশাপাশি, এই সর্বশেষ রিলিজে চারটি নতুন অথবা ব্যাপকভাবে পুনর্লিখিত মডিউলও রয়েছে:
-
media3-inspector- প্লেব্যাকের বাইরে মেটাডেটা এবং ফ্রেম বের করে। -
media3-ui-compose-material3- মাত্র কয়েকটি ধাপে একটি সাধারণ Material3 Compose Media UI তৈরি করুন -
media3-cast- কাস্ট এবং স্থানীয় প্লেব্যাকের মধ্যে রূপান্তর স্বয়ংক্রিয়ভাবে পরিচালনা করে -
media3-decoder-av1- dav1d লাইব্রেরির উপর ভিত্তি করে পুনর্লিখিত এক্সটেনশন ডিকোডারের মাধ্যমে সামঞ্জস্যপূর্ণ AV1 প্লেব্যাক।
আমরা PreloadManager এ ক্যাশিং ও মেমরি ব্যবস্থাপনার উন্নতি সাধন করেছি এবং ExoPlayer , Transformer ও MediaSession বেশ কিছু নতুন সরলীকরণ যুক্ত করেছি।
এই রিলিজের মাধ্যমে আপনি মিডিয়া এডিট প্রিভিউ করার জন্য CompositionPlayer এ প্রথম পরীক্ষামূলক অ্যাক্সেসও পাবেন।
আরও জানতে পড়তে থাকুন, এবং বরাবরের মতোই এই রিলিজের পরিবর্তনগুলোর একটি বিশদ বিবরণের জন্য সম্পূর্ণ রিলিজ নোটগুলো দেখে নিন।
প্লেব্যাকের বাইরে মেটাডেটা এবং ফ্রেম বের করুন
এমন অনেক পরিস্থিতি আছে যেখানে আপনি প্লেব্যাক শুরু না করেই মিডিয়া পরীক্ষা করতে চান। উদাহরণস্বরূপ, আপনি হয়তো জানতে চাইতে পারেন যে এতে কোন কোন ফরম্যাট রয়েছে বা এর সময়কাল কত, অথবা থাম্বনেইল সংগ্রহ করতে চাইতে পারেন।
নতুন media3-inspector মডিউলটি প্লেব্যাক ছাড়াই মিডিয়া পরিদর্শনের জন্য প্রয়োজনীয় সমস্ত ইউটিলিটি এক জায়গায় একত্রিত করে:
- একটি
MediaItemথেকে সময়কাল, ফরম্যাট এবং স্ট্যাটিক মেটাডেটা পড়ার জন্যMetadataRetriever। - কোনো আইটেম থেকে ফ্রেম বা থাম্বনেইল পাওয়ার জন্য
FrameExtractorকরা হয়। - অ্যান্ড্রয়েড প্ল্যাটফর্মের MediaExtractor ক্লাসের সরাসরি বিকল্প হিসেবে
MediaExtractorCompatব্যবহার করুন, এবং ফাইলটিতে থাকা স্যাম্পলগুলো সম্পর্কে বিস্তারিত তথ্য জানুন।
MetadataRetriever এবং FrameExtractor একটি সাধারণ AutoCloseable প্যাটার্ন অনুসরণ করে। আরও বিস্তারিত জানতে আমাদের নতুন গাইড পেজগুলো দেখুন।
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
মাত্র কয়েকটি ধাপে একটি বেসিক Material3 Compose Media UI তৈরি করুন।
পূর্ববর্তী রিলিজগুলোতে আমরা Compose UI এলিমেন্ট এবং আপনার প্লেয়ার ইনস্ট্যান্সের মধ্যে কানেক্টর কোড প্রদান করা শুরু করেছিলাম। Media3 1.9.0-এর সাথে, আমরা media3-ui-compose-material3 নামে একটি নতুন মডিউল যুক্ত করেছি, যাতে রয়েছে সম্পূর্ণ স্টাইল করা Material3 বাটন এবং কন্টেন্ট এলিমেন্ট। এগুলি আপনাকে মাত্র কয়েকটি ধাপে একটি মিডিয়া UI তৈরি করার সুযোগ দেয় এবং স্টাইল কাস্টমাইজ করার জন্য সমস্ত নমনীয়তা প্রদান করে। আপনি যদি নিজের UI স্টাইল তৈরি করতে পছন্দ করেন, তবে আপনি বিল্ডিং ব্লকগুলি ব্যবহার করতে পারেন যা সমস্ত আপডেট এবং সংযোগের লজিকের যত্ন নেয়, ফলে আপনাকে শুধুমাত্র UI এলিমেন্ট ডিজাইন করার দিকে মনোযোগ দিতে হবে। Compose UI মডিউলগুলির জন্য অনুগ্রহ করে আমাদের বিস্তারিত গাইড পেজগুলি দেখুন।
আমরা আরও অনেক কম্পোজ কম্পোনেন্ট নিয়েও কাজ করে যাচ্ছি, যেমন একটি প্রি-বিল্ট সিক বার, PlayerView এর একটি সম্পূর্ণ রেডিমেড বিকল্প, সেইসাথে সাবটাইটেল এবং বিজ্ঞাপন ইন্টিগ্রেশন।
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}

রেডিমেড উপাদানসহ সহজ কম্পোজ প্লেয়ার UI
কাস্ট এবং স্থানীয় প্লেব্যাকের মধ্যে পরিবর্তন স্বয়ংক্রিয়ভাবে পরিচালনা করুন
media3-cast মডিউলের CastPlayer-টিকে নতুন করে লেখা হয়েছে, যাতে এটি লোকাল প্লেব্যাক (যেমন ExoPlayer মাধ্যমে) এবং রিমোট কাস্ট প্লেব্যাকের মধ্যে স্বয়ংক্রিয়ভাবে ট্রানজিশন পরিচালনা করতে পারে।
আপনার MediaSession সেট আপ করার সময়, শুধু আপনার ExoPlayer ঘিরে একটি CastPlayer তৈরি করুন এবং আপনার UI-তে একটি MediaRouteButton যোগ করুন, তাহলেই কাজ শেষ!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}

Media3 সেশন ডেমো অ্যাপে নতুন CastPlayer সংযোজন
dav1d-এর উপর ভিত্তি করে পুনর্লিখিত এক্সটেনশনের মাধ্যমে সামঞ্জস্যপূর্ণ AV1 প্লেব্যাক।
১.৯.০ রিলিজটিতে জনপ্রিয় dav1d লাইব্রেরির উপর ভিত্তি করে সম্পূর্ণ নতুন করে লেখা একটি AV1 এক্সটেনশন মডিউল রয়েছে।
অন্যান্য সকল এক্সটেনশন ডিকোডার মডিউলের মতোই, অনুগ্রহ করে মনে রাখবেন যে প্রাসঙ্গিক নেটিভ কোড সঠিকভাবে বান্ডল করার জন্য এটিকে সোর্স থেকে বিল্ড করতে হয়। একটি ডিকোডার বান্ডল করলে সকল ডিভাইসে সামঞ্জস্য এবং ফরম্যাট সাপোর্ট পাওয়া যায়, কিন্তু যেহেতু এটি আপনার প্রসেসে ডিকোডিং সম্পন্ন করে, তাই এটি বিশ্বাসযোগ্য কন্টেন্টের জন্য সবচেয়ে উপযুক্ত।
PreloadManager-এ ক্যাশিং এবং মেমরি ম্যানেজমেন্ট একীভূত করুন
আমরা আমাদের PreloadManager আরও উন্নত করেছি। এটি আগে থেকেই আপনাকে প্লেব্যাকের বাইরে মেমরিতে মিডিয়া প্রি-লোড করতে এবং প্রয়োজনে নির্বিঘ্নে প্লেয়ারের কাছে তা হস্তান্তর করতে সক্ষম করত। যদিও এটি বেশ ভালো পারফর্ম করত, তবুও ভুলবশত অতিরিক্ত প্রি-লোড করে মেমরির সীমা অতিক্রম না করার ব্যাপারে সতর্ক থাকতে হতো। তাই Media3 1.9.0-এর সাথে, আমরা দুটি ফিচার যুক্ত করেছি যা এই কাজটিকে আরও অনেক সহজ এবং স্থিতিশীল করে তুলেছে:
- ক্যাশিং সাপোর্ট – কতদূর প্রি-লোড করতে হবে তা নির্ধারণ করার সময়, আপনি এখন প্রি-লোড করা আইটেমগুলির জন্য টার্গেট স্টেট হিসেবে
PreloadStatus.specifiedRangeCached(0, 5000)বেছে নিতে পারেন। এটি ডেটা মেমরিতে লোড করার পরিবর্তে নির্দিষ্ট রেঞ্জটিকে আপনার ডিস্কের ক্যাশে যুক্ত করবে। এর ফলে, আপনি প্রি-লোডিংয়ের জন্য অনেক বড় পরিসরের আইটেম সরবরাহ করতে পারবেন, কারণ বর্তমান আইটেম থেকে দূরের আইটেমগুলির আর মেমরি দখল করার প্রয়োজন হবে না। মনে রাখবেন যে, এর জন্যDefaultPreloadManager.Builderএ একটিCacheসেট করতে হবে। - স্বয়ংক্রিয় মেমরি ব্যবস্থাপনা – আমরা প্রিলোড পরিস্থিতি আরও ভালোভাবে সামলানোর জন্য আমাদের
LoadControlইন্টারফেসটিও আপডেট করেছি, ফলে এখন আপনি মেমরিতে থাকা সমস্ত প্রিলোড করা আইটেমের জন্য একটি সুস্পষ্ট সর্বোচ্চ মেমরি সীমা নির্ধারণ করতে পারবেন। ডিফল্টরূপে এটি ১৪৪ মেগাবাইট, এবং আপনিDefaultLoadControl.Builderএ এই সীমাটি কনফিগার করতে পারবেন। সীমাটি পূরণ হয়ে গেলেDefaultPreloadManagerস্বয়ংক্রিয়ভাবে প্রিলোডিং বন্ধ করে দেবে এবং প্রয়োজনে কম অগ্রাধিকারের আইটেমগুলোর মেমরি স্বয়ংক্রিয়ভাবে মুক্ত করে দেবে।
ExoPlayer-এর নতুন সরলীকৃত ডিফল্ট আচরণগুলির উপর নির্ভর করুন।
বরাবরের মতোই, আমরা ExoPlayer-এও অনেকগুলো ছোটখাটো উন্নতি যোগ করেছি। তার মধ্যে কয়েকটি হলো:
- মিউট এবং আনমিউট – আমাদের আগে থেকেই একটি
setVolumeমেথড ছিল, কিন্তু এখন আমরা সুবিধার জন্যmuteএবংunmuteমেথড যুক্ত করেছি, যাতে আপনাকে নিজে থেকে ভলিউমের হিসাব না রেখেই সহজে আগের ভলিউম ফিরিয়ে আনা যায়। - আটকে থাকা প্লেয়ার শনাক্তকরণ – কিছু বিরল ক্ষেত্রে, উদাহরণস্বরূপ, কোডেক সমস্যা বা ভুল কনফিগারেশনের কারণে প্লেয়ার কোনো অগ্রগতি ছাড়াই বাফারিং বা প্লেয়িং অবস্থায় আটকে যেতে পারে। এতে আপনার ব্যবহারকারীরা বিরক্ত হবেন, কিন্তু আপনি আপনার অ্যানালিটিক্সে এই সমস্যাগুলো কখনোই দেখতে পাবেন না! বিষয়টি আরও স্পষ্ট করার জন্য, প্লেয়ারটি এখন আটকে থাকা অবস্থা শনাক্ত করলে একটি
StuckPlayerExceptionরিপোর্ট করে। - ডিফল্টরূপে ওয়েক-লক – আগে ওয়েক-লক ম্যানেজমেন্টটি ঐচ্ছিক ছিল, যার ফলে এমন কিছু বিরল পরিস্থিতি তৈরি হতো যা খুঁজে বের করা কঠিন ছিল, যেখানে ব্যাকগ্রাউন্ডে চলার সময় প্লেব্যাকের অগ্রগতি অনেক বিলম্বিত হতে পারত। এখন এই ফিচারটি ঐচ্ছিক করা হয়েছে, তাই আপনাকে এটি নিয়ে চিন্তা করতে হবে না এবং প্লেব্যাকের সাথে সম্পর্কিত সমস্ত ম্যানুয়াল ওয়েক-লক হ্যান্ডলিংও বাদ দিতে পারেন।
- সিসি বাটন লজিকের জন্য সরলীকৃত সেটিং –
TrackSelectionParametersপরিবর্তন করে ‘সাবটাইটেল চালু/বন্ধ করুন’ করার বিষয়টি আশ্চর্যজনকভাবে সঠিকভাবে করা কঠিন ছিল, তাই আমরা এই বিশেষ ব্যবহারের জন্য একটি সহজ বুলিয়ানselectTextByDefaultঅপশন যোগ করেছি।
MediaSession-এ আপনার মিডিয়া বাটনের পছন্দগুলি সহজ করুন।
এখন পর্যন্ত, অ্যান্ড্রয়েড অটো বা ওয়্যারওএস-এর মিডিয়া নোটিফিকেশন ড্রয়ারে কোন বাটনগুলো দেখানো হবে তার পছন্দ নির্ধারণ করতে কাস্টম কমান্ড ও বাটন তৈরি করতে হতো, এমনকি যদি আপনি কেবল একটি সাধারণ প্লেয়ার পদ্ধতি চালু করতে চাইতেনও।
Media3 1.9.0-তে এই কাজটি আরও অনেক সহজ করার জন্য নতুন কার্যকারিতা যুক্ত করা হয়েছে – এখন আপনি একটি সাধারণ প্লেয়ার কমান্ডের মাধ্যমেই আপনার মিডিয়া বাটনের পছন্দগুলি নির্ধারণ করতে পারবেন, যার জন্য কোনো কাস্টম কমান্ড ব্যবহারের প্রয়োজনই নেই।
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))

ফাস্ট ফরোয়ার্ড বাটন সহ মিডিয়া বাটনের পছন্দসমূহ
রিয়েল-টাইম প্রিভিউয়ের জন্য কম্পোজিশনপ্লেয়ার
১.৯.০ রিলিজে একটি নতুন @ExperimentalApi অ্যানোটেশনের অধীনে CompositionPlayer চালু করা হয়েছে। এই অ্যানোটেশনটি নির্দেশ করে যে এটি পরীক্ষা-নিরীক্ষার জন্য উপলব্ধ, কিন্তু এখনও এর উন্নয়ন চলছে।
CompositionPlayer হলো Media3 এডিটিং API-এর একটি নতুন কম্পোনেন্ট, যা মিডিয়া এডিটের রিয়েল-টাইম প্রিভিউ দেখানোর জন্য ডিজাইন করা হয়েছে। পরিচিত Media3 Player ইন্টারফেসের উপর ভিত্তি করে নির্মিত CompositionPlayer ব্যবহারকারীদের এক্সপোর্ট প্রক্রিয়া চূড়ান্ত করার আগেই তাদের করা পরিবর্তনগুলো বাস্তবে দেখতে দেয়। এটি সেই একই Composition অবজেক্ট ব্যবহার করে যা আপনি এক্সপোর্ট করার জন্য Transformer এ পাস করেন, এবং প্রিভিউ ও এক্সপোর্টের জন্য ডেটা মডেলকে একীভূত করার মাধ্যমে এডিটিং ওয়ার্কফ্লোকে আরও সহজ করে তোলে।
আমরা আপনাকে CompositionPlayer ব্যবহার শুরু করতে এবং আপনার মতামত জানাতে উৎসাহিত করছি, এবং আরও বিস্তারিত তথ্যের জন্য আসন্ন পোস্ট ও ডকুমেন্টেশনের আপডেটের দিকে নজর রাখতে বলছি।
Transformer-এ ডিফল্ট মাক্সার হিসেবে InAppMuxer
Transformer এখন মিডিয়া কন্টেইনার ফাইল লেখার জন্য ডিফল্ট মাক্সার হিসেবে InAppMp4Muxer ব্যবহার করে। অভ্যন্তরীণভাবে, InAppMp4Muxer মিডিয়া৩ মাক্সার মডিউলের উপর নির্ভরশীল, যা সকল এপিআই সংস্করণে সামঞ্জস্যপূর্ণ আচরণ নিশ্চিত করে।
উল্লেখ্য যে, যদিও Transformer এখন আর ডিফল্টরূপে অ্যান্ড্রয়েড প্ল্যাটফর্মের MediaMuxer ব্যবহার করে না, তবুও আপনার ব্যবহারের ক্ষেত্রে প্রয়োজন হলে আপনি setMuxerFactory- এর মাধ্যমে FrameworkMuxer.Factory প্রদান করতে পারেন।
নতুন গতি সমন্বয় এপিআই
1.9.0 রিলিজটি মিডিয়া এডিটিংয়ের জন্য স্পিড অ্যাডজাস্টমেন্ট API-গুলোকে আরও সহজ করেছে। আমরা সরাসরি EditedMediaItem.Builder এর উপর স্পিড নিয়ন্ত্রণের জন্য নতুন মেথড যুক্ত করেছি, যা API-টিকে আরও সহজবোধ্য করে তুলেছে। এখন আপনি EditedMediaItem.Builder এ setSpeed(SpeedProvider provider) কল করে একটি ক্লিপের স্পিড পরিবর্তন করতে পারবেন।
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
এই নতুন পদ্ধতিটি Effects#createExperimentalSpeedChangingEffects() ব্যবহারের পূর্ববর্তী পদ্ধতির স্থলাভিষিক্ত হয়েছে, যেটিকে আমরা অপ্রচলিত ঘোষণা করেছি এবং ভবিষ্যতের কোনো রিলিজে সরিয়ে দেব।
EditedMediaItemSequence-এর জন্য ট্র্যাক টাইপ চালু করা হচ্ছে
1.9.0 সংস্করণে, EditedMediaItemSequence ক্ষেত্রে সিকোয়েন্স তৈরির সময় কাঙ্ক্ষিত আউটপুট ট্র্যাকের ধরন উল্লেখ করা আবশ্যক। এই পরিবর্তনটি সম্পূর্ণ কম্পোজিশন জুড়ে ট্র্যাক হ্যান্ডলিংকে আরও সুস্পষ্ট এবং শক্তিশালী করে তোলে।
এটি একটি নতুন EditedMediaItemSequence.Builder কনস্ট্রাক্টরের মাধ্যমে করা হয়, যা এক সেট ট্র্যাক টাইপ (যেমন, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO ) গ্রহণ করে।
তৈরি করা সহজ করার জন্য, আমরা নতুন স্ট্যাটিক সুবিধাজনক মেথড যুক্ত করেছি:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
আরও স্পষ্ট এবং নির্ভরযোগ্য সিকোয়েন্স সংজ্ঞার জন্য আমরা আপনাকে নতুন কনস্ট্রাক্টর বা সুবিধাজনক মেথডগুলো ব্যবহার করতে উৎসাহিত করি।
শুধুমাত্র ভিডিও দিয়ে একটি সিকোয়েন্স তৈরির উদাহরণ:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
যদি আপনি কোনো বাগ খুঁজে পান, অথবা আপনার কোনো প্রশ্ন বা নতুন ফিচারের অনুরোধ থাকে, তাহলে অনুগ্রহ করে Media3 ইস্যু ট্র্যাকারের মাধ্যমে আমাদের সাথে যোগাযোগ করুন। আমরা আপনার উত্তরের অপেক্ষায় রইলাম!
পড়তে থাকুন

পণ্যের খবর
অ্যান্ড্রয়েড স্টুডিও পান্ডা ৪ এখন স্থিতিশীল এবং প্রোডাকশনে ব্যবহারের জন্য প্রস্তুত। এই রিলিজে যুক্ত হয়েছে প্ল্যানিং মোড, নেক্সট এডিট প্রেডিকশন এবং আরও অনেক কিছু, যা দিয়ে উচ্চ-মানের অ্যান্ড্রয়েড অ্যাপ তৈরি করা আগের চেয়েও সহজ।
Matt Dyor • পড়তে ৫ মিনিট

পণ্যের খবর
আপনি যদি একজন অ্যান্ড্রয়েড ডেভেলপার হন এবং আপনার অ্যাপে উদ্ভাবনী এআই ফিচার যুক্ত করতে চান, তবে আমরা সম্প্রতি শক্তিশালী নতুন আপডেট চালু করেছি।
Thomas Ezan • পড়তে ৩ মিনিট

পণ্যের খবর
অ্যান্ড্রয়েড ১৭ বিটা ৪-এ পৌঁছেছে, যা এই রিলিজ চক্রের সর্বশেষ নির্ধারিত বিটা এবং অ্যাপের সামঞ্জস্যতা ও প্ল্যাটফর্মের স্থিতিশীলতার জন্য একটি অত্যন্ত গুরুত্বপূর্ণ মাইলফলক।
Daniel Galpin • পড়তে ৪ মিনিট
আপ-টু-ডেট থাকুন
অ্যান্ড্রয়েড ডেভেলপমেন্টের সর্বশেষ তথ্য প্রতি সপ্তাহে আপনার ইনবক্সে পান।





