کار با MediaPlayer و مدیریت حقوق دیجیتال (DRM)

با شروع 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 این مراحل را انجام دهید:

  1. اگر می خواهید برنامه شما پیکربندی سفارشی را انجام دهد، یک رابط OnDrmConfigHelper تعریف کنید و با استفاده از setOnDrmConfigHelper() آن را به پخش کننده متصل کنید.
  2. prepare() .
  3. با getDrmInfo() تماس بگیرید. اگر منبع دارای محتوای DRM باشد، روش یک مقدار MediaPlayer.DrmInfo غیر تهی را برمی‌گرداند.

اگر MediaPlayer.DrmInfo وجود داشته باشد:

  1. نقشه UUID های موجود را بررسی کنید و یکی را انتخاب کنید.
  2. با فراخوانی prepareDrm() پیکربندی DRM را برای منبع فعلی آماده کنید.
    • اگر یک OnDrmConfigHelper ایجاد و ثبت کرده باشید، در حالی که prepareDrm() در حال اجرا است فراخوانی می شود. این به شما امکان می دهد تا قبل از باز کردن جلسه DRM، تنظیمات سفارشی خصوصیات DRM را انجام دهید. فراخوانی به طور همزمان در رشته ای که prepareDrm() نامیده می شود فراخوانی می شود. برای دسترسی به خصوصیات DRM، getDrmPropertyString() و setDrmPropertyString() را فراخوانی کنید. از انجام عملیات طولانی مدت خودداری کنید.
    • اگر دستگاه هنوز تدارک دیده نشده است، prepareDrm() نیز به سرور تأمین کننده دسترسی پیدا می کند تا دستگاه را تأمین کند. بسته به اتصال شبکه، ممکن است زمان متغیری طول بکشد.
  3. برای دریافت آرایه بایت درخواست کلید غیرشفاف برای ارسال به سرور مجوز، getKeyRequest() را فراخوانی کنید.
  4. برای اطلاع دادن به موتور 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 راه حل پیشنهادی برای پخش رسانه در برنامه شما است. در مورد آن بیشتر بخوانید .

این صفحات موضوعات مربوط به ضبط، ذخیره و پخش صدا و تصویر را پوشش می دهند: