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

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

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

Media3 1.9.0 रिलीज़ हो गया है! गड़बड़ियां ठीक करने और परफ़ॉर्मेंस को बेहतर बनाने के साथ-साथ, इस नई रिलीज़ में चार नए या फिर से लिखे गए मॉड्यूल भी शामिल हैं:

  • media3-inspector - वीडियो चलाने के दौरान, मेटाडेटा और फ़्रेम एक्सट्रैक्ट करना
  • media3-ui-compose-material3 - कुछ ही चरणों में, Material3 Compose Media यूज़र इंटरफ़ेस (यूआई) बनाएं
  • media3-cast - कास्ट और लोकल प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज करना
  • media3-decoder-av1 - dav1d लाइब्रेरी के आधार पर, फिर से लिखे गए एक्सटेंशन डिकोडर की मदद से, AV1 वीडियो को लगातार चलाया जा सकता है

हमने PreloadManager में कैश मेमोरी और मेमोरी मैनेजमेंट से जुड़े सुधार भी किए हैं. साथ ही, ExoPlayer, Transformer, और MediaSession को इस्तेमाल करना पहले से ज़्यादा आसान बना दिया है. 

इस रिलीज़ में, आपको मीडिया में किए गए बदलावों की झलक देखने के लिए, CompositionPlayer को एक्सपेरिमेंट के तौर पर इस्तेमाल करने का पहला ऐक्सेस भी मिलता है.  

ज़्यादा जानने के लिए,
पढ़ते रहें. साथ ही, इस रिलीज़ में हुए बदलावों के बारे में पूरी जानकारी पाने के लिए, कृपया हमेशा की तरह रिलीज़ नोट देखें.

प्लेबैक के अलावा, मेटाडेटा और फ़्रेम एक्सट्रैक्ट करना

ऐसे कई मामले होते हैं जिनमें आपको मीडिया की जांच करनी होती है, लेकिन उसे चलाना नहीं होता. उदाहरण के लिए, आपको यह पता लगाना हो सकता है कि इसमें कौनसे फ़ॉर्मैट शामिल हैं या इसकी अवधि कितनी है. इसके अलावा, थंबनेल वापस पाने के लिए भी इस सुविधा का इस्तेमाल किया जा सकता है.

नए media3-inspector मॉड्यूल में, मीडिया की जांच करने के लिए सभी यूटिलिटी को एक जगह पर इकट्ठा किया गया है. इससे मीडिया को बिना चलाए उसकी जांच की जा सकती है:

  • MediaItem से अवधि, फ़ॉर्मैट, और स्टैटिक मेटाडेटा को पढ़ने के लिए MetadataRetriever.
  • 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 रिलीज़ में, नए @ExperimentalApi एनोटेशन के तहत CompositionPlayer को पेश किया गया है. एनोटेशन से पता चलता है कि यह सुविधा एक्सपेरिमेंट के लिए उपलब्ध है, लेकिन इस पर अब भी काम चल रहा है. 

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 के समस्या ट्रैकर के ज़रिए हमसे संपर्क करें. हमें आपके जवाब का इंतज़ार रहेगा!

इसे लिखा है:

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