使用全局按钮关闭多个视频的隐藏式字幕

Posted

技术标签:

【中文标题】使用全局按钮关闭多个视频的隐藏式字幕【英文标题】:Turn closed captions off for multiple videos with global button 【发布时间】:2018-06-03 20:28:04 【问题描述】:

我的页面包含多个带有不同标题的 html5 视频 (webvtt)。视频控件被隐藏。我有一个 ID 为 #check 的按钮«添加字幕»。如果用户选中此按钮,所有视频都应显示字幕,如果未选中,字幕应隐藏。到目前为止我所拥有的:

默认隐藏字幕:

var video = document.querySelector('.video');
var tracks = video.textTracks;
var track = tracks[0];

$(document).ready(function() 
  track.mode = 'hidden';
);

如果按钮被选中/取消选中,显示/隐藏标题:

$(function() 
  $('#check').click(function() 
    if($(this).is(':checked')) 
      track.mode = 'showing';
      else 
      track.mode = 'hidden';
    
  );
);

这非常有效,但仅适用于第一个视频(因为轨道 [0] 仅提供第一个轨道的值)。有什么办法可以解决这个问题,还是我走错了路?

【问题讨论】:

您应该使用 querySelectorAll 并循环播放所有视频。另外,如果您已经在使用 jQuery,为什么还要使用 querySelector? 谢谢!不幸的是,querySelectorAll 返回 TypeError “tracks is undefined”。 【参考方案1】:

你只需要迭代tracks,像这样:

$(function() 
  $('#check').click(function() 
    var isChecked = $(this).is(':checked');
    for (var index = 0; index < tracks.length; index++) 
        tracks[index].mode = (isChecked ? 'showing' : 'hidden');
    
  );
);

编辑

只有第一个受到影响的原因是您选择了第一个视频。将您的第一个代码更改为:

var video = document.querySelectorAll('.video'); //querySelector selects the first match only
var videoTrackSets = [];
for (var videoIndex = 0; videoIndex < video.length; videoIndex++) 
    videoTrackSets.push(video[videoIndex].textTracks);


$(document).ready(function() 
    for (var setIndex = 0; setIndex < videoTrackSets; setIndex++)
        for (var trackIndex = 0; trackIndex < videoTrackSets[setIndex].length; trackIndex++)
            videoTrackSets[setIndex][trackIndex].mode = 'hidden';
);

并将第二个代码更改为

$(function() 
  $('#check').click(function() 
    var isChecked = $(this).is(':checked');
    for (var setIndex = 0; setIndex < videoTrackSets.length; setIndex++)
        for (var trackIndex = 0; trackIndex < videoTrackSets[setIndex].length; trackIndex++)
            videoTrackSets[setIndex][trackIndex].mode = (isChecked ? 'showing' : 'hidden');
  );
);

【讨论】:

谢谢!它似乎仍然只适用于第一个视频。一个 console.log(tracks[index]);只返回第一个视频的轨道。 @L.Maher 我已经编辑了我的答案,如果现在更有帮助,请告诉我。 非常感谢。它似乎仍然不起作用。每当我选中该框时,控制台都会返回一个 TypeError“videoTrackSets[setIndex] 未定义”。我觉得问题已经出在第一个代码中的 videoTrackSets 上。当我做一个 console.log(videoTrackSets);它返回一个包含 9 个项目的数组(我有 9 个视频),但每个项目的值是未定义的。如果我做一个 console.log(video.textTrack);它返回“未定义”。这可能不应该是未定义的?很抱歉这些问题,我是 JS 新手,其中很多对我来说仍然是个谜。 @L.Maher 确实,在第一个代码中我错误地使用了 video.textTracks,但视频是一个数组,我应该使用 video[videoIndex]。我已经编辑了我的答案并解决了这个问题。请让我知道这是否解决了问题。我没有你的结构,所以我没有办法测试。为错误道歉:) 这很好用,非常感谢您的帮助!非常感谢!

以上是关于使用全局按钮关闭多个视频的隐藏式字幕的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML5 视频中切换隐藏式字幕并禁用默认视频控件

iOS 应用可以访问设备视频库中视频的字幕或隐藏式字幕吗?

通过 URL 强制使用 YouTube 隐藏式字幕

如何仅从视频文件中获取第一个隐藏式字幕?

通过 YouTube 数据 API [Python] 下载非自有视频的隐藏式字幕

无法抓取 YouTube 视频的隐藏式字幕