অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) থেকে শুরু করে, MediaPlayer এমন এপিআই অন্তর্ভুক্ত করা হয়েছে যা ডিআরএম-সুরক্ষিত কন্টেন্ট প্লেব্যাক সমর্থন করে। মিডিয়াপ্লেয়ারের ডিআরএম এপিআইগুলো MediaDrm দ্বারা প্রদত্ত লো-লেভেল এপিআই-এর অনুরূপ, কিন্তু এগুলো একটি উচ্চতর স্তরে কাজ করে এবং অন্তর্নিহিত এক্সট্র্যাক্টর, ডিআরএম, ও ক্রিপ্টো অবজেক্টগুলোকে প্রকাশ করে না।
যদিও MediaPlayer DRM API, MediaDrm এর সম্পূর্ণ কার্যকারিতা প্রদান করে না, তবুও এটি সর্বাধিক প্রচলিত ব্যবহারগুলোকে সমর্থন করে। এর বর্তমান বাস্তবায়ন নিম্নলিখিত কন্টেন্ট টাইপগুলো পরিচালনা করতে পারে:
- ওয়াইডভাইন-সুরক্ষিত স্থানীয় মিডিয়া ফাইল
- ওয়াইডভাইন-সুরক্ষিত রিমোট বা স্ট্রিমিং মিডিয়া ফাইল
নিম্নলিখিত কোড স্নিপেটটি একটি সিনক্রোনাস বাস্তবায়নে নতুন DRM MediaPlayer মেথডগুলো কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করে।
DRM-নিয়ন্ত্রিত মিডিয়া পরিচালনা করতে, আপনাকে MediaPlayer কলের সাধারণ প্রবাহের পাশাপাশি নতুন পদ্ধতিগুলোও অন্তর্ভুক্ত করতে হবে, যেমনটি এই উদাহরণে দেখানো হয়েছে:
কোটলিন
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()
}
জাভা
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() ব্যবহার করে এর সোর্স সেট করুন। এরপর, DRM ব্যবহার করার জন্য এই ধাপগুলো অনুসরণ করুন:
- যদি আপনি আপনার অ্যাপকে কাস্টম কনফিগারেশন করতে চান, তাহলে একটি
OnDrmConfigHelperইন্টারফেস সংজ্ঞায়িত করুন এবংsetOnDrmConfigHelper()ব্যবহার করে এটিকে প্লেয়ারের সাথে সংযুক্ত করুন। -
prepare()কল করুন। -
getDrmInfo()কল করুন। যদি সোর্সে DRM কন্টেন্ট থাকে, তাহলে মেথডটি একটি নন-নালMediaPlayer.DrmInfoভ্যালু রিটার্ন করে।
যদি MediaPlayer.DrmInfo বিদ্যমান থাকে:
- উপলব্ধ UUID-গুলোর মানচিত্রটি পরীক্ষা করুন এবং একটি বেছে নিন।
-
prepareDrm()কল করে বর্তমান সোর্সের জন্য DRM কনফিগারেশন প্রস্তুত করুন।- যদি আপনি একটি
OnDrmConfigHelperকলব্যাক তৈরি এবং রেজিস্টার করে থাকেন, তাহলেprepareDrm()এক্সিকিউট হওয়ার সময় এটি কল করা হয়। এটি আপনাকে DRM সেশন খোলার আগে DRM প্রোপার্টিগুলোর কাস্টম কনফিগারেশন করার সুযোগ দেয়। যে থ্রেডটিprepareDrm()কল করেছে, সেই থ্রেডেই কলব্যাকটি সিনক্রোনাসলি কল করা হয়। DRM প্রোপার্টিগুলো অ্যাক্সেস করার জন্যgetDrmPropertyString()এবংsetDrmPropertyString()কল করুন। দীর্ঘ সময় ধরে চলা অপারেশনগুলো এড়িয়ে চলুন। - যদি ডিভাইসটি এখনও প্রোভিশন করা না হয়ে থাকে, তাহলে
prepareDrm()ডিভাইসটিকে প্রোভিশন করার জন্য প্রোভিশনিং সার্ভারকেও অ্যাক্সেস করে। নেটওয়ার্ক সংযোগের উপর নির্ভর করে এতে বিভিন্ন পরিমাণ সময় লাগতে পারে।
- যদি আপনি একটি
- লাইসেন্স সার্ভারে পাঠানোর জন্য একটি অস্বচ্ছ কী অনুরোধ বাইট অ্যারে পেতে,
getKeyRequest()কল করুন। - লাইসেন্স সার্ভার থেকে প্রাপ্ত কী রেসপন্স সম্পর্কে DRM ইঞ্জিনকে জানাতে,
provideKeyResponse()কল করুন। ফলাফলটি কী রিকোয়েস্টের ধরনের উপর নির্ভর করে:- যদি প্রতিক্রিয়াটি একটি অফলাইন কী অনুরোধের জন্য হয়, তাহলে ফলাফলটি একটি কী-সেট আইডেন্টিফায়ার হয়। আপনি
restoreKeys()এর সাথে এই কী-সেট আইডেন্টিফায়ারটি ব্যবহার করে একটি নতুন সেশনে কীগুলি পুনরুদ্ধার করতে পারেন। - যদি প্রতিক্রিয়াটি কোনো স্ট্রিমিং বা রিলিজ অনুরোধের জন্য হয়, তাহলে ফলাফলটি নাল (null) হবে।
- যদি প্রতিক্রিয়াটি একটি অফলাইন কী অনুরোধের জন্য হয়, তাহলে ফলাফলটি একটি কী-সেট আইডেন্টিফায়ার হয়। আপনি
অ্যাসিঙ্ক্রোনাসভাবে ডিআরএম প্রস্তুত করুন
ডিফল্টরূপে, prepareDrm() সিনক্রোনাসভাবে চলে এবং প্রস্তুতি শেষ না হওয়া পর্যন্ত ব্লক হয়ে থাকে। তবে, একটি নতুন ডিভাইসে প্রথমবারের মতো DRM প্রস্তুতির জন্য প্রভিশনিং-এরও প্রয়োজন হতে পারে, যা prepareDrm() অভ্যন্তরীণভাবে পরিচালনা করে এবং এতে জড়িত নেটওয়ার্ক অপারেশনের কারণে এটি শেষ হতে কিছুটা সময় লাগতে পারে। আপনি একটি MediaPlayer.OnDrmPreparedListener সংজ্ঞায়িত এবং সেট করার মাধ্যমে prepareDrm() ফাংশনে ব্লক হওয়া এড়াতে পারেন।
একটি OnDrmPreparedListener সেট করুন। prepareDrm() ব্যাকগ্রাউন্ডে প্রোভিশনিং (প্রয়োজন হলে) এবং প্রস্তুতির কাজ সম্পন্ন করে। প্রোভিশনিং এবং প্রস্তুতি শেষ হলে, সিস্টেম লিসেনারটিকে কল করে। কলিং সিকোয়েন্স বা লিসেনারটি কোন থ্রেডে চলবে সে সম্পর্কে কোনো অনুমান করবেন না (যদি না আপনি লিসেনারটিকে একটি হ্যান্ডলার থ্রেডের সাথে রেজিস্টার করেন)। সিস্টেম prepareDrm() রিটার্ন করার আগে বা পরেও লিসেনারটিকে কল করতে পারে।
অ্যাসিঙ্ক্রোনাসভাবে ডিআরএম সেট আপ করুন
আপনি DRM প্রস্তুতির জন্য MediaPlayer.OnDrmInfoListener এবং প্লেয়ার চালু করার জন্য MediaPlayer.OnDrmPreparedListener তৈরি ও রেজিস্টার করে অ্যাসিঙ্ক্রোনাসভাবে DRM ইনিশিয়ালাইজ করতে পারেন। এগুলি prepareAsync() এর সাথে একত্রে কাজ করে, যেমনটি এই উদাহরণে দেখানো হয়েছে:
কোটলিন
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()
}
জাভা
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();
}
এনক্রিপ্টেড মিডিয়া পরিচালনা করুন
অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) থেকে MediaPlayer এখন এইচ.২৬৪ এবং এএসি-এর মতো প্রাথমিক স্ট্রিম টাইপগুলোর জন্য কমন এনক্রিপশন স্কিম (সিইএনসি) এবং এইচএলএস স্যাম্পল-লেভেল এনক্রিপ্টেড মিডিয়া (মেথড=স্যাম্পল-এএস) ডিক্রিপ্ট করতে পারে। ফুল-সেগমেন্ট এনক্রিপ্টেড মিডিয়া (মেথড=এএস-১২৮) আগে থেকেই সমর্থিত ছিল।
আরও জানুন
আপনার অ্যাপে মিডিয়া প্লেব্যাকের জন্য Jetpack Media3 হলো প্রস্তাবিত সমাধান। এ সম্পর্কে আরও পড়ুন ।
এই পৃষ্ঠাগুলিতে অডিও এবং ভিডিও রেকর্ড করা, সংরক্ষণ করা এবং প্লেব্যাক করা সম্পর্কিত বিষয়গুলি আলোচনা করা হয়েছে: