MediaTrack
thể hiện một bản nhạc nội dung đa phương tiện (có thể là luồng âm thanh, luồng video hoặc văn bản)
(chẳng hạn như phụ đề). Ứng dụng của bạn có thể nhóm, tạo kiểu và kích hoạt
bản nhạc đa phương tiện.
Định cấu hình kênh
Bạn có thể định cấu hình một kênh phát hành và gán mã nhận dạng duy nhất cho kênh đó. Mã sau đây tạo đoạn văn bản tiếng Anh, đoạn văn bản tiếng Pháp và đoạn âm thanh tiếng Pháp, mỗi chiến dịch đều có mã nhận dạng riêng:
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();
Nhóm kênh
Bạn có thể nhóm nhiều bản nhạc vào một mục nội dung đa phương tiện, được biểu thị bằng
MediaInfo
.
Một bản sao của MediaInfo
lấy một loạt các bản nhạc và tổng hợp các thông tin khác về mục nội dung đa phương tiện.
Dựa trên ví dụ này, ứng dụng của bạn có thể thêm 3 bản nhạc đa phương tiện đó vào một nội dung nghe nhìn
bằng cách chuyển danh sách ba kênh đó vào
MediaInfo.Builder.setMediaTracks(List)
.
Ứng dụng của bạn cần liên kết các kênh trong MediaInfo
theo cách này trước khi tải
phương tiện đến người nhận.
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();
Xóa kênh
Để xoá tất cả bản nhạc khỏi nội dung nghe nhìn hiện tại (chẳng hạn như tắt cả ba bản nhạc)
trong ví dụ này), gọi
MediaInfo.Builder.setMediaTracks(List)
và truyền một danh sách mã nhận dạng trống.
Cập nhật kênh
Ứng dụng của bạn có thể kích hoạt một hoặc nhiều kênh liên kết với nội dung nghe nhìn
mục (sau khi nội dung nghe nhìn được tải), bằng cách gọi
RemoteMediaClient.setActiveMediaTracks(long[])
và chuyển mã của các kênh cần kích hoạt. Ví dụ này kích hoạt
Âm thanh phụ đề tiếng Pháp và tiếng Pháp:
// 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()); } });
Tạo kiểu cho văn bản
TextTrackStyle
đóng gói thông tin định kiểu của đoạn văn bản. Sau khi tạo hoặc cập nhật
TextTrackStyle hiện có, bạn có thể áp dụng kiểu đó cho bản nhạc đang phát
mục nội dung đa phương tiện bằng cách gọi
RemoteMediaClient.setTextTrackStyle
!
như sau:
// 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()); } });
Ứng dụng của bạn phải cho phép người dùng cập nhật kiểu cho văn bản, bằng cách sử dụng các chế độ cài đặt do hệ thống hoặc chính ứng dụng cung cấp. Trong Android KitKat trở lên, bạn có thể sử dụng chế độ cài đặt phụ đề trên toàn hệ thống do khung:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
Đối với các phiên bản trước KitKat, lệnh gọi ở trên sẽ trả về một đối tượng có các trường không xác định, do đó bạn cần điền các trường đó trong ứng dụng của mình, dựa trên trên lựa chọn của người dùng và một số giá trị mặc định. Bạn có thể tạo kiểu cho văn bản sau các thành phần kiểu bản nhạc:
- Màu và độ mờ của nền trước (văn bản)
- Màu nền và độ mờ nền
- Loại viền
- Màu viền
- Thang phông chữ
- Họ phông chữ
- Kiểu phông chữ
Ví dụ: đặt màu văn bản thành đỏ (FF) với độ mờ 50% (80) như sau:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
Trên KitKat trở lên, bạn nên đăng ký ứng dụng để nhận thông báo
khi chế độ cài đặt phụ đề trên toàn hệ thống được cập nhật. Để đạt được mục tiêu này, bạn cần
triển khai
CaptioningManager.CaptioningChangeListener
trong ứng dụng của bạn và đăng ký trình nghe này bằng cách gọi:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
Khi ứng dụng của bạn nhận được cuộc gọi lại thông báo rằng chế độ cài đặt phụ đề đã thay đổi,
thì cần trích xuất các cài đặt mới và cập nhật kiểu văn bản
phụ đề cho nội dung nghe nhìn hiện đang phát bằng cách gọi
RemoteMediaClient.setTextTrackStyle
và đang trôi qua theo phong cách mới.
Nhận thông tin cập nhật về trạng thái
Khi nhiều người gửi được kết nối với cùng một trình nhận, điều quan trọng là mỗi người gửi cần lưu ý về những thay đổi ở bên nhận ngay cả khi những thay đổi đó do những người gửi khác tạo.
Để đạt được mục tiêu này, ứng dụng của bạn cần đăng ký
RemoteMediaClient.Listener
và một
RemoteMediaClient.ProgressListener
.
Nếu
TextTrackStyle
thay đổi hiện tại đối với nội dung nghe nhìn, thì tất cả người gửi đã kết nối sẽ nhận được thông báo
thông qua cả hai trình nghe đã đăng ký ở trên. Trong trường hợp này, SDK của bộ nhận
không xác minh liệu kiểu mới có khác với kiểu trước đó hay không và
thông báo cho tất cả người gửi được kết nối. Tuy nhiên, nếu trạng thái của
các thay đổi trên kênh đang hoạt động, chỉ có RemoteMediaClient.ProgressListener
trong
người gửi đã kết nối sẽ được thông báo.
Đáp ứng các yêu cầu của CORS
Để truyền trực tuyến nội dung nghe nhìn thích ứng, Google Cast yêu cầu sự hiện diện của tiêu đề CORS, nhưng ngay cả tệp mp4 đơn giản luồng nội dung đa phương tiện yêu cầu CORS nếu có chứa Bản nhạc. Nếu bạn muốn bật tính năng Bản nhạc đối với mọi nội dung đa phương tiện, bạn phải bật CORS cho cả luồng bản nhạc và nội dung nghe nhìn của mình phát trực tuyến. Vì vậy, nếu bạn không có tiêu đề CORS cho phương tiện mp4 đơn giản của mình trên máy chủ của bạn, sau đó thêm một bản phụ đề đơn giản, bạn sẽ không thể để phát trực tuyến nội dung nghe nhìn của bạn trừ phi bạn cập nhật máy chủ để bao gồm Tiêu đề CORS. Ngoài ra, bạn cần cho phép ít nhất các tiêu đề sau: Content-Type, Accept-Encoding và Range. Lưu ý rằng hai tiêu đề cuối cùng là tiêu đề bổ sung mà trước đây bạn có thể không cần đến.