MediaTrack
敬上
代表媒體音軌,可以是音訊串流、影片串流或文字
例如字幕或隱藏式輔助字幕您的應用程式可以分組、調整樣式及啟動
媒體曲目
設定測試群組
您可以設定曲目,然後為其指派專屬 ID。以下程式碼 會建立英文文字軌、法文軌和法文音軌 每個物件都會有專屬的 ID
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build() val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build() val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build()
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build(); MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build(); MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build();
將播放軌分組
您可以將多個音軌組合成一個媒體項目,這個媒體項目會以
MediaInfo
。
MediaInfo
的執行個體
會擷取軌跡陣列,並匯總媒體項目的其他資訊。
以這個例子為基礎,應用程式可將這三個媒體音軌新增至媒體
方法是將這三個音軌的清單傳遞至
MediaInfo.Builder.setMediaTracks(List)
。
應用程式必須先以這種方式連結 MediaInfo
中的測試群組,才能載入
傳送到接收端
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>() tracks.add(englishSubtitle) tracks.add(frenchSubtitle) tracks.add(frenchAudio) val mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build()
List tracks = new ArrayList(); tracks.add(englishSubtitle); tracks.add(frenchSubtitle); tracks.add(frenchAudio); MediaInfo mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build();
移除測試群組
從目前媒體中移除所有音軌 (例如關閉三個曲目
即用字幕)
MediaInfo.Builder.setMediaTracks(List)
敬上
並傳遞空白的 ID 清單
更新測試群組
應用程式可以啟用一或多個與媒體相關聯的曲目
項目 (在媒體載入後),呼叫
RemoteMediaClient.setActiveMediaTracks(long[])
敬上
並傳送要啟用的曲目 ID。本範例會啟用
法文字幕和法文音訊:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3)) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.status.statusCode ) } })
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(new long[]{2, 3}) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.getStatus().getStatusCode()); } });
設定文字軌的樣式
TextTrackStyle
敬上
封裝文字軌的樣式資訊。建立或更新後
可以將現有的 TextTrackStyle 套用至目前播放的
呼叫媒體項目
RemoteMediaClient.setTextTrackStyle
、
輸入:
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setTextTrackStyle(style) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.status.statusCode ) } })
remoteMediaClient.setTextTrackStyle(style) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.getStatus().getStatusCode()); } });
您的應用程式應允許使用者更新文字軌的樣式,方法為使用 系統或應用程式本身提供的設定Android KitKat 之後,您就能使用系統通用的隱藏式輔助字幕設定 架構:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
若是 KitKat 之前的版本,以上呼叫將傳回 欄位未定義,因此您必須依照 各項預設值時您可以調整下列文字的樣式 追蹤樣式元素:
- 前景 (文字) 顏色和不透明度
- 背景色彩和透明度
- 邊緣類型
- 邊緣顏色
- 字型
- 字型系列
- 字型樣式
例如,將文字顏色設為紅色 (FF),透明度 50% (80),如下所示:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
在 KitKat 以上版本中,您必須註冊應用程式才能收到通知
更新系統通用的隱藏式輔助字幕設定時為了達成這個目標,您必須執行以下動作:
執行
CaptioningManager.CaptioningChangeListener
敬上
,並呼叫以下指令來註冊此事件監聽器:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
當應用程式收到字幕設定變更的回電時,
系統會擷取新設定並更新文字樣式
顯示目前播放媒體的說明文字
RemoteMediaClient.setTextTrackStyle
敬上
並傳遞新樣式
接收最新狀態
當多位寄件者連線至相同的接收器時,您必須 每個傳送端都知道接收端的變更,即使這些變更 通知來自其他寄件者。
因此,您的應用程式應註冊
RemoteMediaClient.Listener
敬上
和
RemoteMediaClient.ProgressListener
。
如果
TextTrackStyle
敬上
目前的媒體變更,之後所有已連線的傳送者都會收到通知
透過兩個已註冊的事件監聽器在這個例子中,接收端 SDK
不會驗證新樣式是否與先前的樣式不同
通知所有已連線的寄件者。不過,如果
有效的測試群組變更,但只有當中的 RemoteMediaClient.ProgressListener
已連線的寄件者會收到通知。
符合 CORS 規定
如要配合調整媒體串流,Google Cast 必須在符合下列條件的各位置使用 CORS 標頭,甚至是簡單的 mp4 媒體串流如果包含音軌,就需要 CORS。如要啟用「追蹤」功能 都必須為音軌串流和媒體啟用 CORS 串流。因此,如果沒有簡易 mp4 媒體適用的 CORS 標頭 然後新增簡單的字幕軌 除非您更新伺服器,加入適當的 CORS 標頭。此外,您至少必須允許下列標頭: Content-Type、Accept-Encoding 和 Range。請注意,最後兩個標頭是 先前可能不需要的額外標頭。