安卓原生 SDK 的投射插件

在本主題中,您將學習如何使用適用於 Android 專用布萊特灣原生 SDK 的 Cast 外掛程式,將影片投放到連接 Chromecast 的電視上。

概覽

透過 Google Cast 技術,您可以從行動裝置啟動並控制高畫質電視和家庭音訊系統的串流影片內容。在您的應用中,點擊“投射”按鈕以在大屏幕上流式傳輸您的內容。

若要建置 Cast 應用程式,您需要下列元件:

  • 一種發件人申請 -它駐留在您的移動設備上,並檢測接收器設備,建立安全連接並鏡像您的內容。發送者應用是本地播放器,用於將內容投射到您的Chromecast設備上的接收者應用中。投射到接收器應用程序後,您可以將其視為 Chromecast 的遙控器。

    發件人應用由Cast插件提供,適用於Android的Brightcove本機SDK。您將在本主題中了解它。

  • 一種接收者申請 -此應用程序在Chromecast設備上運行。可以將其視為具有CSS和JavaScript資產的單頁HTML應用程序。

    如需測試,請依照下列步驟執行:

    1. 谷歌的樣品鑄接收器開始
    2. 評論Google Cast應用文件資料

    對於生產用途,本文檔將說明如何使用Brightcove Receiver v2.0.0。

支援的 SDK 版本

要將Cast插件與新的Brightcove Receiver v2.0一起使用,必須使用Brightcove Native SDK for Android 6.16.0及更高版本。

了解Cast插件

投射插件是建立在新的 Exoplayer 投射擴展和谷歌播放服務投射框架之上。添加轉換插件依賴關係後,gradle 將拉播放服務轉換框架依賴項,Exoplayer 轉換擴展依賴關係以及其他需要的依賴關係。

重新設計了Cast插件,以最大程度地減少與Video Cloud集成時的工作量。使用Video Cloud時,BrightcoveCastMediaManager類從“視頻雲”響應(例如Brightcove)收集信息VideoSource對象,每次EventType.SET_SOURCE事件被發出。當使用者選取播放以將視訊排入佇列時,即可快取並準備好使用此資訊。

集成Cast插件

您可以通過兩種方式將您的應用與Native SDK for Android Cast插件集成在一起。您可以與Brightcove Cast Receiver v2.0或Google Cast Demo Receiver集成。

對於任何一種集成,您都需要將此依賴項添加到您的應用程序項目中:

implementation "com.brightcove.player:android-cast-plugin:6.16.0"

使用Brightcove Cast接收器v2.0

該集成適用於使用Brightcove API交付其內容的Brightcove客戶。

有關完整的代碼示例,請參見BasicCastBrightcoveReceiverSampleApp

使用Google Cast演示接收器

此集成旨在供那些剛開始鑄造的Brightcove客戶使用。

有關完整的代碼示例,請參見BasicCastGoogleReceiverSampleApp

指定自己的Cast Receiver App ID

BasicCastGoogleReceiverSampleApp設置一個Google Demo Receiver App ID,該ID有助於入門和測試,但不適用於生產。

要在您的Cast Receiver Application中覆蓋此值,請在示例應用的strings.xml文件:

<string name="cast_receiver_app_id">4F8B3483</string>

布萊特灣谷歌曲組件

GoogleCastComponent class是Brightcove Cast插件的主要類。它實例化的 Exoplayer 卡斯播放器並設置它的聽眾。它公開了一些重要的方法來加載視頻或將其添加到隊列。此GoogleCastComponent類別也會新增數個 Brightcove 事件偵聽程式來處理活動和片段生命週期事件,以及其他事件偵聽程式,您可以用來發出媒體資訊,將視訊載入 Chromecast 裝置。

GoogleCastComponent現在使用構建器模式。在v6.16.0之前的Android本機SDK版本中,您需要實例化該組件並傳遞ContextEventEmitterGoogleCastComponent構造函數。然後,您將在一系列單獨的方法調用中設置組件的選項。

從適用於Android的Native SDK v6.16.0開始,使用Builder模式創建GoogleCastComponent並設置其選項,所有這些都在一個Builder方法調用鏈中。

自訂資料

