我们有一个 React Native Android 应用程序正在生产中,它本质上是流式传输电影。我们最近遇到的问题是,在投射到 Chromecast 设备时,字幕选择不起作用,因为它的子类型设置为UNKNOWN
.
当我们第一次发布应用程序时,我很有信心这确实有效。所以我猜想 CAF V3 接收器或 Shaka Player 框架的变化导致了这个问题。
这是我到目前为止发现的:
我发现 RemoteMediaClient 报告的MediaTrack # subtype和SUBTYPE_SUBTITLES之间不匹配。
Android MediaTrack 类期望子类型为SUBTITLES
. RemoteMediaClient 使用子类型SUBTITLE
(-s) 报告 MediaTrack。
这会导致 Android MediaTrack 类将子类型报告为SUBTYPE_UNKNOWN
.
来自 CAF 接收器的媒体轨道:
来自 Android 发件人的媒体轨道
zzft
是-1
为两个文本轨道设置的子类型属性。
更新
我创建了cast_receiver_framework.js文件的修改版本,并在创建文本轨道的处理程序中进行了小改动。它使用的textTrack#kind
是单数的 Shaka 属性。
对于复数版本,它只是大写,但没有验证/更正。我现在所做的更改将 映射到和的textTrack#kind
子类型。CAPTIONS
SUBTITLES
到目前为止,这种变化似乎奏效了。
_.h.Hd = function(a) {
st(this, a.tracksInfo);
a = pu(this.h.getVariantTracks());
var b = this.h.getTextTracks()
, c = [];
c = c.concat(a);
c = c.concat(b);
a = _.q(c);
for (b = a.next(); !b.done; b = a.next()) {
b = b.value;
var d = "variant" === b.type ? "AUDIO" : b.type.toUpperCase();
c = "variant" === b.type ? b.audioCodec ? b.audioCodec : void 0 : b.mimeType ? b.mimeType : void 0;
var e = b.kind ? b.kind.toUpperCase() : void 0
, f = "variant" === b.type ? b.audioRoles : b.roles;
null === f && (f = void 0);
var g = pt(this, {
type: d,
language: b.language,
trackContentType: c,
subtype: e === "SUBTITLE" ? "SUBTITLES" : e === "CAPTION" ? "CAPTIONS" : e,
roles: f
});
g ? d = g : (d = this.jd(d),
d.language = b.language,
d.trackContentType = c,
d.subtype = e === "SUBTITLE" ? "SUBTITLES" : e === "CAPTION" ? "CAPTIONS" : e,
d.roles = f,
qt(this, [d]));
"AUDIO" == d.type ? this.B.set(d.trackId, b.audioId) : this.B.set(d.trackId, b.id)
}
}