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

DamonRen發表於2019-03-01

翻譯自Media app architecture overview

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

播放器和使用者介面

播放音訊或視訊的多媒體應用程式通常有兩部分:

  • 一種將數字媒體帶入並將其呈現為視訊和/或音訊的播放器
  • 一個帶有傳輸控制元件的UI,可以執行播放器並顯示播放器的狀態
image

在Android中,你可以從頭開始構建自己的播放器,或者你可以從以下選項中選擇:

  • MediaPlayer類為支援最常見的音訊/視訊格式和資料來源的基本播放器提供了基本功能。
  • ExoPlayer是一個開源庫,可以公開底層的Android音訊api。ExoPlayer支援諸如DASH和HLS流等在MediaPlayer中不可用的高效能特性。您可以自定義ExoPlayer程式碼,使新增新元件變得容易。ExoPlayer只能在Android 4.1及更高版本下使用。

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

雖然UI和播放器的api可以是任意的,但是對於所有媒體播放器應用程式來說,這兩部分之間的互動本質上是相同的。Android框架定義了兩個類,一個媒體會話和一個媒體控制器,它們為構建媒體播放器應用程式強加了定義良好的結構。

媒體會話和媒體控制器使用與標準播放器動作(播放、暫停、停止等)對應的預定義回撥進行通訊,以及可擴充套件的定製呼叫,您可以使用這些呼叫定義應用程式特有的特殊行為。

image

媒體會話media session

媒體會話負責與播放器的所有交流。它會將播放器的API隱藏到應用程式的其他部分。播放器只能從控制它的媒體會話中呼叫。

該會話維護播放器狀態(播放/暫停)和關於正在播放內容的資訊的表示。會話可以從一個或多個媒體控制器接收回撥。這使得你的播放器能夠被你的應用程式的UI以及執行Wear OS和Android Auto的配套裝置所控制。

媒體控制器media controller

媒體控制器隔離你的UI。你的UI程式碼只與媒體控制器通訊,而不是播放器本身。媒體控制器將傳輸控制操作轉換為對媒體會話的回撥。當會話狀態發生變化時,它還從媒體會話接收回撥。這提供了一種自動更新關聯UI的機制。媒體控制器一次只能連線到一個媒體會話。

當您使用媒體控制器和媒體會話時,您可以在執行時部署不同的介面和/或播放器。你可以改變你的應用的外觀和/或效能獨立取決於裝置執行的能力。

視訊應用和音訊應用

當播放視訊時,你的眼睛和耳朵都在工作。播放音訊時,你是在聽,但你也可以同時使用不同的應用程式。每個用例都有不同的設計。

視訊應用

視訊應用程式需要一個視窗來檢視內容。由於這個原因,視訊應用程式通常被實現為一個單一的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

相關文章