video - 有没有一种简单的方法可以将字幕放置在 HLML5 视频下方?
问题描述
我尝试寻找答案,但找不到可行的答案。
有没有一种简单的方法可以将字幕放置在 HLML5 视频帧下方?
换句话说,我不希望字幕/字幕出现在视频帧本身内。我希望它们出现在视频帧下方大约 1/2 英寸处。
目前字幕位于标准 .srt 文件中,但我可以将字幕调整为适用于此的方法。
我目前也在使用 HTML<video>
元素。
下图代表了我想要完成的事情。
Sam Dutton 的Example有一个视频示例,但他引用 Eric Bidelman 的代码是一个死链接。
在示例页面上,Sam Dutton 展示了代码片段,但我可以从中做出任何事情。
在示例页面上播放示例视频,看看我在说什么。
先感谢您。
解决方案
好吧,我看起来像是在回答我自己的问题。
由于在网上搜索可能的解决方案没有产生可行的结果,我回去花了几个小时在 Sam Dutton 页面上的视频示例上工作。
由此,我能够组合出一个简化的 HTML5 视频解决方案,该解决方案可以重新定位视频上方或下方的字幕,如上图所示。
下面是两个解决方案的完整 HTML 代码。
(1) 简化解决方案 - 运行良好的最小代码解决方案。
(2) 完整解决方案 - 产生与 Sam Dutton 页面上相同的结果。
解决方案包括.webm视频和.vtt字幕文件。MP4视频和.srt字幕也可以。
注意: HTML 代码必须驻留在 Web 服务器上才能正常运行。它在非服务器类型的本地计算机上无法正常运行。只需将代码保存在 HTML 文件 (.html) 中并将其上传到 Web 服务器。
以下是尝试在 Chrome 浏览器中本地打开 .html 文件时显示的调试安全通知:
*Unsafe attempt to load URL https://www....../subtitles.vtt from frame with
URL http://www........video.html. Domains, protocols and ports must match.*
如果您正在寻找类似的解决方案,我希望这会有所帮助。
山姆
(1) 简化解决方案 - 运行良好的最小代码解决方案。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<style type="text/css">
<!--
#video_container {max-width:400px; margin:auto; border:1px solid #404040;}
video {max-width:100%; outline:none;}
div#video {text-align:center;}
div#video video {margin:0;}
div#video > div {margin-top:5px; text-align:center; color:#404040; font-family:Arial, Helvetica, Verdana, sans-serif; font-size:1.0em;}
//-->
</style>
</head>
<body>
<div id="video_container">
<div id="video">
<video width="400px" controls>
<source src="video.webm" type='video/webm; codecs="vp8, vorbis"'>
<track label="English subtitles" kind="subtitles" srclang="en" src="subtitles.vtt" default>
</video>
<div>subtitle position</div>
</div>
</div>
<script type="text/javascript">
<!--
(function(){
var video = document.querySelector('div#video video');
var span1 = document.querySelector('div#video > div');
span1.innerHTML = '';
if (!video.textTracks) return;
var track = video.textTracks[0];
track.mode = 'hidden';
var idx = 0;
track.oncuechange = function(e) {
var cue = this.activeCues[0];
if (cue) {
if (idx >= 0) {
span1.classList.remove('on');
span1.innerHTML = '';
span1.appendChild(cue.getCueAsHTML());
span1.classList.add('on');
}
idx = ++idx % 2;
}
};
})();
//-->
</script>
</body>
</html>
(2) 完整解决方案 - 产生与 Sam Dutton 页面上相同的结果。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<style type="text/css">
<!--
video {max-width: 100%; outline: none;}
div#video video {margin: 0;}
div#video {text-align: center;}
div#video > div {
margin-top: 2em;
text-align: center;
-webkit-perspective: 800;
-webkit-transform-style: preserve-3d;
-moz-perspective: 800;
-moz-transform-style: preserve-3d;
-ms-perspective: 800;
-ms-transform-style: preserve-3d;
-o-perspective: 800;
-o-transform-style: preserve-3d;
}
div#video > div > div:last-child {position:relative; top:-36px;} /* position subtitle below video */
div#video > div > div {
color: black;
font-family: "Open Sans", sans-serif;
font-size: 18px;
height: 25px;
opacity: 1;
-webkit-transition: all 500ms ease-in-out;
-webkit-transform-origin: 50% 100%;
-webkit-transform: rotateX(-90deg);
-moz-transition: all 500ms ease-in-out;
-moz-transform-origin: 50% 100%;
-moz-transform: rotateX(-90deg);
-o-transition: all 500ms ease-in-out;
-o-transform-origin: 50% 100%;
-o-transform: rotateX(-90deg);
-ms-transition: all 500ms ease-in-out;
-ms-transform-origin: 50% 100%;
-ms-transform: rotateX(-90deg);
}
div#video > div > div.on {
opacity: 1;
-webkit-transform: rotateX(0);
-moz-transform: rotateX(0);
-o-transform: rotateX(0);
-ms-transform: rotateX(0);
}
.trackNotSupported {display: none;}
.trackNotSupported.show {display: block;}
.warningMessage {color: red;
}
//-->
</style>
</head>
<body>
<div id="video">
<video width="400px" controls>
<source src="video.webm" type='video/webm; codecs="vp8, vorbis"'>
<track label="English subtitles" kind="subtitles" srclang="en" src="subtitles.vtt" default>
</video>
<div><div>subtitle line 1</div><div>subtitle line 2</div></div>
</div>
<script type="text/javascript">
<!--
(function(){
var video = document.querySelector('div#video video');
var span1 = document.querySelector('div#video > div :first-child');
var span2 = document.querySelector('div#video > div :last-of-type');
if (!video.textTracks) return;
var track = video.textTracks[0];
track.mode = 'hidden';
var idx = 0;
track.oncuechange = function(e) {
var cue = this.activeCues[0];
if (cue) {
if (idx == 0) {
span2.className = '';
span1.classList.remove('on');
span1.innerHTML = '';
span1.appendChild(cue.getCueAsHTML());
span1.classList.add('on');
} else {
span1.className = '';
span2.classList.remove('on');
span2.innerHTML = '';
span2.appendChild(cue.getCueAsHTML());
span2.classList.add('on');
}
idx = ++idx % 2;
}
};
})();
//-->
</script>
</body>
</html>
推荐阅读
- flutter - 如何防止当前位置在地图上跳跃
- php - Laravel 网站:将托管升级为专用,现在表单和管理员将无法使用
- tfs - 无法创建映射,与它的父映射之一冲突
- php - ErrorException (E_ERROR) 未定义变量:组
- php - 为什么 php artisan 使用 empty up 方法创建迁移类?
- rust - 如何将 tokio::timer::Timeout 与 Future::wait 一起使用?
- c++ - 如何将 QML 文件分配给 MainWindow/Application
- java - 从一个给定的方法通过前缀获取常量
- c++ - 为什么 JsonCpp http 客户端在 201 响应代码上失败?
- ios - 在视图控制器中添加搜索栏后推送视图控制器时显示黑线