android音視頻指南-媒體應用架構概述

翻譯自Media app architecture overviewhtml

本節將解釋如何將媒體播放器應用程序分離爲媒體控制器(用於UI)和媒體會話(用於實際播放器)。它描述了兩種媒體應用程序架構:一種客戶端/服務器設計,適用於音頻應用程序,另外一種是視頻播放器的單活動設計。它還展現瞭如何使媒體應用程序響應硬件控制並與使用音頻輸出流的其餘應用程序合做。android

播放器和用戶界面

播放音頻或視頻的多媒體應用程序一般有兩部分:api

  • 一種將數字媒體帶入並將其呈現爲視頻和/或音頻的播放器
  • 一個帶有傳輸控件的UI,能夠運行播放器並顯示播放器的狀態

image

在Android中,你能夠從頭開始構建本身的播放器,或者你能夠從如下選項中選擇:服務器

  • MediaPlayer類爲支持最多見的音頻/視頻格式和數據源的基本播放器提供了基本功能。
  • ExoPlayer是一個開源庫,能夠公開底層的Android音頻api。ExoPlayer支持諸如DASH和HLS流等在MediaPlayer中不可用的高性能特性。您能夠自定義ExoPlayer代碼,使添加新組件變得容易。ExoPlayer只能在Android 4.1及更高版本下使用。

媒體會話media session和媒體控制器media controller

雖然UI和播放器的api能夠是任意的,可是對於全部媒體播放器應用程序來講,這兩部分之間的交互本質上是相同的。Android框架定義了兩個類,一個媒體會話和一個媒體控制器,它們爲構建媒體播放器應用程序強加了定義良好的結構。session

媒體會話和媒體控制器使用與標準播放器動做(播放、暫停、中止等)對應的預約義回調進行通訊,以及可擴展的定製調用,您可使用這些調用定義應用程序特有的特殊行爲。架構

image

媒體會話media session

媒體會話負責與播放器的全部交流。它會將播放器的API隱藏到應用程序的其餘部分。播放器只能從控制它的媒體會話中調用。app

該會話維護播放器狀態(播放/暫停)和關於正在播放內容的信息的表示。會話能夠從一個或多個媒體控制器接收回調。這使得你的播放器可以被你的應用程序的UI以及運行Wear OS和Android Auto的配套設備所控制。框架

媒體控制器media controller

媒體控制器隔離你的UI。你的UI代碼只與媒體控制器通訊,而不是播放器自己。媒體控制器將傳輸控制操做轉換爲對媒體會話的回調。當會話狀態發生變化時,它還從媒體會話接收回調。這提供了一種自動更新關聯UI的機制。媒體控制器一次只能鏈接到一個媒體會話。ide

當您使用媒體控制器和媒體會話時,您能夠在運行時部署不一樣的接口和/或播放器。你能夠改變你的應用的外觀和/或性能獨立取決於設備運行的能力。post

視頻應用和音頻應用

當播放視頻時,你的眼睛和耳朵都在工做。播放音頻時,你是在聽,但你也能夠同時使用不一樣的應用程序。每一個用例都有不一樣的設計。

視頻應用

視頻應用程序須要一個窗口來查看內容。因爲這個緣由,視頻應用程序一般被實現爲一個單一的Android活動。視頻顯示的屏幕是活動的一部分。

image

音頻應用程序

音頻播放器並不老是須要其UI可見。一旦開始播放音頻,播放器就能夠做爲後臺任務運行。用戶能夠切換到另外一個應用程序,一邊聽一邊工做。

要在Android中實現這個設計,您可使用兩個組件構建一個音頻應用程序:一個用於UI的活動,一個用於播放器的服務。若是用戶切換到另外一個應用程序,服務能夠在後臺運行。經過將音頻應用程序的兩個部分分解成單獨的組件,每一個組件均可以更高效地獨立運行。與沒有UI的播放器相比,UI一般是很短暫的,由於播放器在沒有UI的狀況下可能會運行很長時間。

image

支持庫提供了兩個類來實現這種客戶機/服務器方法:MediaBrowserServiceMediaBrowser。服務組件做爲包含媒體會話及其播放器的MediaBrowserService的子類實現。帶有UI和媒體控制器的活動應該包括一個MediaBrowser,它與MediaBrowserService通訊。

使用MediaBrowserService可讓配套設備(如Android Auto和Wear)很容易地發現你的應用程序,鏈接到它,瀏覽內容和控制回放,而不須要訪問你的UI活動。

媒體應用和Android音頻基礎設施

一個設計良好的媒體應用程序應該和其餘播放音頻的應用程序「一塊兒玩得很好」。它應該準備好與使用音頻的設備上的其餘應用程序共享手機和合做。它還應該對設備上的硬件控件作出響應。

image
上述行爲查看 Controlling Audio Output.

media-compat庫

media-compat庫包含的類有助於構建播放音頻和視頻的應用程序。這些類與運行Android 2.3 (API level 9)及更高版本的設備兼容。他們還與其餘Android特性一塊兒工做,以建立一個溫馨的、熟悉的Android體驗。

媒體會話和媒體控制器的推薦實現是MediaSessionCompatMediaControllerCompat類,它們在media-compat支持庫中定義。它們替換了Android 5.0 (API級別21)中引入的類MediaSessionMediaController的早期版本。compat類提供了相同的功能,但使開發應用程序更容易,由於只須要編寫一個API。庫經過將媒體會話方法轉換爲舊平臺版本上的等效方法來處理向後兼容性。

若是您已經有了一個使用舊類的工做應用程序,咱們建議更新到compat類。使用compat版本時,能夠刪除對registerMediaButtonReceiver()RemoteControlClient的任何方法的全部調用。

測量性能

在Android 8.0 (API級別26)和更高版本中,有些媒體類可使用getMetrics()方法。它返回一個包含配置和性能信息的PersistableBundle對象,表示爲屬性和值的映射。getMetrics()方法用於這些媒體類:

爲每一個實例分別收集指標,併爲實例的生命週期持久保存。若是沒有可用的指標,該方法返回null。返回的實際指標取決於類。


下一篇:android音視頻指南-使用媒體會話media session

相關文章
相關標籤/搜索