प्रॉडक्ट से जुड़ी खबरें

Media3 1.9.0 - नया क्या है

छह मिनट में पढ़ें
Kristina Simakova
इंजीनियरिंग मैनेजर

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 मॉड्यूल में, मीडिया की जांच करने के लिए सभी यूटिलिटी को एक जगह पर इकट्ठा किया गया है. इससे मीडिया को बिना चलाए उसकी जांच की जा सकती है:

  • MetadataRetriever से अवधि, फ़ॉर्मैट, और स्टैटिक मेटाडेटा को पढ़ने के लिए MediaItem.
  • FrameExtractor का इस्तेमाल करके, किसी आइटम से फ़्रेम या थंबनेल पाएं.
  • MediaExtractorCompat का इस्तेमाल, Android प्लैटफ़ॉर्म की MediaExtractor क्लास के विकल्प के तौर पर किया जाता है. इससे फ़ाइल में मौजूद सैंपल के बारे में ज़्यादा जानकारी मिलती है.

MetadataRetriever और FrameExtractor एक आसान AutoCloseable पैटर्न को फ़ॉलो करते हैं. ज़्यादा जानकारी के लिए, हमारे नए गाइड पेज देखें.

suspend fun extractThumbnail(mediaItem: MediaItem) {

  FrameExtractor.Builder(context, mediaItem).build().use {

    val thumbnail = frameExtractor.getThumbnail().await()

  } 

}

कुछ ही चरणों में, Material3 Compose Media UI का बुनियादी वर्शन बनाना

पिछली रिलीज़ में, हमने Compose यूज़र इंटरफ़ेस (यूआई) एलिमेंट और आपके प्लेयर इंस्टेंस के बीच कनेक्टर कोड उपलब्ध कराना शुरू किया था. Media3 1.9.0 में, हमने एक नया मॉड्यूल media3-ui-compose-material3 जोड़ा है. इसमें पूरी तरह से स्टाइल किए गए Material3 बटन और कॉन्टेंट एलिमेंट शामिल हैं. इनकी मदद से, कुछ ही चरणों में मीडिया यूज़र इंटरफ़ेस (यूआई) बनाया जा सकता है. साथ ही, स्टाइल को अपनी पसंद के मुताबिक बनाने की पूरी सुविधा मिलती है. अगर आपको अपनी यूज़र इंटरफ़ेस (यूआई) स्टाइल बनानी है, तो उन बिल्डिंग ब्लॉक का इस्तेमाल किया जा सकता है जो अपडेट और कनेक्शन के सभी लॉजिक का ध्यान रखते हैं. इससे आपको सिर्फ़ यूज़र इंटरफ़ेस (यूआई) एलिमेंट को डिज़ाइन करने पर ध्यान देना होगा. कृपया Compose UI मॉड्यूल के लिए, ज़्यादा जानकारी वाले हमारे गाइड पेज देखें.

हम Compose के और भी कॉम्पोनेंट पर काम कर रहे हैं. जैसे, पहले से बनी हुई सीक बार, 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

पहले से मौजूद एलिमेंट के साथ, कंपोज़ प्लेयर का आसान यूज़र इंटरफ़ेस (यूआई)

कास्ट करने और डिवाइस पर वीडियो चलाने के बीच ट्रांज़िशन को अपने-आप मैनेज करना

media3-cast मॉड्यूल में मौजूद CastPlayer को फिर से लिखा गया है. इससे, लोकल प्लेबैक (उदाहरण के लिए, ExoPlayer के साथ) और रिमोट कास्ट प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज किया जा सकता है.

MediaSession सेट अप करने के बाद, अपने ExoPlayer के चारों ओर CastPlayer बनाएं. इसके बाद, अपने यूज़र इंटरफ़ेस (यूआई) में 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 वर्शन में, AV1 एक्सटेंशन मॉड्यूल को पूरी तरह से फिर से लिखा गया है. यह लोकप्रिय dav1d लाइब्रेरी पर आधारित है. 

