使用媒体轨道

MediaTrack 表示媒体轨道,可以是音频流、视频流或 (例如字幕)。您的应用可以分组、设置样式和激活 媒体轨道。

配置轨道

您可以配置轨道并为其分配唯一 ID。以下代码 会创建一个英语文本轨道、一个法语文本轨道和一个法语音轨, 每个都有自己的 ID:

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();

将轨道分组

您可以将多个轨道归入一个媒体项,媒体项由 MediaInfoMediaInfo 的实例 用于获取一个轨道数组,并汇总关于媒体项的其他信息。 在此示例的基础上,您的应用可以将这三个媒体轨道添加到 将这三个轨道的列表传递到 MediaInfo.Builder.setMediaTracks(List)。 您的应用需要以这种方式在 MediaInfo 中关联轨道,然后才能加载 将媒体传送给接收方

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();

移除轨道

要删除当前媒体中的所有曲目(例如关闭 字幕),调用 MediaInfo.Builder.setMediaTracks(List) 并传递一个空的 ID 列表

更新轨道

您的应用可以激活与相应媒体关联的一个或多个轨道 (媒体加载后),通过调用 RemoteMediaClient.setActiveMediaTracks(long[]) 并传递要激活的轨道的 ID。此示例启用 法语字幕和法语音频:

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());
        }
    });

设置文字轨道的样式

TextTrackStyle 用于封装文本轨道的样式信息。创建或更新后 一个现有的 TextTrackStyle,您就可以将该样式应用到当前播放的 调用 RemoteMediaClient.setTextTrackStyle、 如下所示:

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());
        }
    });

您的应用应允许用户使用 系统或应用本身提供的设置。在 Android KitKat 中 之后,您可以使用 框架:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

对于 KitKat 之前的版本,上述调用将返回对象 字段未定义,因此您需要在应用中填充这些字段 以及一些默认值您可以设置以下文本的样式 跟踪样式元素:

  • 前景(文本)颜色和不透明度
  • 背景颜色和不透明度
  • 边缘类型
  • 边缘颜色
  • 字体比例
  • 字体系列
  • 字体样式

例如,将文本颜色设置为红色 (FF),不透明度为 50% (80),如下所示:

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

在 KitKat 及更高版本中,您应该注册自己的应用以接收通知 系统级字幕设置更新时触发。为此,您需要 实施 CaptioningManager.CaptioningChangeListener 并通过调用以下代码注册此监听器:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

当应用收到字幕设置已更改的回调时, 然后需要提取新设置并更新文本样式, 通过调用 RemoteMediaClient.setTextTrackStyle 并传入新的样式。

接收状态更新

当多个发送者连接到同一个接收者时,务必要注意 让每个发送者都知道接收者中发生的更改, 是来自其他发件人的。

为此,您的应用应注册 RemoteMediaClient.ListenerRemoteMediaClient.ProgressListener

如果 TextTrackStyle 当前的媒体更改,则所有已连接的发送者都会收到通知 通过上述两个已注册的监听器传递在这种情况下,接收器 SDK 不会验证新样式是否与先前样式不同, 会通知所有已连接的发件人。不过,如果状态 有效轨道更改,只有 RemoteMediaClient.ProgressListener 已连接的发送者将会收到通知。

满足 CORS 要求

对于自适应媒体流式传输,Google Cast 要求 CORS 标头,甚至是简单的 mp4 文件 如果媒体流包含曲目,则需要使用 CORS。如果您要启用“轨道” 您需要为跟踪数据流和媒体启用 CORS 。因此,如果您没有适用于简单 mp4 媒体的 CORS 标头 然后又添加了一个简单的翻译字幕轨道,则无法 流式传输您的媒体,除非您更新服务器以加入 CORS 标头。此外,您至少需要允许使用以下标头: Content-Type、Accept-Encoding 和 Range。请注意,最后两个标头 之前可能不需要的其他标头。