این بخش نحوه جدا کردن یک برنامه پخش کننده رسانه را به یک کنترلر رسانه (برای رابط کاربری) و یک جلسه رسانه (برای پخش کننده واقعی) توضیح می دهد. این دو معماری برنامه رسانه را توصیف میکند: طراحی سرویس گیرنده/سرور که برای برنامههای صوتی به خوبی کار میکند و طراحی تکفعالیتی برای پخشکنندههای ویدیو. همچنین نشان میدهد که چگونه میتوان برنامههای رسانه را به کنترلهای سختافزاری پاسخ داد و با برنامههای دیگری که از جریان خروجی صدا استفاده میکنند، همکاری کرد.
پلیر و رابط کاربری
یک برنامه چند رسانه ای که صدا یا تصویر را پخش می کند معمولاً دارای دو بخش است:
- پخشکنندهای که رسانههای دیجیتال را وارد میکند و آن را به صورت ویدئو و/یا صدا ارائه میکند
- یک رابط کاربری با کنترل های حمل و نقل برای اجرای پخش کننده و به صورت اختیاری نمایش وضعیت پخش کننده
در اندروید شما می توانید پخش کننده خود را از پایه بسازید یا می توانید از این گزینه ها انتخاب کنید:
- کلاس MediaPlayer عملکرد اولیه را برای پخش کننده بدون استخوان ارائه می دهد که از رایج ترین فرمت های صوتی/تصویری و منابع داده پشتیبانی می کند.
- ExoPlayer یک کتابخانه منبع باز است که بر روی اجزای چارچوب رسانه سطح پایین مانند
MediaCodec
وAudioTrack
ساخته شده است. ExoPlayer از ویژگی های با کارایی بالا مانند DASH پشتیبانی می کند که درMediaPlayer
موجود نیستند. میتوانید کد ExoPlayer را شخصیسازی کنید و اضافه کردن اجزای جدید را آسان میکند. ExoPlayer فقط با اندروید نسخه 4.1 و بالاتر قابل استفاده است.
جلسه رسانه و کنترلر رسانه
در حالی که API های رابط کاربری و پخش کننده می توانند دلخواه باشند، ماهیت تعامل بین این دو قطعه اساساً برای همه برنامه های پخش کننده رسانه یکسان است. فریم ورک اندروید دو کلاس را تعریف می کند، یک جلسه رسانه و یک کنترلر رسانه، که ساختاری کاملاً تعریف شده را برای ساخت برنامه پخش کننده رسانه اعمال می کند.
جلسه رسانه و کنترلکننده رسانه با استفاده از تماسهای از پیش تعریفشده که با اقدامات استاندارد پخشکننده (پخش، مکث، توقف و غیره) مطابقت دارد، و همچنین تماسهای سفارشی قابل توسعه که از آنها برای تعریف رفتارهای خاص منحصر به فرد برنامه خود استفاده میکنید، با یکدیگر ارتباط برقرار میکنند.
جلسه رسانه ای
یک جلسه رسانه مسئول تمام ارتباطات با پخش کننده است. API پخش کننده را از بقیه برنامه شما پنهان می کند. پخش کننده فقط از جلسه رسانه ای که آن را کنترل می کند فراخوانی می شود.
جلسه نمایشی از وضعیت بازیکن (در حال پخش/مکث) و اطلاعاتی در مورد آنچه در حال بازی است را حفظ می کند. یک جلسه میتواند از یک یا چند کنترلکننده رسانه تماسهای برگشتی دریافت کند. این امکان را برای پخشکننده شما فراهم میکند که توسط رابط کاربری برنامه شما و همچنین دستگاههای همراه دارای سیستم عامل Wear OS و Android Auto کنترل شود. منطقی که به تماس ها پاسخ می دهد باید سازگار باشد. بدون توجه به اینکه کدام برنامه کلاینت پاسخ تماس را آغاز کرده است، پاسخ به یک تماس MediaSession
باید یکسان باشد.
کنترلر رسانه
یک کنترلر رسانه رابط کاربری شما را ایزوله می کند. کد UI شما فقط با کنترلر رسانه ارتباط برقرار می کند، نه خود پخش کننده. کنترلر رسانه، اقدامات کنترل حمل و نقل را به تماس های مربوط به جلسه رسانه ترجمه می کند. همچنین هر زمان که وضعیت جلسه تغییر کند، از جلسه رسانه ای تماس دریافت می کند. این مکانیسمی را برای به روز رسانی خودکار رابط کاربری مرتبط فراهم می کند. یک کنترلر رسانه در هر بار فقط می تواند به یک جلسه رسانه متصل شود.
وقتی از یک کنترلر رسانه و یک جلسه رسانه استفاده می کنید، می توانید رابط ها و/یا پخش کننده های مختلفی را در زمان اجرا مستقر کنید. می توانید ظاهر و/یا عملکرد برنامه خود را به طور مستقل بسته به قابلیت های دستگاهی که در آن اجرا می شود تغییر دهید.
برنامه های ویدیویی در مقابل برنامه های صوتی
هنگام پخش یک ویدیو، چشم و گوش شما هر دو درگیر هستند. هنگام پخش صدا، شما در حال گوش دادن هستید، اما می توانید همزمان با برنامه دیگری نیز کار کنید. طراحی متفاوتی برای هر مورد استفاده وجود دارد.
برنامه ویدیویی
یک برنامه ویدیویی برای مشاهده محتوا به یک پنجره نیاز دارد. به همین دلیل یک برنامه ویدیویی معمولاً به عنوان یک فعالیت اندرویدی پیاده سازی می شود. صفحه ای که ویدیو در آن ظاهر می شود بخشی از فعالیت است.
اپلیکیشن صوتی
یک پخش کننده صوتی همیشه نیازی به نمایان بودن رابط کاربری آن ندارد. پس از شروع پخش صدا، پخش کننده می تواند به عنوان یک کار پس زمینه اجرا شود. کاربر می تواند به برنامه دیگری سوئیچ کند و در حالی که به گوش دادن ادامه می دهد کار کند.
برای پیاده سازی این طرح در اندروید، می توانید یک اپلیکیشن صوتی با استفاده از دو جزء بسازید: یک اکتیویتی برای رابط کاربری و یک سرویس برای پخش کننده. اگر کاربر به برنامه دیگری سوئیچ کند، سرویس می تواند در پس زمینه اجرا شود. با قرار دادن دو بخش یک برنامه صوتی در اجزای جداگانه، هر کدام می توانند به تنهایی کارآمدتر اجرا شوند. یک رابط کاربری معمولاً در مقایسه با پخش کننده کوتاه مدت است که ممکن است برای مدت طولانی بدون رابط کاربری اجرا شود.
کتابخانه پشتیبانی دو کلاس را برای اجرای این رویکرد سرویس گیرنده/سرور فراهم می کند: MediaBrowserService
و MediaBrowser
. مؤلفه سرویس به عنوان یک زیر کلاس از MediaBrowserService
شامل جلسه رسانه و پخش کننده آن پیاده سازی می شود. فعالیت با رابط کاربری و کنترلر رسانه باید شامل MediaBrowser
باشد که با MediaBrowserService
ارتباط برقرار می کند.
با استفاده از MediaBrowserService
، دستگاههای همراه (مانند Android Auto و Wear) میتوانند برنامه شما را پیدا کنند، به آن متصل شوند، محتوا را مرور کنند و پخش را کنترل کنند، بدون اینکه اصلاً به فعالیت رابط کاربری برنامه شما دسترسی داشته باشند. در واقع، میتوان چندین برنامه را به طور همزمان به یک MediaBrowserService
متصل کرد، هر برنامه دارای MediaController
خاص خود است. برنامه ای که MediaBrowserService
ارائه می دهد باید بتواند چندین اتصال همزمان را مدیریت کند.
برنامه های رسانه ای و زیرساخت صوتی اندروید
یک برنامه رسانه ای که به خوبی طراحی شده است باید با سایر برنامه هایی که صدا پخش می کنند "به خوبی بازی کند". باید آماده باشد تا تلفن را به اشتراک بگذارد و با سایر برنامه های دستگاه شما که از صدا استفاده می کنند همکاری کند. همچنین باید به کنترل های سخت افزاری روی دستگاه پاسخ دهد.
همه این رفتارها در کنترل خروجی صوتی توضیح داده شده است.
کتابخانه سازگار با رسانه
کتابخانه Media-Compat شامل کلاسهایی است که برای ساختن برنامههایی که صدا و تصویر را پخش میکنند مفید هستند. این کلاس ها با دستگاه های دارای اندروید 2.3 (سطح API 9) و بالاتر سازگار هستند. آنها همچنین با سایر ویژگی های اندروید کار می کنند تا یک تجربه راحت و آشنا در اندروید ایجاد کنند.
اجرای توصیهشده جلسات رسانه و کنترلکنندههای رسانه، کلاسهای MediaSessionCompat
و MediaControllerCompat
هستند که در کتابخانه پشتیبانی media-compat تعریف شدهاند. آنها جایگزین نسخه های قبلی کلاس های MediaSession
و MediaController
می شوند که در Android 5.0 (سطح API 21) معرفی شده بودند. کلاسهای compat عملکرد یکسانی را ارائه میدهند، اما توسعه برنامه شما را آسانتر میکنند، زیرا فقط باید در یک API بنویسید. کتابخانه با ترجمه روشهای جلسه رسانه به روشهای معادل در نسخههای پلتفرم قدیمیتر در صورت موجود بودن، از سازگاری به عقب مراقبت میکند.
اگر قبلاً یک برنامه کاربردی دارید که از کلاسهای قدیمیتر استفاده میکند، توصیه میکنیم به کلاسهای compat بهروزرسانی کنید. هنگامی که از نسخه های سازگار استفاده می کنید، می توانید تمام تماس های registerMediaButtonReceiver()
و هر روشی را از RemoteControlClient
حذف کنید.
اندازه گیری عملکرد
در اندروید 8.0 (سطح API 26) و جدیدتر، متد getMetrics()
برای برخی از کلاسهای رسانه موجود است. یک شی PersistableBundle
حاوی اطلاعات پیکربندی و عملکرد، که به صورت نقشه ای از ویژگی ها و مقادیر بیان می شود، برمی گرداند. متد getMetrics()
برای این کلاس های رسانه تعریف شده است:
-
MediaPlayer.getMetrics()
-
MediaRecorder.getMetrics()
-
MediaCodec.getMetrics()
-
MediaExtractor.getMetrics()
معیارها برای هر نمونه به طور جداگانه جمعآوری میشوند و در طول عمر نمونه باقی میمانند. اگر هیچ معیاری در دسترس نباشد، روش صفر را برمیگرداند. معیارهای واقعی بازگشتی به کلاس بستگی دارد.