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

Android 8.0 (एपीआई लेवल 26) से, MediaPlayer में ऐसे एपीआई शामिल हैं जिनकी मदद से, डीआरएम (डिजिटल राइट मैनेजमेंट) से सुरक्षित कॉन्टेंट चलाया जा सकता है. MediaPlayer के डीआरएम एपीआई, MediaDrm के ज़रिए उपलब्ध कराए गए लो-लेवल एपीआई से मिलते-जुलते हैं. हालांकि, ये एपीआई ज़्यादा लेवल पर काम करते हैं और इनमें मौजूद एक्सट्रैक्टर, डीआरएम, और क्रिप्टो ऑब्जेक्ट को एक्सपोज़ नहीं किया जाता.

MediaPlayer DRM API, MediaDrm की पूरी सुविधाएं नहीं देता. हालांकि, यह इस्तेमाल के ज़्यादातर सामान्य उदाहरणों के साथ काम करता है. फ़िलहाल, इस सुविधा के तहत इस तरह का कॉन्टेंट मैनेज किया जा सकता है:

  • Widevine से सुरक्षित की गई लोकल मीडिया फ़ाइलें
  • Widevine से सुरक्षित की गई रिमोट या स्ट्रीमिंग मीडिया फ़ाइलें

नीचे दिए गए कोड स्निपेट में, एक साथ लागू करने के लिए नए डीआरएम 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() को कॉल करें. नतीजा, पासकोड के अनुरोध के टाइप पर निर्भर करता है:
    • अगर रिस्पॉन्स, किसी ऑफ़लाइन पासकोड के अनुरोध के लिए है, तो नतीजा एक पासकोड सेट आइडेंटिफ़ायर होता है. कुंजियों को नए सेशन में वापस लाने के लिए, इस कुंजी सेट आइडेंटिफ़ायर का इस्तेमाल restoreKeys() के साथ किया जा सकता है.
    • अगर जवाब, स्ट्रीमिंग या रिलीज़ के अनुरोध के लिए है, तो नतीजा 'शून्य' होगा.

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

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

कोई OnDrmPreparedListener सेट करें. prepareDrm(), बैकग्राउंड में डिवाइस को डिवाइस के तौर पर सेट अप करने (ज़रूरत पड़ने पर) और तैयार करने की प्रोसेस करता है. डिवाइस को सेट अप करने और तैयार करने के बाद, सिस्टम लिसनर को कॉल करता है. कॉल करने के क्रम या उस थ्रेड के बारे में कोई अनुमान न लगाएं जिसमें लिसनर चलता है (जब तक कि आपने लिसनर को हैंडलर थ्रेड के साथ रजिस्टर नहीं किया है). सिस्टम, prepareDrm() के रिटर्न होने से पहले या बाद में, Listener को कॉल कर सकता है.

डीआरएम को अलग-अलग क्रम में सेट अप करना

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

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

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

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