GoogleCastComponentCustomData類使用Builder模式來實例化對象並向其添加屬性。雖然Brightcove接收器可以使用CustomData從Brightcove目錄中檢索視頻,不需要發送完整的視頻CustomData對象,例如用於投射遠程資產。還需要注意的是,在使用Google Demo Receiver時,CustomData不支持。為了便於討論,我們將重點關注CustomData發送到用於從Brightcove目錄中檢索視頻數據的接收器。

什麼是CustomData?

CustomData是JSON對象,包含在MediaInfo目的。它的預期用途是與Brightcove Cast Receiver App v2.0一起使用。

帶Brightcove接收器的CustomData和目錄數據

與Brightcove接收器集成時,CustomData JSON對象將採用以下形式:

"customData": {
	"accountId": "1234567890",
	"analyticsParams": {
		"application": "com.brightcove.player.test",
		"user": "abcde1c44b951234"
	},
	"catalogParams": {
		"adConfigId": null,
		"type": "video",
		"bcovAuthToken": null,
		"id": "2345678901",
		"policyKey": "BCpkPolicyKeyObject"
	}
}

CustomData上面的對象示例包含從Brightcove Receiver投射視頻所需的所有數據元素。無論加密如何,此數據都是相同的,也就是說,在DRM視頻的情況下,許可證URL不需要其他結構。

您還可以找到一個示例CustomData中的對象BrightcoveCastBrightcoveReceiverSampleApp

Google演示接收器提供的CustomData

如上所述,CustomData演示接收器不支持。

BrightcoveCastMediaManager

可以擴展BrightcoveCastMediaManager,如上所示,以覆蓋其方法或實現您自己的方法。有關擴展BrightcoveCastMediaManager類的示例,請參見以下內容:

  • 擴展BrightcoveCastMediaManager部分
  • BasicCastCustomRemoteVideoSampleApp

選項提供者

接下來,你需要指定的選項提供者實現谷歌演員框架。該OptionsProvider接口有助於設置初始化 CastContext 類所需的幾個選項。這是您將設置投射接收器應用程序 ID 的地方。要了解有關整合OptionsProvider,請參閱Google的初始化演員表上下文文件。

Brightcove Cast插件包括一個DefaultOptionsProvider類,其中Cast接收器應用程序ID是通過在strings.xml資源文件。有關更多詳細信息,以及要了解如何在您的應用中覆蓋它,請參見使用您自己的演員表接收器應用程序ID以上部分。

無論您使用DefaultOptionsProvider類或你自己的OptionsProvider實施,你需要設置OptionsProvider應用程序中的實現類名稱AndroidManifest.xml文件作為鍵值對元數據,如下所示:

<meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="com.brightcove.cast.DefaultOptionsProvider" />

如果您使用DefaultOptionsProvider類,您可以設置ExpandedControllerActivity通過在您的帳戶中設置類似的元數據信息來打開/關閉投射通知Android清單

擴充的控制器活動

擴展控制器活動隨附於谷歌投射庫,並允許您控制要投射在您的 Chromecast 設備上的視頻。這個類別提供了一些自訂的靈活性。例如,有五個插槽可供顯示按鈕,其中第三個插槽會保留給無法設定的「播放」按鈕使用。其餘的按鈕可以設定為其他預先定義的按鈕,也可以設定為您自己的自訂按鈕。

布萊特灣演員插件提供了子類DefaultExpandedControllerActivity。我們已按照以下順序啟用以下按鈕:

  • 隱藏式字幕
  • 略過上一個
  • 播放
  • 略過下一個
  • 靜音切換

此外,Seek Bar 設定與標準中使用的預設可繪製項目相同BrightcoveMediaController

  • 可繪製的進度:
    R.drawable.default_scrubber_progress_horizontal
  • 拇指可繪製:
    R.drawable.default_scrubber_thumb

若要了解如何自訂搜尋列,請參閱搜尋條碼範例應用程式

若要設定DefaultExpandedControllerActivity或您自己的ExpandedControllerActivity,請在 AndroidManifest.xml 檔案中設定下列中繼資料:

<meta-data  android:name="com.brightcove.cast.DefaultOptionsProvider.EXPANDED_CONTROLLER_ACTIVITY_CLASS_NAME"
android:value="com.brightcove.cast.DefaultExpandedControllerActivity" />

鑄造通知

啟用 Cast 通知時,當您投放影片並將應用程式置於背景時,就會出現通知;例如,在按下 Home 鍵之後。