सभी एक्सटेंशन डिकोडर मॉड्यूल की तरह, कृपया ध्यान दें कि इससे मिलते-जुलते नेटिव कोड को सही तरीके से बंडल करने के लिए, इसे सोर्स से बनाना ज़रूरी है. डिकोडर को बंडल करने से, सभी डिवाइसों पर एक जैसा फ़ॉर्मैट मिलता है और सभी डिवाइसों पर फ़ॉर्मैट काम करता है. हालांकि, यह आपकी प्रोसेस में डिकोडिंग करता है. इसलिए, यह ऐसे कॉन्टेंट के लिए सबसे सही है जिस पर आपको भरोसा हो. 

PreloadManager में कैश मेमोरी और मेमोरी मैनेजमेंट को इंटिग्रेट करें

हमने अपने PreloadManager को भी और बेहतर बनाया है. इसकी मदद से, मीडिया को पहले से ही मेमोरी में लोड किया जा सकता है. ऐसा, वीडियो चलाने से पहले किया जाता है. इसके बाद, ज़रूरत पड़ने पर इसे प्लेयर को आसानी से ट्रांसफ़र किया जा सकता है. हालांकि, यह काफ़ी अच्छा परफ़ॉर्म करता है, लेकिन आपको अब भी यह ध्यान रखना होगा कि गलती से बहुत ज़्यादा प्रीलोड करने से मेमोरी की सीमाएं पार न हो जाएं. इसलिए, Media3 1.9.0 में हमने दो सुविधाएं जोड़ी हैं. इनसे यह काम बहुत आसान और ज़्यादा भरोसेमंद हो जाता है:

  1. कैशिंग की सुविधा – प्रीलोड करने की सीमा तय करते समय, अब प्रीलोड किए गए आइटम के लिए PreloadStatus.specifiedRangeCached(0, 5000) को टारगेट स्टेट के तौर पर चुना जा सकता है. इससे, मेमोरी में डेटा लोड करने के बजाय, डिस्क पर मौजूद आपकी कैश मेमोरी में तय की गई रेंज जुड़ जाएगी. इससे, प्रीलोडिंग के लिए ज़्यादा आइटम उपलब्ध कराए जा सकते हैं. ऐसा इसलिए, क्योंकि मौजूदा आइटम से दूर मौजूद आइटम को अब मेमोरी में सेव करने की ज़रूरत नहीं होती. ध्यान दें कि इसके लिए, DefaultPreloadManager.Builder में Cache सेट करना ज़रूरी है.
  2. मेमोरी को अपने-आप मैनेज करने की सुविधा – हमने LoadControl इंटरफ़ेस को भी अपडेट किया है, ताकि प्रीलोड किए गए कॉन्टेंट को बेहतर तरीके से मैनेज किया जा सके. अब मेमोरी में प्रीलोड किए गए सभी आइटम के लिए, मेमोरी की ज़्यादा से ज़्यादा सीमा सेट की जा सकती है. डिफ़ॉल्ट रूप से यह 144 एमबी होती है. DefaultLoadControl.Builder में जाकर, इस सीमा को कॉन्फ़िगर किया जा सकता है. सीमा पूरी होने के बाद, DefaultPreloadManager अपने-आप प्रीलोड होना बंद हो जाएगा. साथ ही, अगर ज़रूरी हो, तो कम प्राथमिकता वाले आइटम की मेमोरी अपने-आप रिलीज़ कर देगा.

ExoPlayer में, डिफ़ॉल्ट रूप से काम करने वाली नई और आसान सुविधाओं का इस्तेमाल करना

