প্রোডাক্ট সংক্রান্ত খবর

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

৬ মিনিট লাগবে
ক্রিস্টিনা সিমাকোভার প্রোফাইল দেখুন
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 এলিমেন্ট এবং আপনার Player ইনস্ট্যান্সের মধ্যে কানেক্টর কোড প্রদান করা শুরু করেছি। 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)
    }
  }
}

 

image.png

আউট-অফ-দ্য-বক্স এলিমেন্ট সহ সহজ Compose প্লেয়ার UI

Cast ও লোকাল প্লেব্যাকের মধ্যে ট্রানজিশন অটোমেটিক ম্যানেজ করুন

media3-cast মডিউলে CastPlayer-কে আবার লেখা হয়েছে যাতে লোকাল প্লেব্যাক (যেমন ExoPlayer-এর সাথে) ও রিমোট Cast প্লেব্যাকের মধ্যে ট্রানজিশন অটোমেটিক ম্যানেজ করা যায়।

আপনার 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 ইন্টারফেস আপডেট করেছি যাতে প্রিলোড কেস আরও ভালোভাবে ম্যানেজ করা যায়, তাই আপনি এখন মেমরিতে সব প্রিলোড করা আইটেমের জন্য একটি নির্দিষ্ট মেমরির ঊর্ধ্বসীমা সেট করতে পারবেন। ডিফল্ট হিসেবে এটি ১৪৪ এমবি এবং আপনি 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 রিলিজে CompositionPlayer-কে নতুন @ExperimentalApi অ্যানোটেশনের অধীনে নিয়ে আসা হয়েছে। অ্যানোটেশন থেকে বোঝা যায় যে এটি পরীক্ষা করার জন্য উপলভ্য, তবে এখনও ডেভেলপ করা হচ্ছে। 

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

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

InAppMuxer, ট্রান্সফর্মারে ডিফল্ট মাক্সার হিসেবে কাজ করে

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

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

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

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