با شروع Android 8.0 (سطح API 26)، MediaPlayer
شامل APIهایی است که از پخش مواد محافظت شده با DRM پشتیبانی می کند. API های MediaPlayer DRM شبیه به API سطح پایین ارائه شده توسط MediaDrm
هستند، اما در سطح بالاتری کار می کنند و استخراج کننده، DRM و اشیاء رمزنگاری زیرین را در معرض دید قرار نمی دهند.
اگرچه MediaPlayer DRM API عملکرد کامل MediaDrm
را ارائه نمی دهد، اما از رایج ترین موارد استفاده پشتیبانی می کند. پیاده سازی فعلی می تواند انواع محتوای زیر را مدیریت کند:
- فایلهای رسانه محلی محافظت شده با Widevine
- فایل های رسانه ای از راه دور یا جریانی محافظت شده با Widevine
قطعه کد زیر نحوه استفاده از روش های جدید 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()
برای بازگرداندن کلیدها به یک جلسه جدید استفاده کنید. - اگر پاسخ برای درخواست پخش یا انتشار باشد، نتیجه صفر است.
- اگر پاسخ برای درخواست کلید آفلاین باشد، نتیجه یک شناسه مجموعه کلید است. می توانید از این شناسه مجموعه کلید با
DRM را به صورت ناهمزمان آماده کنید
بهطور پیشفرض، prepareDrm()
به صورت همزمان اجرا میشود و تا پایان آمادهسازی مسدود میشود. با این حال، اولین آماده سازی DRM در یک دستگاه جدید نیز ممکن است نیاز به تدارک داشته باشد، که prepareDrm()
به صورت داخلی انجام می شود و ممکن است به دلیل عملیات شبکه درگیر مدتی طول بکشد. شما می توانید با تعریف و تنظیم MediaPlayer.OnDrmPreparedListener
از مسدود کردن در prepareDrm()
جلوگیری کنید.
یک OnDrmPreparedListener
تنظیم کنید. prepareDrm()
تهیه (در صورت نیاز) و آماده سازی را در پس زمینه انجام می دهد. هنگام تهیه و آماده سازی، سیستم شنونده را فرا می خواند. در مورد دنباله فراخوانی یا رشته ای که شنونده در آن اجرا می شود هیچ فرضی نداشته باشید (مگر اینکه شنونده را با یک رشته کنترل کننده ثبت کنید). سیستم می تواند شنونده را قبل یا بعد از بازگشت prepareDrm()
فراخوانی کند.
DRM را به صورت ناهمزمان تنظیم کنید
می توانید با ایجاد و ثبت MediaPlayer.OnDrmInfoListener
برای آماده سازی DRM و 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();
}
رسانه های رمزگذاری شده را مدیریت کنید
شروع با Android 8.0 (سطح API 26) MediaPlayer
همچنین میتواند Common Encryption Scheme (CENC) و رسانه رمزگذاریشده در سطح نمونه HLS (METHOD=SAMPLE-AES) را برای انواع جریان ابتدایی H.264 و AAC رمزگشایی کند. رسانه رمزگذاری شده تمام بخش (METHOD=AES-128) قبلاً پشتیبانی می شد.
بیشتر بدانید
Jetpack Media3 راه حل پیشنهادی برای پخش رسانه در برنامه شما است. در مورد آن بیشتر بخوانید .
این صفحات موضوعات مربوط به ضبط، ذخیره و پخش صدا و تصویر را پوشش می دهند: