Sử dụng các bản nhạc đa phương tiện

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:

Kotlin
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()
Java
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.

Kotlin
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()
Java
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:

Kotlin
// 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
                    )
                }
    })
Java
// 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:

Kotlin
// 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
                    )
                }
    })
Java
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:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
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:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
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:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
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.