<p要啟用投射通知,請在您的AndroidManifest.xml文件,並提供單擊通知時要啟動的活動的名稱:

<meta-data android:name="com.brightcove.cast.DefaultOptionsProvider.NOTIFICATION_TARGET_ACTIVITY_CLASS_NAME"
android:value="com.brightcove.cast.BrightcoveControllerActivity" />

如果您沒有提供指定值,或者如果該值具有無效的活動名稱,則會關閉「轉換通知」。

「投射」按鈕

Cast 按鈕可讓您選擇與裝置相同網路中的 Chromecast 裝置,並可讓您連線並建立工作階段。要將“投射按鈕”添加到您的應用程序,請遵循Google的整合Cast:添加投射按鈕文件。

Brightcove 鑄造插件提供了一個實用程序方法來輕鬆設置投射按鈕。當您只想將 Cast 按鈕添加到活動/片段菜單時,這非常有用。有關詳細信息,請參閱下面的代碼:

//Activity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   super.onCreateOptionsMenu(menu);
   GoogleCastComponent.setUpMediaRouteButton(MainActivity.this, menu);
   return true;
}

迷你控制器

迷你控制器是一個附加到您的活動的片段,通常位於佈局的底部。迷你控制器可讓您播放和暫停視訊,並指出在 Chromecast 裝置中播放視訊的時間。按一下迷你控制器時,擴充控制器將會啟動。

要啟用迷你控制器,請將以下代碼添加到您的活動的佈局中。

<fragment
   android:id="@+id/castMiniController"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentBottom="true"
   android:visibility="gone"
   class="com.google.android.gms.cast.framework.media.widget.MiniControllerFragment" />

若要了解迷你控制器的最佳實務,請參閱設計檢查清單:寄件人迷你控制器文件。如需實作詳細資訊,請參閱整合轉換:新增迷你控制器文件。

進階主題

聆聽演員工作階段

如果您希望您的應用程序在 Cast 連接開始或結束時作出反應,則可以添加GoogleCastEventType.CAST_SESSION_STARTEDGoogleCastEventType.CAST_SESSION_ENDED事件偵聽器,如下所示:

eventEmitter.on(GoogleCastEventType.CAST_SESSION_STARTED, new EventListener() {
   @Override
   public void processEvent(Event event) {
       // Session Started
   }
});
eventEmitter.on(GoogleCastEventType.CAST_SESSION_ENDED, new EventListener() {
   @Override
   public void processEvent(Event event) {
       // Session Ended
   }
});

或者,您可以打電話GoogleCastComponent.isSessionAvailable()來檢查可用的會話。

投射視訊

為了在成功連接後將視頻投射到 Chromecast,您可以使用 EventeMitter 並發出媒體信息信息信息,也可以直接使用這些GoogleCastComponent方法。

如果您想要發出媒體資訊,您可以使用下列事件:

  • GoogleCastEventType.LOAD_MEDIA_INFO
  • GoogleCastEventType.LOAD_MEDIA_QUEUE_ITEM
  • GoogleCastEventType.ADD_MEDIA_INFO
  • GoogleCastEventType.ADD_MEDIA_QUEUE_ITEM

下表顯示每個事件的預期屬性:

事件名稱 性質
金鑰 值類別類別類型
LOAD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo整數
LOAD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem
ADD_MEDIA_INFO GoogleCastComponent.CAST_MEDIA_INFO
GoogleCastComponent.CAST_MEDIA_PLAY_POSITION
MediaInfo整數
ADD_MEDIA_QUEUE_ITEM GoogleCastComponent.CAST_MEDIA_QUEUE_ITEM MediaQueueItem

或者,您可以使用以下內容GoogleCastComponent方法:

  • public void loadMediaInfo(MediaInfo mediaInfo, long positionMs)
  • public void loadMediaInfo(MediaInfo mediaInfo)
  • public PendingResult<RemoteMediaClient.MediaChannelResult> loadItem(MediaQueueItem mediaQueue, int playheadPosition)
  • public PendingResult<RemoteMediaClient.MediaChannelResult> addItems(MediaQueueItem... mediaQueue )

變更預設的媒體資訊資料

