Media3 1.9.0 रिलीज़ हो गया है! गड़बड़ियां ठीक करने और परफ़ॉर्मेंस को बेहतर बनाने के अलावा, नए वर्शन में चार नए या काफ़ी हद तक फिर से लिखे गए मॉड्यूल भी शामिल हैं:
media3-inspector- प्लेबैक के बाहर मेटाडेटा और फ़्रेम एक्सट्रैक्ट करनाmedia3-ui-compose-material3- बस कुछ ही चरणों में, Material3 Compose मीडिया यूज़र इंटरफ़ेस (यूआई) बनाना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 का बुनियादी यूज़र इंटरफ़ेस (यूआई) बनाना
पिछले रिलीज़ में, हमने Compose यूज़र इंटरफ़ेस (यूआई) एलिमेंट और आपके प्लेयर इंस्टेंस के बीच कनेक्टर कोड उपलब्ध कराना शुरू किया था. Media3 1.9.0 के साथ, हमने एक नया मॉड्यूल media3-ui-compose-material3 जोड़ा है. इसमें पूरी तरह से स्टाइल किए गए Material3 बटन और कॉन्टेंट एलिमेंट शामिल हैं. इनकी मदद से, कुछ ही चरणों में मीडिया यूज़र इंटरफ़ेस (यूआई) बनाया जा सकता है. साथ ही, स्टाइल को पसंद के मुताबिक बनाने की पूरी सुविधा मिलती है. अगर आपको अपनी पसंद का यूज़र इंटरफ़ेस (यूआई) स्टाइल बनाना है, तो उन बिल्डिंग ब्लॉक का इस्तेमाल करें जो अपडेट और कनेक्शन लॉजिक का ध्यान रखते हैं. इससे आपको सिर्फ़ यूज़र इंटरफ़ेस (यूआई) एलिमेंट को डिज़ाइन करने पर ध्यान देना होगा. Compose यूज़र इंटरफ़ेस (यूआई) मॉड्यूल के बारे में ज़्यादा जानने के लिए, कृपया ज़्यादा जानकारी वाले गाइड पेज देखें.
हम 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)
}
}
}
पहले से मौजूद एलिमेंट के साथ, Compose प्लेयर का आसान यूज़र इंटरफ़ेस (यूआई)
Cast और लोकल प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज करना
media3-cast मॉड्यूल में मौजूद CastPlayer को फिर से लिखा गया है, ताकि लोकल प्लेबैक (उदाहरण के लिए, ExoPlayer के साथ) और रिमोट Cast प्लेबैक के बीच ट्रांज़िशन अपने-आप मैनेज हो सके.
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तरीके भी जोड़ दिए हैं. इनकी मदद से, पिछली आवाज़ को आसानी से वापस लाया जा सकता है. इसके लिए, आपको खुद ट्रैक करने की ज़रूरत नहीं है. - प्लेयर के अटकने का पता लगाना – कुछ मामलों में, प्लेयर बफ़रिंग या वीडियो चलाने की स्थिति में अटक सकता है. उदाहरण के लिए, कोडेक से जुड़ी समस्याओं या गलत कॉन्फ़िगरेशन की वजह से ऐसा हो सकता है. इससे आपके उपयोगकर्ताओं को परेशानी होगी, लेकिन आपको अपने आंकड़ों में ये समस्याएं कभी नहीं दिखेंगी! इस समस्या को साफ़ तौर पर दिखाने के लिए, प्लेयर अब अटकने की स्थिति का पता चलने पर,
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 का इस्तेमाल नहीं करता. हालांकि, अगर आपके इस्तेमाल के उदाहरण के लिए ज़रूरी हो, तो setMuxerFactory की मदद से FrameworkMuxer.Factory अब भी उपलब्ध कराया जा सकता है.
स्पीड अडजस्ट करने वाले नए एपीआई
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 Issue Tracker के ज़रिए हमसे संपर्क करें. हमें आपके जवाब का इंतज़ार रहेगा!
-
प्रॉडक्ट से जुड़ी खबरेंएजेंटिक डेवलपमेंट में तेज़ी आने के साथ-साथ, Android इंजीनियरिंग एक रोमांचक नए मुकाम पर पहुंच रही है: कोड पूरा करने में मदद करने से लेकर, आपके निर्देश पर एंड-टू-एंड काम करने वाले एजेंट तक. आपके पास अपनी पसंद के मुताबिक मॉडल और एजेंट चुनने और इस्तेमाल करने की पूरी सुविधा होती है.
Jason Buchel • तीन मिनट में पढ़ा जा सकता है -
प्रॉडक्ट से जुड़ी खबरेंआज हमने बताया कि हम “सिर्फ़ एक स्टोर नहीं” के अपने विज़न को अगले लेवल पर कैसे ले जा रहे हैं. 'आप' टैब से लेकर हमारे यूनिफ़ाइड गेमिंग प्लैटफ़ॉर्म तक, Google Play हर जगह उपयोगकर्ताओं की मदद कर रहा है. 'आप' टैब, हर महीने 25 करोड़ से ज़्यादा सक्रिय उपयोगकर्ताओं के लिए एक पर्सनल होम बेस है. वहीं, हमारा यूनिफ़ाइड गेमिंग प्लैटफ़ॉर्म, 70 करोड़ से ज़्यादा गेमर प्रोफ़ाइलों को जोड़ता है.
Paul Feng • तीन मिनट में पढ़ा जा सकता है -
प्रॉडक्ट से जुड़ी खबरेंGooglebook के साथ, हमें उपयोगकर्ताओं को खुद को अभिव्यक्त करने और इन टूल को ऐक्सेस करने में मदद करने की खुशी है.
Cyrus Stoller • पढ़ने में लगने वाला समय: दो मिनट
Android डेवलपमेंट से जुड़ी नई अहम जानकारी, हर हफ़्ते अपने इनबॉक्स में पाएं.