প্রোডাক্ট সম্পর্কিত খবর

Media3 1.9.0 - নতুন কী আছে

৬ মিনিট রিডিং
Kristina Simakova-র প্রোফাইল দেখুন
Kristina Simakova ইঞ্জিনিয়ারিং ম্যানেজার

Media3 1.9.0 রিলিজ করা হয়েছে! সাধারণ সমস্যার সমাধান ও পারফর্ম্যান্সের উন্নতি ছাড়াও, লেটেস্ট রিলিজে চারটি নতুন বা ব্যাপকভাবে আবার লেখা মডিউল রয়েছে:

  • media3-inspector - প্লেব্যাক চলাকালীন মেটাডেটা ও ফ্রেম এক্সট্র্যাক্ট করা
  • media3-ui-compose-material3 - মাত্র কয়েকটি ধাপে একটি প্রাথমিক Material3 Compose Media UI তৈরি করা
  • media3-cast - Cast ও লোকাল প্লেব্যাকের মধ্যে ট্রানজিশন অটোমেটিক ম্যানেজ করা
  • media3-decoder-av1 - dav1d লাইব্রেরির উপর ভিত্তি করে নতুন করে লেখা এক্সটেনশন ডিকোডার সহ সামঞ্জস্যপূর্ণ AV1 প্লেব্যাক

এছাড়াও, আমরা PreloadManager-এ ক্যাশিং ও মেমরি ম্যানেজমেন্ট সংক্রান্ত উন্নতি করেছি এবং বেশ কিছু নতুন ExoPlayer, Transformer ও MediaSession সরলীকরণ প্রদান করেছি। 

এছাড়াও, এই রিলিজের মাধ্যমে আপনি CompositionPlayer-এ মিডিয়া এডিট প্রিভিউ করার প্রথম পরীক্ষামূলক অ্যাক্সেস পাবেন।  


আরও জানতে পড়তে থাকুন এবং এই রিলিজের পরিবর্তনগুলির একটি সামগ্রিক ওভারভিউ পেতে, সবসময় সম্পূর্ণ রিলিজ নোট চেক করে দেখতে ভুলবেন না।

প্লেব্যাকের বাইরে মেটাডেটা ও ফ্রেম এক্সট্র্যাক্ট করা

এমন অনেক পরিস্থিতি হয় যেখানে আপনি প্লেব্যাক শুরু না করেই মিডিয়া চেক করতে চান। যেমন, আপনি হয়ত জানতে চান যে সেটিতে কোন ফর্ম্যাট আছে বা সেটির সময়সীমা কত অথবা থাম্বনেল পেতে চান।

নতুন media3-inspector মডিউলটি প্লেব্যাক ছাড়াই মিডিয়া চেক করার জন্য সব ইউটিলিটি এক জায়গায় একত্রিত করে:

  • MetadataRetriever থেকে MediaItem-এর সময়সীমা, ফর্ম্যাট ও স্ট্যাটিক মেটাডেটা পড়তে।
  • FrameExtractor আইটেম থেকে ফ্রেম বা থাম্বনেল পেতে।
  • ফাইলের স্যাম্পেল সম্পর্কে বিস্তারিত তথ্য পেতে, Android প্ল্যাটফর্মের 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-এর মাধ্যমে, আমরা সম্পূর্ণ স্টাইল করা Material3 বোতাম ও কন্টেন্ট এলিমেন্ট সহ একটি নতুন মডিউল media3-ui-compose-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)
    }
  }
}

 

image.png

আলাদা করে কোনও এলিমেন্ট যোগ না করেই ব্যবহার করা যায় এমন সাধারণ Compose প্লেয়ার 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()

}
image.png

Media3 সেশন ডেমো অ্যাপে নতুন CastPlayer ইন্টিগ্রেশন

dav1d-এর উপর ভিত্তি করে আবার লেখা এক্সটেনশন সহ সামঞ্জস্যপূর্ণ AV1 প্লেব্যাক

1.9.0 রিলিজে জনপ্রিয় dav1d লাইব্রেরির উপর ভিত্তি করে সম্পূর্ণ নতুন করে লেখা AV1 এক্সটেনশন মডিউল রয়েছে। 

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

