侧载 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 中没有记录。需要更新文档以使这些信息易于查找。
在我的自定义投射接收器应用中,在我的 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 中没有记录。需要更新文档以使这些信息易于查找。