Sideloaded VTT 在 chromecast 上显示重复的字幕字符串
Posted
技术标签:
【中文标题】Sideloaded VTT 在 chromecast 上显示重复的字幕字符串【英文标题】:Sideloaded VTT shows double duplicate captions strings on chromecast 【发布时间】:2015-10-13 08:52:20 【问题描述】:在我的自定义投射接收器应用中,在我的 mediaManager.onEditTracksInfo 回调中,我启用/禁用旁加载字幕如下:
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>
元素并在我关闭字幕时被删除。
<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 看起来不错。我检查了侧载的 vtt 文件的内容,它没有重复的字幕字符串。
【问题讨论】:
是你添加的第一个track元素吗? 不。两个轨道元素都是由接收器和 MPL 控制的。 看看github.com/googlecast/Cast-Player-Sample;它是我们的参考接收器,不受您提到的问题的影响;它也处理轨道,所以也许查看那里的源代码可以给你一个提示,你正在做不同的事情。 【参考方案1】:所以我终于想通了。显然,媒体播放器库自行处理侧载的 VTT 曲目。使用 MPL 时,在重写的 onEditTracksInfo 事件处理程序中,我们只需要处理启用/禁用嵌入式 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 或 custom receiver documentation 中没有记录这一点。需要更新文档以使这些信息易于查找。
【讨论】:
以上是关于Sideloaded VTT 在 chromecast 上显示重复的字幕字符串的主要内容,如果未能解决你的问题,请参考以下文章