侧载 VTT 在 chromecast 上显示重复的字幕字符串

Sideloaded VTT shows double duplicate captions strings on chromecast

在我的自定义投射接收器应用中,在我的 mediaManager.onEditTracksInfo 回调中,我 enable/disable 侧载字幕如下:

mediaManager.onEditTracksInfo = function (event) {
    if (!event.data || !event.data.activeTrackIds) {
            return;
    }

    // if sideloaded tracks are available, show/hide those
    if (sideloadedTracksAvailable) {
        updateSideloadedTracksVisibility(event);
    } else {
        updateEmbeddedTracksVisibility(event);
    }

    onEditTracksInfoOrig(event);
};

updateSideloadedTracksVisibility = function (data) {
    var mediaInformation = mediaManager.getMediaInformation() || {};

    // disable currently enabled sideloaded TTML or VTT, if any
    mediaPlayer.enableCaptions(false, cast.player.api.CaptionsType.TTML);
    mediaPlayer.enableCaptions(false, cast.player.api.CaptionsType.WEBVTT);

    enableActiveTracks(data.activeTrackIds, mediaInformation.tracks || []);
}

enableActiveTracks = function (activeTrackIds, tracks) {
   // loops over tracks and if requested to be enabled calls
   // mediaPlayer.enableCaptions(true, trackType, tracks[i].trackContentId);
}

下面是 <video> 元素在接收器应用 DOM 中的样子。一旦侧载轨道在 onLoad() 中加载到 mediaManager 中,轨道元素就会添加到 DOM,并且 src 设置为轨道数组中第一个轨道的 url。然后,每当我用轨道的 activeId 调用 editTracksInfo 时,一个新的轨道元素就会附加到 <video> eleement 并在我关闭字幕时被删除。

<video id="videoEl" src="blob:http%3A//blob-url-here" cast-captions-879553="true" crossorigin="anonymous">
    <track src="http://vtt/url/here/file.vtt" id="1" label="undefined" srclang="en-US" kind="subtitles"></track>
    <track src kind="captions">         <!-- this gets added upon enabling a track, and removed when disabling tracks -->
</video>

字幕工作正常,但我注意到每当我切换到旁加载的 VTT trackId 时,chromecast 都会显示两个内容相同的字幕流。这是一个已知问题还是我的代码做错了什么?它只发生在旁加载的 vtt 轨道上。侧载 TTML 和嵌入式 vtt 看起来不错。我检查了sideloaded vtt文件的内容,它没有重复的字幕字符串。

所以我终于弄明白了。显然,Media Player Library 会自行处理旁加载的 VTT 曲目。使用 MPL 时,在重写的 onEditTracksInfo 事件处理程序中,我们只需要处理 enabling/disabling 嵌入的 TTML/VTT 和旁加载的 TTML。侧载 VTT 由 MPL 在调用默认事件处理程序 (onEditTracksInfoOrig) 时自动处理。这也解释了为什么带有 vtt url 的 <track> 元素会自动附加到 <video> 元素。该元素由 MPL 创建。这导致显示双字幕,因为我和 MPL 都启用了 VTT 轨道。我更改了我的代码如下:

enableActiveTracks = function (activeTrackIds, tracks) {
   // loops over tracks and if enable TTML track if requested
   if (trackType === 'ttml') {
       mediaPlayer.enableCaptions(true, trackType, tracks[i].trackContentId);
   }
}

不幸的是,MPL documentation or custom receiver documentation 中没有记录。需要更新文档以使这些信息易于查找。