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

MediaTrack đại diện cho một bản nhạc đa phương tiện, có thể là luồng âm thanh, video hoặc văn bản (chẳng hạn như phụ đề hoặc phụ đề chi tiết). Ứng dụng của bạn có thể nhóm, tạo kiểu và kích hoạt các bản nội dung nghe nhìn.

Định cấu hình kênh

Bạn có thể định cấu hình một kênh và gán mã nhận dạng duy nhất cho kênh đó. Mã sau đây tạo một đoạn văn bản tiếng Anh, một đoạn âm thanh tiếng Pháp và một đoạn âm thanh tiếng Pháp, mỗi đoạn 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();

Bản âm thanh theo nhóm

Bạn có thể nhóm nhiều kênh vào một mục nội dung nghe nhìn, được biểu thị bằng MediaInfo. Thực thể của MediaInfo lấy một mảng 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/video đó vào một mục nội dung đa phương tiện bằng cách truyền danh sách 3 bản nhạc đó 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 nội dung nghe nhìn cho trình 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ả các bản nhạc khỏi nội dung đa phương tiện hiện tại (chẳng hạn như tắt ba phụ đề trong ví dụ), hã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ó thể kích hoạt một hoặc nhiều bản nhạc liên kết với mục nội dung đa phương tiện (sau khi tải nội dung đa phương tiện), bằng cách gọi RemoteMediaClient.setActiveMediaTracks(long[]) và truyền mã nhận dạng của các bản nhạc để kích hoạt. Ví dụ này kích hoạt phụ đề tiếng Pháp và âm thanh 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 đoạn văn bản

TextTrackStyle đóng gói thông tin định kiểu của bản nhạc văn bản. Sau khi tạo hoặc cập nhật một TextTrackStyle hiện có, bạn có thể áp dụng kiểu đó cho mục nội dung đa phương tiện đang phát 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 các bản văn bản, bằng cách sử dụng 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 các chế độ cài đặt phụ đề trên toàn hệ thống do khung cung cấp:

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 là không xác định. Vì vậy, bạn cần điền các trường đó vào ứng dụng của mình dựa 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 các phần tử kiểu theo dõi văn bản sau:

  • Màu và độ mờ (văn bản) của nền trước
  • Màu nền và độ mờ nền
  • Loại viền
  • Màu viền
  • Tỷ lệ phông chữ
  • Họ phông chữ
  • Kiểu phông chữ

Ví dụ: đặt màu văn bản thành màu đỏ (FF) với độ mờ 50% (80) như sau:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

Trong KitKat trở lên, bạn nên đăng ký ứng dụng để nhận thông báo khi các 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 mình 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 lệnh gọi lại về việc chế độ cài đặt phụ đề đã thay đổi, bạn cần trích xuất các chế độ cài đặt mới và cập nhật kiểu của phụ đề văn bản cho nội dung đa phương tiện hiện đang phát bằng cách gọi RemoteMediaClient.setTextTrackStyle rồi chuyển vào kiểu 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 phải biết về những thay đổi trong trình nhận ngay cả khi những thay đổi đó là do những người gửi khác khởi tạo.

Để đạt được mục tiêu này, ứng dụng của bạn cần đăng ký RemoteMediaClient.ListenerRemoteMediaClient.ProgressListener.

Nếu TextTrackStyle của nội dung đa phương tiện hiện tại thay đổi, thì tất cả trình gửi đã kết nối sẽ được thông báo qua cả hai trình nghe đã đăng ký ở trên. Trong trường hợp này, SDK của trình thu 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à sẽ thông báo cho tất cả trình gửi được kết nối là bất kể kiểu đó. Tuy nhiên, nếu trạng thái của kênh đang hoạt động thay đổi, thì chỉ RemoteMediaClient.ProgressListener trong người gửi được kết nối mới được thông báo.

Đáp ứng các yêu cầu của CORS

Để phát trực tuyến nội dung nghe nhìn thích ứng, Google Cast yêu cầu phải có tiêu đề CORS, nhưng ngay cả các luồng nội dung nghe nhìn mp4 đơn giản cũng cần có CORS nếu bao gồm các Tuyến đường. Nếu muốn bật Kênh cho mọi nội dung nghe nhìn, bạn phải bật CORS cho cả luồng theo dõi và luồng nội dung nghe nhìn của mình. Vì vậy, nếu bạn không có sẵn tiêu đề CORS cho nội dung nghe nhìn mp4 đơn giản trên máy chủ, 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 đa phương tiện trừ khi bạn cập nhật máy chủ để bao gồm tiêu đề CORS thích hợp. 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 2 tiêu đề cuối cùng là các tiêu đề bổ sung mà trước đây bạn có thể không cần đến.