根據預設,Cast 外掛程式會收集有關由EventType.SET_SOURCE event .如果您想更改或添加其他信息,例如將自定義 JSON 對象添加MediaInfo到您的應用程序接收器理解,則可以通過覆蓋loadMediaInfo()addMediaInfo()方法從BrightcoveCastMediaManager .然後,您的BrightcoveCastMediaManager子類作為構造函數參數傳遞給GoogleCastComponent類。

在這些方法中,你可以創建你的MediaInfo對象,並發出相應的事件,如前所示。請務必檢查com.brightcove.cast.util.CastMediaUtil,因為它提供了一些實用程序方法來創建MediaInfo從 Video 和 Source 對象。

配置施放媒體管制器

若要在 Cast 工作階段開始時變更 Brightcove 影片檢視中顯示的控制器配置,請依照下列步驟執行。

  1. 擴展亮度對流媒體
  2. 設定媒體管理程式設定
  3. 覆寫控制列設定

擴展亮度對流媒體

要更改的默認行為BrightcoveCastMediaManager,請創建一個子類並覆蓋一些關鍵方法:

  • public void updateBrightcoveMediaController(boolean isRemote)

    此方法由會話更改GoogleCastComponent時調用; 也就是說,當會話已經開始或已經結束。當會話啟動時,該isRemote參數將是,true並調用該setupRemoteController方法。否則,isRemote將是falseresetToLocalController被調用。

  • protected void setupRemoteController()

    這種方法發出EventType.SET_MEDIA_CONTROLLER_CONFIGMediaControllerConfig對象的事件。我們將在本節MediaControllerConfig稍後討論更多關於。此方法也會偵聽BrightcoveMediaController.CONTROL_BAR_CREATED事件,並透過呼叫setupBrightcoveControlBar方法進行反應。

  • protected void resetToLocalController()

    這種方法負責通過發射重置BrightcoveMediaController到原始的控制器佈局EventType.RESTORE_DEFAULT_MEDIA_CONTROLLER

  • protected void setupBrightcoveControlBar(BrightcoveControlBar controlBar)

    BrightcoveMediaController旦使用中提供的佈局重新創建MediaControllerConfig,您將可以訪問該BrightcoveControlBar視圖。從這裡,您可以訪問您的 UI 視圖,如按鈕,您可以在其中添加到OnClickListener它們。

設定媒體管理程式設定

MediaControllerConfig是一個配置類,你可以用來改變BrightcoveMediaController類的默認控件佈局。在這個類中,你可以設置佈局和OnTouchListener .一旦創建和配置,你可以發出這個對象,如下圖所示:

Map<String, Object> properties = new HashMap<>();
properties.put(Event.MEDIA_CONTROLLER_CONFIG, myMediaControllerConfig);
eventEmitter.emit(EventType.SET_MEDIA_CONTROLLER_CONFIG,properties);

默認值MediaControllerConfig對象設置R.layout.cast_media_controller作為單一的佈局按鈕。點擊時,它會打開一個對話框,有兩個選項:

  • 立即播放 -選取此loadMediaInfo()方法時,會呼叫該方法,視訊將會在 Chromecast 中載入和播放。
  • 新增至佇列 -選取此addMediaInfo()方法時,會呼叫該方法,並將視訊新增至佇列的結尾。

覆寫控制列設定

當您的媒體控制器佈局通過發射設置時MediaControllerConfigBrightcoveControlBar視圖將被創建,該BrightcoveCastMediaManager.setupBrightcoveControlBar()方法將被調用。在這裡,您可以通過 Id 獲取 UI 組件並添加適當的偵聽器。

@Override
protected void setupBrightcoveControlBar(BrightcoveControlBar controlBar) {
   Button playButton = controlBar.findViewById(R.id.cast_play);
   if (playButton != null) {
       playButton.setOnClickListener(new View.OnClickListener() {...});
   }
}

已知問題

安卓 9

在Android 9及更高版本上使用Chromecast時,您需要添加一個FOREGROUND_SERVICE允許。這允許應用程序使用通知來控制應用程序背景並返回到前台時的轉換會話。

uses-permission標記應加入至應用程式的 AndroidManifest.xml 檔案,如下所示:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

谷歌播放服務

如果寄件者的 Google Play 服務版本不是最新版本,則可能無法建立投射連線。當發件人的 Google Play 服務(特別是 Cast 服務框架)過時,您可能無法成功創建 Cast 連接。此問題可透過 Google Play 商店更新寄件者的 Google 播放服務來解決此問題。