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)
}
}
}
पहले से मौजूद एलिमेंट के साथ, कंपोज़ प्लेयर का आसान यूज़र इंटरफ़ेस (यूआई)
कास्ट करने और डिवाइस पर वीडियो चलाने के बीच ट्रांज़िशन को अपने-आप मैनेज करना
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 के एडिटिंग एपीआई में मौजूद एक नया कॉम्पोनेंट है. इसे मीडिया में किए गए बदलावों की रीयल-टाइम में झलक दिखाने के लिए डिज़ाइन किया गया है. 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 के समस्या ट्रैकर के ज़रिए हमसे संपर्क करें. हमें आपके जवाब का इंतज़ार रहेगा!
पढ़ना जारी रखें
-
प्रॉडक्ट से जुड़ी खबरें
हर साल, Google I/O में अलग-अलग ईकोसिस्टम और प्रॉडक्ट के बारे में नई घोषणाएं की जाती हैं और नए संसाधन उपलब्ध कराए जाते हैं. इनमें Android डेवलपमेंट भी शामिल है. डेवलपमेंट का काम एआई और एजेंट की मदद से काम करने वाले टूल की ओर बढ़ रहा है. इसलिए, हमने अपनी सेवाओं का दायरा बढ़ाया है, ताकि हम आपकी बेहतर तरीके से मदद कर सकें. हालांकि, Android के लिए ऐप्लिकेशन बनाने का फ़ैसला आपका होगा.
Simona Milanovic • दो मिनट में पढ़ें
-
प्रॉडक्ट से जुड़ी खबरें
Google I/O ‘26 में, हमने दिखाया कि Android के प्लैटफ़ॉर्म में हुए नए बदलावों से, आपको अपने ऐप्लिकेशन की क्वालिटी को बेहतर बनाने में कैसे मदद मिल सकती है. साथ ही, डेवलपमेंट की प्रोसेस को ज़्यादा से ज़्यादा बेहतर बनाया जा सकता है.
Ataul Munim • तीन मिनट में पढ़ें
-
प्रॉडक्ट से जुड़ी खबरें
हमने Google I/O 2026 में, Android को ऑपरेटिंग सिस्टम से इंटेलिजेंस सिस्टम में बदलने के बारे में बताया. हमने यह भी दिखाया कि सिस्टम के साथ मिलकर, नेटिव तौर पर इंटेलिजेंट अनुभव कैसे बनाए जा सकते हैं. साथ ही, Google के एआई की सुविधाओं को अपने ऐप्लिकेशन में कैसे शामिल किया जा सकता है.
Jingyu Shi • दो मिनट में पढ़ें
अप-टू-डेट रहें
Android डेवलपमेंट से जुड़ी नई अहम जानकारी, हर हफ़्ते अपने इनबॉक्स में पाएं.