PreloadManager-এ ক্যাশিং ও মেমরি ম্যানেজমেন্ট ইন্টিগ্রেট করা

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

  1. ক্যাশিং সংক্রান্ত সহায়তা – কতদূর পর্যন্ত প্রিলোড করতে হবে তা নির্ধারণ করার সময়, আপনি এখন প্রিলোড করা আইটেমের জন্য PreloadStatus.specifiedRangeCached(0, 5000) বেছে নিতে পারবেন। এর ফলে, মেমরিতে ডেটা লোড করার পরিবর্তে, নির্দিষ্ট রেঞ্জটি ডিস্কে আপনার ক্যাশে যোগ করা হবে। এর ফলে, আপনি প্রি-লোডিংয়ের জন্য অনেক বেশি আইটেম প্রদান করতে পারবেন, কারণ বর্তমান আইটেম থেকে অনেক দূরে থাকা আইটেমগুলিকে আর মেমরি দখল করতে হবে না। মনে রাখবেন, এর জন্য DefaultPreloadManager.Builder-এ Cache সেট করতে হবে।
  2. অটোমেটিক মেমরি ম্যানেজমেন্ট – এছাড়াও, আমরা LoadControl ইন্টারফেস আপডেট করেছি যাতে প্রি-লোড কেস আরও ভালোভাবে ম্যানেজ করা যায়। এর ফলে, আপনি এখন মেমরিতে থাকা সব প্রি-লোডেড আইটেমের জন্য একটি স্পষ্ট মেমরি সীমা সেট করতে পারবেন। এটি ডিফল্ট হিসেবে ১৪৪ MB এবং আপনি DefaultLoadControl.Builder-এ গিয়ে সীমা কনফিগার করতে পারবেন। সীমা পৌঁছে গেলে DefaultPreloadManager অটোমেটিক প্রি-লোডিং বন্ধ করে দেবে এবং প্রয়োজন হলে কম অগ্রাধিকারের আইটেমের মেমরি অটোমেটিক রিলিজ করে দেবে।

ExoPlayer-এ নতুন সরলীকৃত ডিফল্ট আচরণের উপর নির্ভর করা

বরাবরের মতো, আমরা ExoPlayer-এও অনেক ইনক্রিমেন্টাল উন্নতি করেছি। কয়েকটির নাম উল্লেখ করতে:

  • মিউট ও আনমিউট করা – আমাদের কাছে আগেই একটি setVolume পদ্ধতি ছিল, কিন্তু এখন আমরা mute ও unmute পদ্ধতি যোগ করেছি যাতে আপনি নিজে ট্র্যাক না রেখেই আগের ভলিউম সহজে ফিরিয়ে আনতে পারেন।
  • আটকে যাওয়া প্লেয়ার শনাক্তকরণ – কিছু বিরল ক্ষেত্রে, প্লেয়ার কোনও প্রগ্রেস না করেই বাফারিং বা প্লেয়িং স্টেটে আটকে যেতে পারে, যেমন, কোডেক সংক্রান্ত সমস্যা বা ভুল কনফিগারেশনের কারণে। আপনার ব্যবহারকারীরা বিরক্ত হবেন, কিন্তু আপনি কখনওই আপনার অ্যানালিটিক্সে এই সমস্যাগুলি দেখতে পাবেন না! এটি আরও স্পষ্ট করতে, প্লেয়ার এখন কোনও StuckPlayerException রিপোর্ট করে যখন এটি কোনও আটকে যাওয়া অবস্থা শনাক্ত করে।
  • ডিফল্ট হিসেবে ওয়েক লক – ওয়েক লক ম্যানেজমেন্ট আগে অপ্ট-ইন ছিল, এর ফলে ব্যাকগ্রাউন্ডে চালানোর সময় প্লেব্যাক প্রগ্রেস অনেক বেশি দেরি হয়ে যেতে পারে এমন এজ কেস খুঁজে পাওয়া কঠিন ছিল। এখন এই ফিচারটি অপ্ট-আউট করা হয়েছে, তাই আপনাকে এটি নিয়ে চিন্তা করতে হবে না এবং প্লেব্যাক চলাকালীন সমস্ত ম্যানুয়াল ওয়েক লক হ্যান্ডেলিং সরিয়ে দিতে পারবেন।
  • CC বোতামের লজিকের জন্য সরলীকৃত সেটিং – "সাবটাইটেল চালু/বন্ধ করো" বলার জন্য TrackSelectionParameters পরিবর্তন করা আশ্চর্যজনকভাবে কঠিন ছিল, তাই এই ব্যবহারের ক্ষেত্রে আমরা একটি সাধারণ বুলিয়ান selectTextByDefault বিকল্প যোগ করেছি।

