Android मल्टीमीडिया फ़्रेमवर्क में कई तरह के सामान्य मीडिया को चलाने की सुविधा होती है, इसलिए
जिसे आप अपने ऐप्लिकेशन में ऑडियो, वीडियो, और इमेज आसानी से इंटिग्रेट कर सकते हैं. ऑडियो चलाया जा सकता है या
आपके ऐप्लिकेशन के संसाधनों (रॉ संसाधन) में सेव की गई मीडिया फ़ाइलों का वीडियो, स्टैंडअलोन फ़ाइलों से
फ़ाइल सिस्टम में या किसी नेटवर्क कनेक्शन पर आने वाली डेटा स्ट्रीम से. ये सभी, MediaPlayer
API का इस्तेमाल करते हैं.
इस दस्तावेज़ में,
मीडिया चलाने के लिए MediaPlayer
ऐसा ऐप्लिकेशन जो बेहतर परफ़ॉर्मेंस पाने के लिए उपयोगकर्ता और सिस्टम के साथ इंटरैक्ट करता है और
उपयोगकर्ता अनुभव अच्छा रहा हो. इसके अलावा, शायद आपको
ExoPlayer का इस्तेमाल करें, जो पसंद के मुताबिक बनाया जा सकने वाला ओपन सोर्स है
बेहतरीन परफ़ॉर्मेंस वाली ऐसी लाइब्रेरी जो MediaPlayer
में उपलब्ध नहीं है
ध्यान दें: ऑडियो डेटा को सिर्फ़ स्टैंडर्ड आउटपुट पर चलाया जा सकता है डिवाइस. फ़िलहाल, वह मोबाइल डिवाइस का स्पीकर या ब्लूटूथ हेडसेट है. आपके पास आवाज़ चलाने की सुविधा नहीं है कॉल के दौरान बातचीत के ऑडियो में मौजूद फ़ाइलें.
बुनियादी बातें
Android फ़्रेमवर्क में साउंड और वीडियो चलाने के लिए, इन क्लास का इस्तेमाल किया जाता है:
MediaPlayer
- यह क्लास, आवाज़ और वीडियो चलाने के लिए मुख्य एपीआई है.
AudioManager
- यह क्लास किसी डिवाइस पर ऑडियो सोर्स और ऑडियो आउटपुट को मैनेज करती है.
मेनिफ़ेस्ट फ़ाइल
MediaPlayer का इस्तेमाल करके अपने ऐप्लिकेशन पर डेवलपमेंट शुरू करने से पहले, पक्का करें कि आपके मेनिफ़ेस्ट में संबंधित सुविधाओं के इस्तेमाल की अनुमति देने के लिए सही एलान.
- इंटरनेट की अनुमति - अगर नेटवर्क के हिसाब से स्ट्रीम करने के लिए MediaPlayer का इस्तेमाल किया जा रहा है
कॉन्टेंट न हो, तो आपके ऐप्लिकेशन को नेटवर्क ऐक्सेस का अनुरोध करना होगा.
<uses-permission android:name="android.permission.INTERNET" />
- वेक लॉक अनुमति - अगर आपके प्लेयर ऐप्लिकेशन को स्क्रीन रखने की ज़रूरत है
या प्रोसेसर को स्लीप मोड (कम बैटरी मोड) में जाने से रोकता है या
MediaPlayer.setScreenOnWhilePlaying()
याMediaPlayer.setWakeMode()
तरीकों का इस्तेमाल करते हैं, तो आपको इस अनुमति के लिए अनुरोध करना होगा.<uses-permission android:name="android.permission.WAKE_LOCK" />
MediaPlayer का इस्तेमाल करना
मीडिया फ़्रेमवर्क के सबसे ज़रूरी कॉम्पोनेंट में से एक है,
MediaPlayer
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
क्लास. इस क्लास का ऑब्जेक्ट, ऑडियो और वीडियो, दोनों को फ़ेच कर सकता है, डिकोड कर सकता है, और चला सकता है
आसान सेटअप की सुविधा मिलती है. यह कई अलग-अलग मीडिया सोर्स के साथ काम करता है, जैसे कि:
- स्थानीय संसाधन
- आंतरिक यूआरआई, जैसे कि आपको किसी कॉन्टेंट रिज़ॉल्वर से मिल सकता है
- बाहरी यूआरएल (स्ट्रीमिंग)
Android पर काम करने वाले मीडिया फ़ॉर्मैट की सूची देखने के लिए, मदद करने वाला मीडिया देखें फ़ॉर्मैट पेज पर जाएं.
यहां एक उदाहरण दिया गया है
किसी स्थानीय रॉ संसाधन के रूप में उपलब्ध ऑडियो को चलाने का तरीका (आपके ऐप्लिकेशन के
res/raw/
डायरेक्ट्री):
Kotlin
var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1) mediaPlayer.start() // no need to call prepare(); create() does that for you
Java
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1); mediaPlayer.start(); // no need to call prepare(); create() does that for you
इस मामले में, "रॉ" रिसॉर्स एक ऐसी फ़ाइल है जिसे सिस्टम तो किसी खास तरीके से पार्स करने की कोशिश करें. हालांकि, इस संसाधन का कॉन्टेंट ऐसा नहीं होना चाहिए कि बिना किसी रुकावट के ऑडियो सुनें. यह एक इमेज फ़ॉर्मैट में सही तरीके से कोड में बदली गई और फ़ॉर्मैट की गई मीडिया फ़ाइल होनी चाहिए इस्तेमाल कर सकते हैं.
सिस्टम में उपलब्ध यूआरआई से गेम खेलने का तरीका यहां बताया गया है (उदाहरण के लिए, जो आपको कॉन्टेंट रिज़ॉल्वर से मिला है):
Kotlin
val myUri: Uri = .... // initialize Uri here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, myUri) prepare() start() }
Java
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
एचटीटीपी स्ट्रीमिंग के ज़रिए किसी रिमोट यूआरएल से चलाना ऐसा दिखता है:
Kotlin
val url = "http://........" // your URL here val mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(url) prepare() // might take long! (for buffering, etc) start() }
Java
String url = "http://........"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start();
ध्यान दें: अगर ऑनलाइन मीडिया फ़ाइल को स्ट्रीम करने के लिए यूआरएल पास किया जा रहा है, तो फ़ाइल में डाउनलोड करने के अलग-अलग चरण हो सकते हैं.
चेतावनी: आपको या तो पकड़ना होगा या पास होना होगा
IllegalArgumentException
और IOException
का इस्तेमाल करते समय
setDataSource()
, क्योंकि
हो सकता है कि जिस फ़ाइल का आप संदर्भ दे रहे हैं वह मौजूद न हो.
एसिंक्रोनस तैयारी
MediaPlayer
का इस्तेमाल आसानी से किया जा सकता है
सिद्धांत. हालांकि, यह ध्यान रखना ज़रूरी है कि कुछ और बातें
इसे सामान्य Android ऐप्लिकेशन के साथ सही तरीके से इंटिग्रेट करने की ज़रूरत होती है. इसके लिए
उदाहरण के लिए, prepare()
को किया गया कॉल
उसे लागू करने में बहुत समय लगता है, क्योंकि
इसमें मीडिया डेटा को फ़ेच और डिकोड करना शामिल हो सकता है. इसलिए, जैसा कि किसी भी
का उपयोग करने के लिए डिज़ाइन किया गया है, तो आपको इसे कभी भी अपने
ऐप्लिकेशन का यूज़र इंटरफ़ेस (यूआई) थ्रेड शामिल है. ऐसा करने से यूज़र इंटरफ़ेस (यूआई), जब तक तरीका नहीं दिखता, तब तक अटक जाता है,
जो बहुत खराब उपयोगकर्ता अनुभव है और इसकी वजह से ANR (ऐप्लिकेशन काम नहीं कर रहा है) गड़बड़ी हो सकती है. भले ही
आपको उम्मीद है कि आपका संसाधन तुरंत लोड हो जाएगा. याद रखें कि ऐसी कोई भी चीज़ जिसमें 10वें हिस्से से ज़्यादा समय लगता है
में से एक सेकंड का समय निकल जाता है. इससे यूज़र इंटरफ़ेस में
उपयोगकर्ता को यह इंप्रेशन मिलने लगता है कि आपका ऐप्लिकेशन धीमा है.
अपने यूज़र इंटरफ़ेस (यूआई) थ्रेड को हैंग होने से बचाने के लिए, एक और थ्रेड बनाएं
MediaPlayer
को तैयार करें और यह प्रोसेस पूरी हो जाने पर, मुख्य थ्रेड को इसकी सूचना दें. हालांकि, जब
ऐसा करने के लिए, एक मैसेज लिखा जा सकता है.
MediaPlayer
का इस्तेमाल करते समय यह पैटर्न इतना आम है कि
का उपयोग करके इस कार्य को पूरा करने का एक आसान तरीका उपलब्ध कराता है
prepareAsync()
तरीका. यह तरीका
बैकग्राउंड में मीडिया तैयार करना शुरू करता है और तुरंत वापस आ जाता है. जब मीडिया
तैयार हो गया है. onPrepared()
MediaPlayer.OnPreparedListener
का तरीका, जिसे इसके ज़रिए कॉन्फ़िगर किया गया है
setOnPreparedListener()
को कॉल किया गया है.
मैनेज करने की स्थिति
MediaPlayer
का एक और पहलू, जिसे आपको ध्यान में रखना चाहिए
यह राज्य सरकार के हिसाब से होता है. इसका मतलब है कि MediaPlayer
में एक इंटरनल स्टेट है
कोड लिखते समय आपको हमेशा जानकारी होनी चाहिए, क्योंकि कुछ
तभी मान्य होते हैं, जब प्लेयर कुछ खास स्थितियों में होता है. अगर आप
गलत स्थिति होने पर, सिस्टम कोई अपवाद या अन्य अनचाहे व्यवहार की वजह बन सकता है.
दस्तावेज़ में मौजूद दस्तावेज़
MediaPlayer
क्लास पूरी स्थिति का डायग्राम दिखाती है,
जो साफ़ तौर पर बताता है कि कौनसे तरीके MediaPlayer
को एक से दूसरी स्थिति में ले जाते हैं.
उदाहरण के लिए, नया MediaPlayer
बनाने पर, वह कुछ समय से इस्तेमाल में नहीं है
राज्य. इसके बाद, आपको
setDataSource()
, इसे लाया जा रहा है
वैल्यू को शुरू किया गया पर सेट करता है. इसके बाद, आपको
prepare()
या
prepareAsync()
तरीका. टास्क कब शुरू होगा
MediaPlayer
तैयार हो गया है और तैयार है
राज्य का मतलब है, इसका मतलब है कि आप start()
को कॉल कर सकते हैं
मीडिया चलाने के लिए. और इस दौरान, जैसा कि इस डायग्राम में दिखाया गया है,
शुरू किया गया, रोका गया, और प्लेबैक पूरा हो गया स्टेटस के बीच स्विच किया जा सकता है
इस तरह की कॉल करने से,
start()
,
pause()
, और
seekTo()
,
और कई अन्य चीज़ों के बीच में. आसानी से अपने कैलेंडर में जोड़ें.
हालाँकि, stop()
को कॉल करते समय ध्यान दें कि आपने
जब तक आप start()
को फिर से कॉल नहीं कर सकते
MediaPlayer
को फिर से तैयार करें.
स्टेट डायग्राम को हमेशा बनाए रखें
को ध्यान में रखते हुए ऐसा कोड लिखें जो
MediaPlayer
ऑब्जेक्ट है, क्योंकि इसकी मेथड को गलत स्थिति से कॉल करने पर
की आम वजहें हैं.
MediaPlayer को रिलीज़ करना
MediaPlayer
, आपकी
सिस्टम संसाधन.
इसलिए, आपको यह पक्का करने के लिए हमेशा अतिरिक्त सावधानियां रखनी चाहिए कि आप
MediaPlayer
इंस्टेंस पर ज़रूरत से ज़्यादा समय तक हैं. आसानी से अपने कैलेंडर में जोड़ें.
काम पूरा कर लिया है, तो आपको हमेशा कॉल करना चाहिए
release()
पक्का करें कि
इसके लिए तय किए गए सिस्टम रिसॉर्स सही तरीके से रिलीज़ किए गए. उदाहरण के लिए, अगर आपको
MediaPlayer
का इस्तेमाल करने पर और आपकी गतिविधि के लिए onStop()
पर कॉल आता है, तो आपको MediaPlayer
हटाना होगा,
क्योंकि यह
जब आपकी गतिविधि
उपयोगकर्ता (जब तक कि बैकग्राउंड में मीडिया न चलाया जा रहा हो, जिसकी चर्चा अगले सेक्शन में की गई है).
जब आपकी गतिविधि फिर से शुरू या फिर से शुरू होती है, तो बेशक आपको
नया MediaPlayer
बनाएं और प्लेबैक फिर से शुरू करने से पहले उसे दोबारा तैयार करें.
यहां बताया गया है कि आपको अपने MediaPlayer
को कैसे रिलीज़ करना चाहिए और फिर उसे खाली कैसे करना चाहिए:
Kotlin
mediaPlayer?.release() mediaPlayer = null
Java
mediaPlayer.release(); mediaPlayer = null;
उदाहरण के तौर पर, उन समस्याओं के बारे में सोचें जो हो सकती हैं अगर आप
आपकी गतिविधि बंद होने पर, MediaPlayer
को रिलीज़ करना भूल गए, लेकिन एक
गतिविधि फिर से शुरू होने पर, एक नई सूचना दिखेगी. जैसा कि आप जानते होंगे, जब उपयोगकर्ता
स्क्रीन ओरिएंटेशन (या डिवाइस कॉन्फ़िगरेशन को किसी दूसरे तरीके से बदलता है),
गतिविधि को रीस्टार्ट करके सिस्टम इसे मैनेज करता है (डिफ़ॉल्ट रूप से), इसलिए
उपयोगकर्ता के तौर पर सिस्टम के सभी संसाधनों का इस्तेमाल करना चाहिए
डिवाइस को पोर्ट्रेट और लैंडस्केप के बीच आगे और पीछे घुमाता है, क्योंकि हर
स्क्रीन की दिशा में बदलाव हो जाता है, तो आप ऐसा नया MediaPlayer
बनाते हैं जो
रिलीज़. (रनटाइम के रीस्टार्ट होने के बारे में ज़्यादा जानकारी के लिए, रनटाइम में होने वाले बदलावों को मैनेज करना लेख पढ़ें.)
आपके मन में यह विचार आ रहा होगा कि अगर खेलना जारी रखना हो, तो क्या होगा
"बैकग्राउंड मीडिया" जब लोग आपकी गतिविधि को छोड़ देते हैं, तब भी समय कोई और
जिस तरह से बिल्ट-इन म्यूज़िक ऐप्लिकेशन काम करता है. इस स्थिति में आपको इनकी ज़रूरत होगी
MediaPlayer
को किसी सेवा से कंट्रोल किया जाता हो. जैसे:
अगले सेक्शन में इसकी चर्चा की गई है
किसी सेवा में MediaPlayer का इस्तेमाल करना
अगर आपको ऐप्लिकेशन के बैकग्राउंड में मीडिया चलाना है, तब भी
स्क्रीन पर नहीं है—इसका मतलब है कि आपको उसे तब तक चलाना है, जब तक उपयोगकर्ता
अन्य ऐप्लिकेशन के साथ इंटरैक्ट कर रहे हैं—तो आपको
सेवा और नियंत्रण
वहां से MediaPlayer
इंस्टेंस.
आपको
MediaPlayer, MediaBrowserServiceCompat
की सेवा में है और उसके पास
यह किसी
किसी अन्य गतिविधि में MediaBrowserCompat
.
आपको इस क्लाइंट/सर्वर सेटअप के बारे में सावधान रहना चाहिए. उम्मीद है कि बैकग्राउंड में चलने वाली सेवा का इस्तेमाल करने वाला प्लेयर, बाकी बचे ऐप्लिकेशन के साथ कैसे इंटरैक्ट करता है, इस बारे में जानकारी सिस्टम. अगर आपका ऐप्लिकेशन उन उम्मीदों को पूरा नहीं करता है, तो उपयोगकर्ता आपका अनुभव खराब रहा है. मैसेज पढ़ा गया ऑडियो ऐप्लिकेशन बनाना देखें.
इस सेक्शन में, किसी सेवा के अंदर लागू किए जाने पर MediaPlayer को मैनेज करने के लिए खास निर्देशों के बारे में बताया गया है.
एसिंक्रोनस रूप से चल रहा है
सबसे पहले, किसी Activity
की तरह, सभी
Service
को एक थ्रेड में ये काम हो रहे हैं:
डिफ़ॉल्ट—असल में, अगर आप एक ही ऐप्लिकेशन से कोई गतिविधि और सेवा चला रहे हैं, तो वे
डिफ़ॉल्ट रूप से, उसी थ्रेड ("मुख्य थ्रेड") का इस्तेमाल करें. इसलिए, सेवाओं को
आने वाले इंटेंट को तेज़ी से प्रोसेस करें
और जवाब देते समय लंबी गणना न करें. अगर बहुत ज़्यादा
काम या ब्लॉक करने की कॉल अपेक्षित है, तो आपको वे काम एसिंक्रोनस रूप से करने होंगे:
कोई दूसरा थ्रेड जिसे आपने खुद लागू किया हो या फ़्रेमवर्क की कई सुविधाओं का इस्तेमाल करके
का इस्तेमाल किया जा सकता है.
उदाहरण के लिए, मुख्य थ्रेड से MediaPlayer
का इस्तेमाल करते समय,
आपको इसके बजाय prepareAsync()
पर कॉल करना चाहिए
prepare()
और लागू करें
MediaPlayer.OnPreparedListener
ताकि तैयारी पूरी होने पर सूचना मिले और आप खेलना शुरू कर सकें.
उदाहरण के लिए:
Kotlin
private const val ACTION_PLAY: String = "com.example.action.PLAY" class MyService: Service(), MediaPlayer.OnPreparedListener { private var mMediaPlayer: MediaPlayer? = null override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { ... val action: String = intent.action when(action) { ACTION_PLAY -> { mMediaPlayer = ... // initialize it here mMediaPlayer?.apply { setOnPreparedListener(this@MyService) prepareAsync() // prepare async to not block main thread } } } ... } /** Called when MediaPlayer is ready */ override fun onPrepared(mediaPlayer: MediaPlayer) { mediaPlayer.start() } }
Java
public class MyService extends Service implements MediaPlayer.OnPreparedListener { private static final String ACTION_PLAY = "com.example.action.PLAY"; MediaPlayer mediaPlayer = null; public int onStartCommand(Intent intent, int flags, int startId) { ... if (intent.getAction().equals(ACTION_PLAY)) { mediaPlayer = ... // initialize it here mediaPlayer.setOnPreparedListener(this); mediaPlayer.prepareAsync(); // prepare async to not block main thread } } /** Called when MediaPlayer is ready */ public void onPrepared(MediaPlayer player) { player.start(); } }
एसिंक्रोनस गड़बड़ियों को मैनेज करना
सिंक्रोनस ऑपरेशन पर, आम तौर पर गड़बड़ियां होंगी
किसी अपवाद या गड़बड़ी के कोड के साथ सिग्नल दिया जाता होगा, लेकिन जब एसिंक्रोनस का इस्तेमाल किया जाता है
संसाधनों के लिए, आपको यह पक्का करना होगा कि आपके ऐप्लिकेशन को
गड़बड़ियों को सही तरीके से दिखाने में मदद मिलती है. MediaPlayer
के मामले में,
तो यह लक्ष्य पूरा करने के लिए,
MediaPlayer.OnErrorListener
और
इसे अपने MediaPlayer
इंस्टेंस में सेट करें:
Kotlin
class MyService : Service(), MediaPlayer.OnErrorListener { private var mediaPlayer: MediaPlayer? = null fun initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer?.setOnErrorListener(this) } override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
Java
public class MyService extends Service implements MediaPlayer.OnErrorListener { MediaPlayer mediaPlayer; public void initMediaPlayer() { // ...initialize the MediaPlayer here... mediaPlayer.setOnErrorListener(this); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { // ... react appropriately ... // The MediaPlayer has moved to the Error state, must be reset! } }
यह ध्यान रखना ज़रूरी है कि कोई गड़बड़ी होने पर, MediaPlayer
गड़बड़ी की स्थिति में जाता है (इसके लिए दस्तावेज़ देखें
पूरे स्टेट डायग्राम के लिए MediaPlayer
क्लास)
और इसे फिर से इस्तेमाल करने से पहले आपको इसे रीसेट करना होगा.
वेक लॉक का इस्तेमाल करना
मीडिया चलाने वाले ऐप्लिकेशन डिज़ाइन करते समय बैकग्राउंड में, डिवाइस बंद हो सकता है. जब तक आपकी सेवा चालू रहती है. क्योंकि Android सिस्टम संरक्षित करने की कोशिश करता है डिवाइस के स्लीप मोड में रहने के दौरान, सिस्टम बैटरी को बंद करने की कोशिश करता है फ़ोन में मौजूद सुविधाओं का CPU और वाई-फ़ाई हार्डवेयर सहित, ज़रूरी नहीं है. हालांकि, अगर आपकी सेवा में संगीत चलाया या स्ट्रीम किया जा रहा है, तो आपको सिस्टम को आपके वीडियो में रुकावट डालने से रोकता है.
यह सुनिश्चित करने के लिए कि आपकी सेवा तो आपको "वेक लॉक" का इस्तेमाल करना होगा. वेक लॉक की मदद से, सिस्टम में कुछ ऐसी सुविधा का इस्तेमाल हो रहा है जिसमें यह सुविधा, फ़ोन के कुछ समय तक इस्तेमाल में न होने पर भी उपलब्ध रहती है.
ध्यान दें: आपको वेक लॉक का इस्तेमाल हमेशा कम से कम करना चाहिए और उन्हें दबाकर रखना चाहिए बहुत ज़रूरी है, क्योंकि ये चीज़ों की बैटरी लाइफ़ बहुत कम कर देते हैं. डिवाइस.
यह पक्का करने के लिए कि MediaPlayer
के दौरान सीपीयू चलता रहे
कुछ चलाया जा रहा है, तो MediaPlayer
शुरू करते समय, setWakeMode()
तरीके को कॉल करें. इसके बाद,
लॉक को चलाते समय, MediaPlayer
तय किए गए लॉक को दबाकर रखता है और लॉक को छोड़ देता है
रोके या बंद होने पर:
Kotlin
mediaPlayer = MediaPlayer().apply { // ... other initialization here ... setWakeMode(applicationContext, PowerManager.PARTIAL_WAKE_LOCK) }
Java
mediaPlayer = new MediaPlayer(); // ... other initialization here ... mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
हालांकि, इस उदाहरण में हासिल किया गया वेक लॉक, सिर्फ़ इस बात की गारंटी देता है कि सीपीयू चालू रहेगा. अगर आपने
तुम YouTube TV पर
नेटवर्क और आप वाई-फ़ाई का उपयोग कर रहे हैं, तो हो सकता है कि आप
WifiLock
के तौर पर
जिसे आपको मैन्युअल रूप से हासिल और रिलीज़ करना होगा. इसलिए, जब आप
MediaPlayer
को रिमोट यूआरएल से साइन इन करने पर, आपको वाई-फ़ाई लॉक बनाना चाहिए और उसे हासिल करना चाहिए.
उदाहरण के लिए:
Kotlin
val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiLock: WifiManager.WifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock") wifiLock.acquire()
Java
WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE)) .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock"); wifiLock.acquire();
जब मीडिया को रोका या बंद किया जाता है या जब आपको इसकी ज़रूरत नहीं होती नेटवर्क, आपको लॉक रिलीज़ करना चाहिए:
Kotlin
wifiLock.release()
Java
wifiLock.release();
क्लीनअप किया जा रहा है
जैसा कि पहले बताया गया है, MediaPlayer
ऑब्जेक्ट बहुत ज़्यादा
इसलिए, आपको इसे सिर्फ़ तब तक रखना चाहिए, जब तक आपको ज़रूरत हो.
काम हो जाने पर release()
. यह ज़रूरी है
का इस्तेमाल करें, क्योंकि इस तरीके का इस्तेमाल
कूड़ा इकट्ठा करने वाले व्यक्ति को MediaPlayer
पर फिर से दावा करने में कुछ समय लग सकता है.
इसका मतलब है कि यह सिर्फ़ मेमोरी से जुड़ी ज़रूरतों के लिए संवेदनशील है, न कि मीडिया से जुड़े अन्य संसाधनों की कमी.
इसलिए, किसी सेवा का इस्तेमाल करते समय, आपको हमेशा
रिलीज़ की पुष्टि करने के लिए onDestroy()
तरीका
MediaPlayer
:
Kotlin
class MyService : Service() { private var mediaPlayer: MediaPlayer? = null // ... override fun onDestroy() { super.onDestroy() mediaPlayer?.release() } }
Java
public class MyService extends Service { MediaPlayer mediaPlayer; // ... @Override public void onDestroy() { super.onDestroy(); if (mediaPlayer != null) mediaPlayer.release(); } }
आपको MediaPlayer
की रिलीज़ के लिए, हमेशा दूसरे मौकों की तलाश करनी चाहिए
शट डाउन के दौरान उसे रिलीज़ करने के अलावा, और भी बहुत कुछ करते हैं. उदाहरण के लिए, अगर आपको लगता है कि
लंबे समय तक मीडिया चलाने की सुविधा हो. उदाहरण के लिए, ऑडियो फ़ोकस बंद होने के बाद,
आपको अपने मौजूदा MediaPlayer
को रिलीज़ करके, फिर से बनाना चाहिए
बाद में. इस
दूसरी ओर, अगर आपको वीडियो बहुत कम समय के लिए बंद करना है, तो आपको
इसे बनाने और तैयार करने में लगने वाले खर्च से बचने के लिए, अपने MediaPlayer
को बनाए रखें
फिर से.
डिजिटल राइट मैनेजमेंट (डीआरएम)
Android 8.0 (एपीआई लेवल 26) के बाद के वर्शन में, MediaPlayer
में ऐसे एपीआई शामिल हैं जो
डीआरएम से सुरक्षित सामग्री के प्लेबैक की सुविधा देता हो. ये उस लो-लेवल एपीआई से मिलते-जुलते होते हैं जिसे इन ऐप्लिकेशन ने उपलब्ध कराया है
MediaDrm
, लेकिन वह बड़े लेवल पर काम करता है और
डेटा इकट्ठा करने वाले टूल, dRM, और क्रिप्टो ऑब्जेक्ट को बिना अनुमति के सार्वजनिक करना.
हालांकि MediaPlayer DRM API,
MediaDrm
, यह इस्तेमाल के सबसे आम उदाहरणों के साथ काम करता है. कॉन्टेंट बनाने
मौजूदा फ़ॉर्मैट में, नीचे दिए गए कॉन्टेंट टाइप को हैंडल किया जा सकता है:
- Widevine से सुरक्षित की गई लोकल मीडिया फ़ाइलें
- Widevine से सुरक्षित रिमोट/स्ट्रीमिंग मीडिया फ़ाइलें
नीचे दिए गए कोड स्निपेट में, नए DRM MediaPlayer को इस्तेमाल करने का तरीका बताया गया है में इस्तेमाल करने का तरीका बताएंगे.
डीआरएम से कंट्रोल किए जाने वाले मीडिया को मैनेज करने के लिए, आपको नए तरीकों को साथ-साथ शामिल करना होगा MediaPlayer कॉल का सामान्य फ़्लो, जैसा कि नीचे दिखाया गया है:
Kotlin
mediaPlayer?.apply { setDataSource() setOnDrmConfigHelper() // optional, for custom configuration prepare() drmInfo?.also { prepareDrm() getKeyRequest() provideKeyResponse() } // MediaPlayer is now ready to use start() // ...play/pause/resume... stop() releaseDrm() }
Java
setDataSource(); setOnDrmConfigHelper(); // optional, for custom configuration prepare(); if (getDrmInfo() != null) { prepareDrm(); getKeyRequest(); provideKeyResponse(); } // MediaPlayer is now ready to use start(); // ...play/pause/resume... stop(); releaseDrm();
MediaPlayer
ऑब्जेक्ट और सेटिंग शुरू करके शुरू करें
इसका सोर्स setDataSource()
का इस्तेमाल करके,
पहले की तरह. फिर, डीआरएम का इस्तेमाल करने के लिए यह तरीका अपनाएं:
- अगर आप चाहते हैं कि आपका ऐप्लिकेशन कस्टम कॉन्फ़िगरेशन परफ़ॉर्म करे, तो
OnDrmConfigHelper
इंटरफ़ेस को कॉपी करके उसे इसका इस्तेमाल करने वाला खिलाड़ीsetOnDrmConfigHelper()
. prepare()
पर कॉल करें.getDrmInfo()
पर कॉल करें. अगर स्रोत में डीआरएम है तो यह तरीका 'शून्य' के अलावा कोई और वैल्यू दिखाता हैMediaPlayer.DrmInfo
वैल्यू.
अगर MediaPlayer.DrmInfo
मौजूद है, तो:
- उपलब्ध यूयूआईडी के मैप की जांच करें और कोई एक चुनें.
prepareDrm()
को कॉल करके, मौजूदा सोर्स के लिए डीआरएम कॉन्फ़िगरेशन तैयार करें.- अगर आपने
OnDrmConfigHelper
कॉलबैक, इसे कॉल किया जाता है जबकिprepareDrm()
एक्ज़ीक्यूट किया जा रहा है. इससे आपको डीआरएम का कस्टम कॉन्फ़िगरेशन करने की सुविधा मिलती है प्रॉपर्टी सेट अप की जा सकती है. कॉलबैक को कॉल किया जाता है कॉल करने वाले थ्रेड मेंprepareDrm()
. यहां की यात्रा पर हूं डीआरएम की प्रॉपर्टी ऐक्सेस करें, कॉल करेंgetDrmPropertyString()
औरsetDrmPropertyString()
. लंबे समय तक काम करने से बचें. - अगर डिवाइस में अब तक प्रावधान नहीं किया गया है,
prepareDrm()
ने भी डिवाइस का प्रावधान करने के लिए, प्रॉविज़निंग सर्वर को ऐक्सेस करता है. इसमें ज़्यादा समय लग सकता है समय की परिवर्तनशील समयावधि. - किसी लाइसेंस सर्वर को भेजने के लिए एक ओपेक कुंजी अनुरोध बाइट अरे पाने के लिए, कॉल करें
getKeyRequest()
. - लाइसेंस सर्वर से मिले मुख्य जवाब के बारे में डीआरएम इंजन को सूचित करने के लिए, कॉल करें
provideKeyResponse()
. नतीजा, मुख्य अनुरोध के टाइप पर निर्भर करता है:- अगर यह रिस्पॉन्स किसी ऑफ़लाइन कुंजी के अनुरोध के लिए है, तो नतीजा एक की-सेट आइडेंटिफ़ायर होता है. Google Analytics 4 पर माइग्रेट करने के लिए,
यह कुंजी-सेट आइडेंटिफ़ायर, कुंजियों को नए सिरे से वापस लाने के लिए
restoreKeys()
के साथ है सत्र. - अगर स्ट्रीमिंग या रिलीज़ करने के अनुरोध के लिए जवाब मिलता है, तो नतीजा शून्य होता है.
- अगर यह रिस्पॉन्स किसी ऑफ़लाइन कुंजी के अनुरोध के लिए है, तो नतीजा एक की-सेट आइडेंटिफ़ायर होता है. Google Analytics 4 पर माइग्रेट करने के लिए,
यह कुंजी-सेट आइडेंटिफ़ायर, कुंजियों को नए सिरे से वापस लाने के लिए
prepareDrm()
को एसिंक्रोनस रूप से चल रहा है
डिफ़ॉल्ट रूप से, prepareDrm()
सिंक्रोनस रूप से चलता है, और तैयारी पूरी होने तक ब्लॉक होता रहता है. हालांकि, जो
नए डिवाइस पर पहली डीआरएम तैयारी के लिए प्रावधान की ज़रूरत भी पड़ सकती है, जो कि
इसे संगठन अंदरूनी तौर पर मैनेज करता है
prepareDrm()
, और
नेटवर्क ऑपरेशन की वजह से, प्रोसेस को पूरा होने में कुछ समय लग सकता है. आप
को ब्लॉक करने से बचें
prepareDrm()
के हिसाब से
MediaPlayer.OnDrmPreparedListener
परिभाषित और सेट कर रहा है.
जब आप OnDrmPreparedListener
सेट करते हैं,
prepareDrm()
ज़रूरत पड़ने पर, बैकग्राउंड में प्रॉविज़निंग और तैयारी करता है. टास्क कब शुरू होगा
प्रावधान और तैयारी पूरी हो गई है, लिसनर को कॉल कर लिया गया है. आपको ऐसा करना चाहिए
कॉलिंग के क्रम या उस थ्रेड के बारे में कोई अनुमान नहीं लगाता है जिसमें
लिसनर चलता है (जब तक कि लिसनर को हैंडलर थ्रेड के साथ रजिस्टर न किया गया हो).
लिसनर को पहले या बाद में कॉल किया जा सकता है
prepareDrm()
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
वापस करना.
एसिंक्रोनस तरीके से डीआरएम सेट अप करना
आपके पास
डीआरएम की तैयारी के लिए MediaPlayer.OnDrmInfoListener
और
प्लेयर शुरू करने के लिए MediaPlayer.OnDrmPreparedListener
.
वे साथ मिलकर काम करते हैं
prepareAsync()
, जैसा कि नीचे दिखाया गया है:
Kotlin
setOnPreparedListener() setOnDrmInfoListener() setDataSource() prepareAsync() // ... // If the data source content is protected you receive a call to the onDrmInfo() callback. override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) { mediaPlayer.apply { prepareDrm() getKeyRequest() provideKeyResponse() } } // When prepareAsync() finishes, you receive a call to the onPrepared() callback. // If there is a DRM, onDrmInfo() sets it up before executing this callback, // so you can start the player. override fun onPrepared(mediaPlayer: MediaPlayer) { mediaPlayer.start() }
Java
setOnPreparedListener(); setOnDrmInfoListener(); setDataSource(); prepareAsync(); // ... // If the data source content is protected you receive a call to the onDrmInfo() callback. onDrmInfo() { prepareDrm(); getKeyRequest(); provideKeyResponse(); } // When prepareAsync() finishes, you receive a call to the onPrepared() callback. // If there is a DRM, onDrmInfo() sets it up before executing this callback, // so you can start the player. onPrepared() { start(); }
एन्क्रिप्ट (सुरक्षित) किया गया मीडिया मैनेज करना
Android 8.0 (एपीआई लेवल 26) के बाद वाले वर्शन पर मौजूद, MediaPlayer
को भी डिक्रिप्ट किया जा सकता है
कॉमन एन्क्रिप्शन स्कीम (सीईएनसी) और
प्राइमरी स्ट्रीम टाइप के लिए एचएलएस सैंपल-लेवल पर एन्क्रिप्ट (सुरक्षित) किया गया मीडिया (METHOD=SAMPLE-AES)
H.264 और AAC. पहले, फ़ुल-सेगमेंट में एन्क्रिप्ट (सुरक्षित) किया गया मीडिया (METHOD=AES-128) इस्तेमाल किया जा रहा था.
Content रिज़ॉल्वर से मीडिया फ़ेच करना
मीडिया प्लेयर ऐप्लिकेशन में काम आ सकने वाली एक अन्य सुविधा है:
उपयोगकर्ता के डिवाइस में मौजूद संगीत को फिर से पाने के लिए. बाहरी मीडिया के लिए ContentResolver
से क्वेरी करके ऐसा किया जा सकता है:
Kotlin
val resolver: ContentResolver = contentResolver val uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI val cursor: Cursor? = resolver.query(uri, null, null, null, null) when { cursor == null -> { // query failed, handle error. } !cursor.moveToFirst() -> { // no media on the device } else -> { val titleColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE) val idColumn: Int = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID) do { val thisId = cursor.getLong(idColumn) val thisTitle = cursor.getString(titleColumn) // ...process entry... } while (cursor.moveToNext()) } } cursor?.close()
Java
ContentResolver contentResolver = getContentResolver(); Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor cursor = contentResolver.query(uri, null, null, null, null); if (cursor == null) { // query failed, handle error. } else if (!cursor.moveToFirst()) { // no media on the device } else { int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); int idColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID); do { long thisId = cursor.getLong(idColumn); String thisTitle = cursor.getString(titleColumn); // ...process entry... } while (cursor.moveToNext()); }
MediaPlayer
के साथ इसका इस्तेमाल करने के लिए, ऐसा किया जा सकता है:
Kotlin
val id: Long = /* retrieve it from somewhere */ val contentUri: Uri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id ) mediaPlayer = MediaPlayer().apply { setAudioAttributes( AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ) setDataSource(applicationContext, contentUri) } // ...prepare and start...
Java
long id = /* retrieve it from somewhere */; Uri contentUri = ContentUris.withAppendedId( android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioAttributes( new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() ); mediaPlayer.setDataSource(getApplicationContext(), contentUri); // ...prepare and start...
ज़्यादा जानें
इन पेजों पर ऑडियो और वीडियो को रिकॉर्ड करने, सेव करने, और उन्हें चलाने से जुड़े विषय दिए गए हैं.