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 मॉड्यूल में, मीडिया की जांच करने के लिए सभी यूटिलिटी को एक ही जगह पर इकट्ठा किया गया है. इससे मीडिया को बिना चलाए उसकी जांच की जा सकती है:
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)
}
}
}
पहले से मौजूद एलिमेंट के साथ, कंपोज़ प्लेयर का आसान यूज़र इंटरफ़ेस (यूआई)
कास्ट करने और लोकल प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज करना
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()
}
Media3 सेशन डेमो ऐप्लिकेशन में CastPlayer का नया इंटिग्रेशन
dav1d पर आधारित, फिर से लिखे गए एक्सटेंशन की मदद से, AV1 वीडियो को लगातार चलाया जा सकता है
1.9.0 वर्शन में, AV1 एक्सटेंशन मॉड्यूल को पूरी तरह से फिर से लिखा गया है. यह लोकप्रिय dav1d लाइब्रेरी पर आधारित है.
सभी एक्सटेंशन डिकोडर मॉड्यूल की तरह, कृपया ध्यान दें कि इससे मिलते-जुलते नेटिव कोड को सही तरीके से बंडल करने के लिए, इसे सोर्स से बनाना ज़रूरी है. डिकोडर को बंडल करने से, सभी डिवाइसों पर एक जैसा फ़ॉर्मैट मिलता है और फ़ॉर्मैट काम करता है. हालांकि, यह आपकी प्रोसेस में डिकोडिंग करता है. इसलिए, यह ऐसे कॉन्टेंट के लिए सबसे सही है जिस पर आपको भरोसा हो.
PreloadManager में कैश मेमोरी और मेमोरी मैनेजमेंट को इंटिग्रेट करना
हमने अपने PreloadManager को भी और बेहतर बना दिया है. इसकी मदद से, मीडिया को पहले से ही मेमोरी में लोड किया जा सकता है. इसके बाद, ज़रूरत पड़ने पर इसे प्लेयर को आसानी से ट्रांसफ़र किया जा सकता है. हालांकि, यह काफ़ी अच्छा परफ़ॉर्म करता है, लेकिन आपको अब भी यह ध्यान रखना होगा कि गलती से बहुत ज़्यादा प्रीलोड न हो जाए, ताकि मेमोरी की सीमाएं पार न हों. इसलिए, Media3 1.9.0 में हमने दो सुविधाएं जोड़ी हैं. इनसे यह प्रोसेस ज़्यादा आसान और स्थिर हो जाती है:
- कैशिंग की सुविधा – प्रीलोड करने की सीमा तय करते समय, अब प्रीलोड किए गए आइटम के लिए
PreloadStatus.specifiedRangeCached(0, 5000)को टारगेट स्टेट के तौर पर चुना जा सकता है. इससे, मेमोरी में डेटा लोड करने के बजाय, डिस्क पर मौजूद आपकी कैश मेमोरी में तय की गई रेंज जुड़ जाएगी. इससे, प्रीलोडिंग के लिए ज़्यादा आइटम उपलब्ध कराए जा सकते हैं. ऐसा इसलिए, क्योंकि मौजूदा आइटम से दूर मौजूद आइटम को अब मेमोरी में जगह नहीं घेरनी पड़ती. ध्यान दें कि इसके लिए,DefaultPreloadManager.BuilderमेंCacheसेट करना ज़रूरी है. - मेमोरी को अपने-आप मैनेज करने की सुविधा – हमने
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()
))
तेज़ी से आगे बढ़ाने वाले बटन के साथ मीडिया बटन की प्राथमिकताएं
रीयल-टाइम में झलक देखने के लिए CompositionPlayer
1.9.0 रिलीज़ में, CompositionPlayer को नए @ExperimentalApi एनोटेशन के तहत पेश किया गया है. एनोटेशन से पता चलता है कि यह सुविधा एक्सपेरिमेंट के लिए उपलब्ध है, लेकिन इस पर अब भी काम चल रहा है.
CompositionPlayer, Media3 के एडिटिंग एपीआई में मौजूद एक नया कॉम्पोनेंट है. इसे मीडिया में किए गए बदलावों को रीयल-टाइम में देखने के लिए डिज़ाइन किया गया है. Media3 के जाने-पहचाने Player इंटरफ़ेस पर आधारित CompositionPlayer की मदद से, उपयोगकर्ता एक्सपोर्ट प्रोसेस शुरू करने से पहले अपने बदलावों को देख सकते हैं. यह उसी 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 के समस्या ट्रैकर के ज़रिए हमसे संपर्क करें. हमें आपके जवाब का इंतज़ार रहेगा!
-
प्रॉडक्ट से जुड़ी खबरेंहम Google Play पर अपने सदस्यता प्लैटफ़ॉर्म का लगातार विस्तार कर रहे हैं, ताकि आपको अपने कारोबार को आगे बढ़ाने, नए कारोबारी मॉडल अपनाने, और अपने उपयोगकर्ताओं की ज़रूरतों को पूरा करने में मदद मिल सके.
Sheenam Mittal • 4 मिनट में पढ़ें -
प्रॉडक्ट से जुड़ी खबरेंपिछले साल, Android Studio को किसी भी एआई मॉडल के लिए उपलब्ध कराया गया था. आज हम एक और कदम आगे बढ़ाते हुए, आपकी पसंद के कोडिंग एजेंट के लिए सहायता उपलब्ध करा रहे हैं.
Matthew Warner • 3 मिनट में पढ़ा जा सकता है -
प्रॉडक्ट से जुड़ी खबरेंGooglebook, Android पर आधारित लैपटॉप की नई कैटगरी पेश करता है. HP, Dell, Lenovo, Acer, और Asus जैसे पार्टनर के बेहतरीन हार्डवेयर में, मोबाइल की सुविधा के साथ-साथ डेस्कटॉप की पावर भी मिलती है.
Fahd Imtiaz, Loryn Hairston • 4 मिनट में पढ़ें
Android डेवलपमेंट से जुड़ी नई अहम जानकारी, हर हफ़्ते अपने इनबॉक्स में पाएं.