MediaPlayer की खास जानकारी

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() का इस्तेमाल करके, पहले की तरह. फिर, डीआरएम का इस्तेमाल करने के लिए यह तरीका अपनाएं:

  1. अगर आप चाहते हैं कि आपका ऐप्लिकेशन कस्टम कॉन्फ़िगरेशन परफ़ॉर्म करे, तो OnDrmConfigHelper इंटरफ़ेस को कॉपी करके उसे इसका इस्तेमाल करने वाला खिलाड़ी setOnDrmConfigHelper().
  2. prepare() पर कॉल करें.
  3. getDrmInfo() पर कॉल करें. अगर स्रोत में डीआरएम है तो यह तरीका 'शून्य' के अलावा कोई और वैल्यू दिखाता है MediaPlayer.DrmInfo वैल्यू.

अगर MediaPlayer.DrmInfo मौजूद है, तो:

  1. उपलब्ध यूयूआईडी के मैप की जांच करें और कोई एक चुनें.
  2. prepareDrm() को कॉल करके, मौजूदा सोर्स के लिए डीआरएम कॉन्फ़िगरेशन तैयार करें.
    • अगर आपने OnDrmConfigHelper कॉलबैक, इसे कॉल किया जाता है जबकि prepareDrm() एक्ज़ीक्यूट किया जा रहा है. इससे आपको डीआरएम का कस्टम कॉन्फ़िगरेशन करने की सुविधा मिलती है प्रॉपर्टी सेट अप की जा सकती है. कॉलबैक को कॉल किया जाता है कॉल करने वाले थ्रेड में prepareDrm(). यहां की यात्रा पर हूं डीआरएम की प्रॉपर्टी ऐक्सेस करें, कॉल करें getDrmPropertyString() और setDrmPropertyString(). लंबे समय तक काम करने से बचें.
    • अगर डिवाइस में अब तक प्रावधान नहीं किया गया है, prepareDrm() ने भी डिवाइस का प्रावधान करने के लिए, प्रॉविज़निंग सर्वर को ऐक्सेस करता है. इसमें ज़्यादा समय लग सकता है समय की परिवर्तनशील समयावधि.
  3. किसी लाइसेंस सर्वर को भेजने के लिए एक ओपेक कुंजी अनुरोध बाइट अरे पाने के लिए, कॉल करें getKeyRequest().
  4. लाइसेंस सर्वर से मिले मुख्य जवाब के बारे में डीआरएम इंजन को सूचित करने के लिए, कॉल करें provideKeyResponse(). नतीजा, मुख्य अनुरोध के टाइप पर निर्भर करता है:
    • अगर यह रिस्पॉन्स किसी ऑफ़लाइन कुंजी के अनुरोध के लिए है, तो नतीजा एक की-सेट आइडेंटिफ़ायर होता है. Google Analytics 4 पर माइग्रेट करने के लिए, यह कुंजी-सेट आइडेंटिफ़ायर, कुंजियों को नए सिरे से वापस लाने के लिए restoreKeys() के साथ है सत्र.
    • अगर स्ट्रीमिंग या रिलीज़ करने के अनुरोध के लिए जवाब मिलता है, तो नतीजा शून्य होता है.

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...

ज़्यादा जानें

इन पेजों पर ऑडियो और वीडियो को रिकॉर्ड करने, सेव करने, और उन्हें चलाने से जुड़े विषय दिए गए हैं.