0

我们有一个 React Native Android 应用程序正在生产中,它本质上是流式传输电影。我们最近遇到的问题是,在投射到 Chromecast 设备时,字幕选择不起作用,因为它的子类型设置为UNKNOWN.

当我们第一次发布应用程序时,我很有信心这确实有效。所以我猜想 CAF V3 接收器或 Shaka Player 框架的变化导致了这个问题。

这是我到目前为止发现的:

我发现 RemoteMediaClient 报告的MediaTrack # subtypeSUBTYPE_SUBTITLES之间不匹配。

Android MediaTrack 类期望子类型为SUBTITLES. RemoteMediaClient 使用子类型SUBTITLE(-s) 报告 MediaTrack。

这会导致 Android MediaTrack 类将子类型报告为SUBTYPE_UNKNOWN.

来自 CAF 接收器的媒体轨道:

CAF 媒体轨道

来自 Android 发件人的媒体轨道

RemoteMediaClient 媒体轨道

zzft-1为两个文本轨道设置的子类型属性。

更新

我创建了cast_receiver_framework.js文件的修改版本,并在创建文本轨道的处理程序中进行了小改动。它使用的textTrack#kind是单数的 Shaka 属性。

对于复数版本,它只是大写,但没有验证/更正。我现在所做的更改将 映射到和的textTrack#kind子类型。CAPTIONSSUBTITLES

到目前为止,这种变化似乎奏效了。

    _.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)
        }
    }
4

0 回答 0