MediaSession-এ আপনার মিডিয়া বোতাম সংক্রান্ত পছন্দ আরও সহজ করে তুলুন

এতদিন পর্যন্ত, Android Auto বা WearOS-এ মিডিয়া বিজ্ঞপ্তি ড্রয়ারে কোন বোতাম দেখানো হবে সেই সংক্রান্ত আপনার পছন্দ নির্ধারণ করার জন্য কাস্টম কমান্ড ও বোতাম নির্ধারণ করতে হত, এমনকি আপনি যদি কোনও স্ট্যান্ডার্ড প্লেয়ার মেথড ট্রিগার করতে চাইতেন তাহলেও এটি করতে হত।

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()
))
image.png

ফাস্ট ফরওয়ার্ড বোতাম সহ মিডিয়া বোতাম সংক্রান্ত পছন্দ

রিয়েল-টাইম প্রিভিউয়ের জন্য CompositionPlayer

1.9.0 রিলিজ নতুন @ExperimentalApi অ্যানোটেশনের অধীনে CompositionPlayer নিয়ে আসে। অ্যানোটেশন থেকে বোঝা যায় যে এটি পরীক্ষা করে দেখার জন্য উপলভ্য, তবে এখনও ডেভেলপ করা হচ্ছে। 

CompositionPlayer হল Media3 এডিটিং API-এর একটি নতুন কম্পোনেন্ট যা মিডিয়া এডিটের রিয়েল-টাইম প্রিভিউয়ের জন্য ডিজাইন করা হয়েছে। পরিচিত Media3 Player ইন্টারফেসের CompositionPlayer উপর ভিত্তি করে, এক্সপোর্ট প্রসেস শুরু করার আগে ব্যবহারকারীরা তাদের করা পরিবর্তনগুলি দেখতে পান। এটি সেই একই Composition অবজেক্ট ব্যবহার করে যা আপনি এক্সপোর্ট করার জন্য Transformer-এ পাস করবেন, প্রিভিউ ও এক্সপোর্টের জন্য ডেটা মডেলকে একত্রিত করে এডিটিং ওয়ার্কফ্লোকে স্ট্রিমলাইন করে।

আমরা আপনাকে CompositionPlayer ব্যবহার করা শুরু করতে এবং আপনার মতামত শেয়ার করতে উৎসাহিত করি এবং আরও বিবরণের জন্য আসন্ন পোস্ট ও ডকুমেন্টেশনের আপডেটের দিকে নজর রাখুন।

Transformer-এ ডিফল্ট মিক্সার হিসেবে InAppMuxer

Transformer এখন মিডিয়া কন্টেনার ফাইল লেখার জন্য InAppMp4Muxer-কে ডিফল্ট মক্সার হিসেবে ব্যবহার করে। অভ্যন্তরীণভাবে, InAppMp4Muxer Media3 Muxer মডিউলের উপর নির্ভর করে, যা সব API ভার্সন জুড়ে সামঞ্জস্যপূর্ণ আচরণ প্রদান করে। 

মনে রাখবেন, Transformer ডিফল্ট হিসেবে Android প্ল্যাটফর্মের MediaMuxer আর ব্যবহার না করলেও, আপনার ব্যবহারের ক্ষেত্রে প্রয়োজন হলে আপনি এখনও FrameworkMuxer.Factory setMuxerFactory ব্যবহার করতে পারবেন।

স্পিড অ্যাডজাস্টমেন্টের নতুন API

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 ইস্যু ট্র্যাকার-এর মাধ্যমে যোগাযোগ করুন। আপনার মতামত জানার জন্য আমরা অপেক্ষা করছি!

এর লেখা:
পড়া চালিয়ে যান