Media3 1.9.0 उपलब्ध है! इस रिलीज़ में, गड़बड़ियां ठीक की गई हैं और परफ़ॉर्मेंस को बेहतर बनाया गया है. इसके अलावा, इसमें चार नए या पूरी तरह से फिर से लिखे गए मॉड्यूल भी शामिल हैं:
media3-inspector- प्लेबैक के अलावा, मेटाडेटा और फ़्रेम एक्सट्रैक्ट करनाmedia3-ui-compose-material3- कुछ ही चरणों में, Material3 Compose Media यूज़र इंटरफ़ेस (यूआई) बनानाmedia3-cast- Cast और स्थानीय प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज करनाmedia3-decoder-av1- dav1d लाइब्रेरी पर आधारित, फिर से लिखे गए एक्सटेंशन डिकोडर की मदद से, AV1 वीडियो को एक जैसा प्लेबैक करना
हमने PreloadManager में, कैश मेमोरी और मेमोरी मैनेजमेंट से जुड़े सुधार भी किए हैं. साथ ही, ExoPlayer, Transformer, और MediaSession को इस्तेमाल करने के तरीके को आसान बनाया है.
इस रिलीज़ में, आपको मीडिया में किए गए बदलावों की झलक देखने के लिए, CompositionPlayer को ऐक्सेस करने की सुविधा भी मिलेगी. हालांकि, यह सुविधा फ़िलहाल एक्सपेरिमेंटल है.
ज़्यादा जानने के लिए, आगे पढ़ें. साथ ही, इस रिलीज़ में किए गए बदलावों की पूरी जानकारी के लिए, कृपया पूरी रिलीज़ नोट देखें.
प्लेबैक के अलावा, मेटाडेटा और फ़्रेम एक्सट्रैक्ट करना
कई बार ऐसा होता है, जब आपको प्लेबैक शुरू किए बिना मीडिया की जांच करनी होती है. उदाहरण के लिए, आपको यह पता लगाना हो सकता है कि इसमें कौनसे फ़ॉर्मैट शामिल हैं या इसकी अवधि कितनी है. इसके अलावा, थंबनेल भी वापस पाने पड़ सकते हैं.
media3-inspector का नया मॉड्यूल, प्लेबैक के बिना मीडिया की जांच करने के लिए सभी यूटिलिटी को एक जगह पर इकट्ठा करता है:
MediaItemसे अवधि, फ़ॉर्मैट, और स्टैटिक मेटाडेटा पढ़ने के लिएMetadataRetriever.- किसी आइटम से फ़्रेम या थंबनेल पाने के लिए
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 और स्थानीय प्लेबैक के बीच ट्रांज़िशन को अपने-आप मैनेज करना
CastPlayer को media3-cast मॉड्यूल में फिर से लिखा गया है, ताकि स्थानीय प्लेबैक (उदाहरण के लिए, 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के तरीके जोड़े हैं, ताकि पिछली आवाज़ को खुद ट्रैक किए बिना आसानी से वापस लाया जा सके. - प्लेयर के अटकने का पता लगाना – कुछ मामलों में, प्लेयर बफ़रिंग या चलाने की स्थिति में अटक सकता है. उदाहरण के लिए, कोडेक की समस्याओं या गलत कॉन्फ़िगरेशन की वजह से. इससे आपके उपयोगकर्ता परेशान होंगे, लेकिन आपको अपनी 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 की सबसे बड़ी प्राथमिकता है कि वह उपयोगकर्ताओं को ऑनलाइन सुरक्षित अनुभव दे और उन्हें नुकसान से बचाए.
Paul Feng • दो मिनट में पढ़ें -
प्रॉडक्ट से जुड़ी खबरेंआज हम Jetpack Compose 1.0 की रिलीज़ के पांच साल पूरे होने का जश्न मना रहे हैं. 28 जुलाई, 2021 को लॉन्च किए गए वर्शन 1.0 से लेकर, हमारी सबसे नई रिलीज़ 1.11 तक, हमने एपीआई में पिछले कुछ सालों में काफ़ी बदलाव देखे हैं. इसलिए, हम इस मौके का जश्न मना रहे हैं.
Rebecca Franks, Nick Butcher, Loryn Hairston • पांच मिनट में पढ़ें -
प्रॉडक्ट से जुड़ी खबरेंAndroid Studio Quail 2 का स्टेबल वर्शन अब उपलब्ध है. इसका इस्तेमाल प्रोडक्शन में किया जा सकता है. इससे आपके आईडीई में, एजेंटिक वर्कफ़्लो, मेमोरी लीक की प्रोफ़ाइलिंग, और कॉन्टेक्स्ट के हिसाब से क्रैश ठीक करने की सुविधा मिलेगी.
Amman Asfaw • तीन मिनट में पढ़ें
Android डेवलपमेंट से जुड़ी नई जानकारी हर हफ़्ते अपने इनबॉक्स में पाएं.