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 控制的。 在提供 activeTrackIds 以启用字幕时被添加/删除 - 侧载或嵌入,并在禁用字幕时被删除。 看看github.com/googlecast/Cast-Player-Sample;它是我们的参考接收器,不受您提到的问题的影响;它也处理轨道,所以也许查看那里的源代码可以给你一个提示,你正在做不同的事情。 【参考方案1】:

所以我终于想通了。显然,媒体播放器库自行处理侧载的 VTT 曲目。使用 MPL 时,在重写的 onEditTracksInfo 事件处理程序中,我们只需要处理启用/禁用嵌入式 TTML/VTT 和侧载 TTML。旁加载的 VTT 由 MPL 在调用默认事件处理程序 (onEditTracksInfoOrig) 时自动处理。这也解释了为什么带有 vtt url 的 &lt;track&gt; 元素会自动附加到 &lt;video&gt; 元素。这个元素是由 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 上显示重复的字幕字符串的主要内容,如果未能解决你的问题,请参考以下文章

Edge 无法解析 AMS v3 生成的 VTT 文件

Android VideoView没有在iplayer中添加VTT字幕

安腾 C++ ABI VTT 内容

关于vtt 与 srt 字幕 的相互转换

如何在视频字幕/字幕 (VTT) 中添加上标符号

vvt在线转换srt