MediaPlayer और डिजिटल राइट मैनेजमेंट (डीआरएम) के साथ काम करना

Android 8.0 (एपीआई लेवल 26) से, MediaPlayer में ऐसे एपीआई शामिल हैं जो DRM से सुरक्षित कॉन्टेंट को चलाने की सुविधा देते हैं. MediaPlayer DRM API, 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() पर कॉल करें. अगर सोर्स में DRM वाला कॉन्टेंट है, तो यह तरीका, शून्य नहीं है MediaPlayer.DrmInfo वैल्यू दिखाता है.

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

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

डीआरएम को एसिंक्रोनस तरीके से तैयार करना

डिफ़ॉल्ट रूप से, prepareDrm() फ़ंक्शन सिंक्रोनस तरीके से काम करता है. यह तब तक ब्लॉक रहता है, जब तक तैयारी पूरी नहीं हो जाती. हालांकि, नए डिवाइस पर पहली बार DRM की तैयारी के लिए भी प्रोविज़निंग की ज़रूरत पड़ सकती है. इसे prepareDrm() अंदरूनी तौर पर हैंडल करता है. साथ ही, इसमें नेटवर्क ऑपरेशन शामिल होने की वजह से, इसे पूरा होने में कुछ समय लग सकता है. MediaPlayer.OnDrmPreparedListener को तय करके और सेट करके, prepareDrm() पर ब्लॉक होने से बचा जा सकता है.

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, H.264 और AAC जैसे एलिमेंट्री स्ट्रीम टाइप के लिए, कॉमन एन्क्रिप्शन स्कीम (सीईएनसी) और एचएलएस के सैंपल-लेवल पर एन्क्रिप्ट (METHOD=SAMPLE-AES) किए गए मीडिया को भी डिक्रिप्ट कर सकता है. पहले, पूरे सेगमेंट के लिए एन्क्रिप्ट (सुरक्षित) किए गए मीडिया (METHOD=AES-128) का इस्तेमाल किया जा सकता था.

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

आपके ऐप्लिकेशन में मीडिया चलाने के लिए, Jetpack Media3 का इस्तेमाल करने का सुझाव दिया जाता है. इसके बारे में ज़्यादा जानें.

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