हमेशा की तरह, हमने ExoPlayer में भी कई सुधार किए हैं. इनमें से कुछ के नाम यहां दिए गए हैं:

  • आवाज़ बंद और चालू करना – हमारे पास पहले से ही setVolume तरीका उपलब्ध था. अब हमने mute और unmute तरीके भी जोड़ दिए हैं. इनसे, आपको आवाज़ को खुद ट्रैक किए बिना, पिछली आवाज़ को आसानी से वापस लाने में मदद मिलेगी.
  • वीडियो रुकने की समस्या का पता लगाना – कुछ मामलों में, वीडियो बफ़र होने या चलने की स्थिति में अटक सकता है. ऐसा कोडेक से जुड़ी समस्याओं या गलत कॉन्फ़िगरेशन की वजह से हो सकता है. आपके उपयोगकर्ताओं को परेशानी होगी, लेकिन आपको अपनी Analytics रिपोर्ट में ये समस्याएं कभी नहीं दिखेंगी! इस समस्या को ज़्यादा आसानी से समझने के लिए, प्लेयर अब StuckPlayerException दिखाता है. ऐसा तब होता है, जब उसे पता चलता है कि वीडियो रुक गया है.
  • डिफ़ॉल्ट रूप से वेकलॉक की सुविधा चालू होती है – पहले वेकलॉक की सुविधा को चालू करना पड़ता था. इस वजह से, ऐसे कुछ मामलों में वीडियो चलाने में काफ़ी समय लग जाता था, जब वीडियो बैकग्राउंड में चल रहा होता था. अब इस सुविधा को ऑप्ट-आउट किया जा सकता है. इसलिए, आपको इसके बारे में चिंता करने की ज़रूरत नहीं है. साथ ही, वीडियो चलाने के दौरान मैन्युअल तरीके से वेक लॉक को मैनेज करने की सुविधा को भी हटाया जा सकता है.
  • सीसी बटन के लॉजिक के लिए आसान सेटिंग – 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 के एडिटिंग एपीआई में एक नया कॉम्पोनेंट है. इसे मीडिया में किए गए बदलावों को रीयल-टाइम में देखने के लिए डिज़ाइन किया गया है. CompositionPlayer को Media3 के जाने-पहचाने Player इंटरफ़ेस पर बनाया गया है. इससे उपयोगकर्ता, एक्सपोर्ट प्रोसेस शुरू करने से पहले अपने बदलावों को देख सकते हैं. यह उसी Composition ऑब्जेक्ट का इस्तेमाल करता है जिसे एक्सपोर्ट करने के लिए Transformer को पास किया जाता है. इससे, झलक देखने और एक्सपोर्ट करने के लिए डेटा मॉडल को एक जैसा करके, बदलाव करने के वर्कफ़्लो को आसान बनाया जाता है.

हमारा सुझाव है कि आप CompositionPlayer का इस्तेमाल शुरू करें और अपने सुझाव/राय/शिकायत शेयर करें. साथ ही, ज़्यादा जानकारी के लिए आने वाली पोस्ट और दस्तावेज़ के अपडेट पर नज़र रखें.

Transformer में InAppMuxer को डिफ़ॉल्ट मक्सर के तौर पर इस्तेमाल करना

Transformer अब मीडिया कंटेनर फ़ाइलें लिखने के लिए, InAppMp4Muxer को डिफ़ॉल्ट मक्सर के तौर पर इस्तेमाल करता है. आंतरिक तौर पर, InAppMp4Muxer Media3 के Muxer मॉड्यूल पर निर्भर करता है. इससे, एपीआई के सभी वर्शन में एक जैसा व्यवहार मिलता है. 

ध्यान दें कि Transformer अब डिफ़ॉल्ट रूप से Android प्लैटफ़ॉर्म के MediaMuxer का इस्तेमाल नहीं करता है. हालांकि, अगर आपके इस्तेमाल के उदाहरण के लिए इसकी ज़रूरत है, तो FrameworkMuxer.Factory को setMuxerFactory के ज़रिए अब भी उपलब्ध कराया जा सकता है.

स्पीड अडजस्ट करने वाले नए एपीआई

1.9.0 वर्शन में, मीडिया एडिटिंग के लिए स्पीड अडजस्टमेंट एपीआई को आसान बना दिया गया है. हमने EditedMediaItem.Builder पर सीधे तौर पर नए तरीके उपलब्ध कराए हैं, ताकि स्पीड को कंट्रोल किया जा सके. इससे एपीआई को इस्तेमाल करना ज़्यादा आसान हो जाएगा. अब 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 के समस्या ट्रैकर के ज़रिए हमसे संपर्क करें. हमें आपके जवाब का इंतज़ार रहेगा!

इसे लिखा है:

पढ़ना जारी रखें