HTML5字幕可以用css定位吗?

pvcm50d1  于 2023-02-01  发布在  HTML5
关注(0)|答案(5)|浏览(229)

我正在使用一个自定义HTML5应用程序在本地网络上传输视频,现在我正在添加字幕支持。
我有大约500个从. srt转换而来的.vtt字幕。在我把它们从.srt转换过来之后,我注意到它们显示在屏幕的底部,我希望它们有一点margin-bottom
我可以用css的伪元素::cue来设计字幕,但是只适用于字体大小,颜色,背景。似乎不支持任何边距,填充或定位规则。
在编写一个脚本来修改所有.vtt文件以将line:XX%添加到cues之前(这是我迄今为止找到的移动它们的唯一方法),我想知道是否有一种方法可以在不必修改所有.vtt文件的情况下定位字幕。

  • 如果我禁用了自定义控件,并尝试使用默认控件。当显示字幕时,我将鼠标放在视频上以显示控件,字幕确实会上移,当控件在几秒钟后自动隐藏时,那行字幕会停留在原来的位置。但下一行会下移。这就是我想知道是否可以在不编辑.vtt文件的情况下移动它们的原因。因为显示控件会使它们上移,所以也许有一种方法可以通过编程来实现。*

因此问题是,除了修改.vtt文件之外,还可以使用CSS或其他任何方法定位.vtt字幕吗?
这是我用于测试的基本代码:

<video controls autoplay>
    <source src="http://192.168.0.1/video.mp4" type="video/mp4" />
    <track src="http://192.168.0.1/subtitles.vtt" kind="subtitles" srclang="en" label="English" default />
</video>
<style>
    video::cue {
        font-size:100%;
        color:white;
    }
</style>
wkyowqbh

wkyowqbh1#

这不是css,但如果新的访问者想要一个解决方案与JS:

const track = document.getElementsByTagName('track')[0].track;

// Position the cue at the top
track.activeCues[0].line = 0;

// Position the cue at the bottom (default)
track.activeCues[0].line = -1;

// Move the cue up 3 lines to make room for video controls
track.activeCues[0].line = -4;
ijnw1ujt

ijnw1ujt2#

你可以使用textTrack.activeCues[0].text从单个cue中提取文本,并将它们显示在div中并设置div的位置。

ac1kyiln

ac1kyiln3#

您可以将line-height赋给::cue,但这样做的问题是,如果字幕进入多行,则行之间差距会增加。

yizd12fk

yizd12fk4#

我能想到的最好的解决方案(在React+Typescript中,原则应该在任何地方都适用。虽然有些笨拙,但确实有效)。主要思想是:
1.等待加载事件在track元素上激发
1.获取航迹的VTT线索
1.设置每个cue的行属性

trackRef = (node: HTMLTrackElement) => {
    if (node == null) return

    node.addEventListener('load', () => {
        if (node.track.cues == null) return
        Array.from(node.track.cues).forEach((c) => {
            (c as VTTCue).line = -4
        })
    })
}

//...

<video>
    <source
        src="..."
    />
    <track
        default
        src="..."
        ref={this.trackRef}
    />
</video>
xyhw6mcr

xyhw6mcr5#

您可以使用CSS样式自定义.vtt字幕的外观,CSS样式可以在嵌入HTML页面中定义 *,也可以直接嵌入.vtt文件中 *。
VTT规范有一些内置的对齐选项,如下所示(摘自https://www.delphiki.com/webvtt/#cue-settings):

WEBVTT FILE

1
01:23:45.678 --> 01:23:46.789 D:vertical
Hello world!

2
01:23:48.910 --> 01:23:49.101 S:50%
Hello
world!

以上所示的方法适用于您希望样式与其他帧不同的特定字幕帧。如果您需要样式应用于所有字幕,请参阅下面关于如何从包含的页面设置样式的内容。

在VTT文件中设置样式

WEBVTT

STYLE
::cue {
    background-color:rgba(0, 0, 0, 0.8);
    color: rgb(255, 200, 0);
    padding-bottom: 2em;
}
::cue(b) {
  color: red;
}
::cue(.myclass) {
    color: red;
}

1
00:00:00.000 --> 00:00:11.040
<b>bold</b>
<i>italic</i>
<u>underscored</u>
<c.myclass>Styled</c>

请️务必读取mozilla vtt docs,因为VTT中对空行有严格的规定。vtt validator有助于检测错误。

在HTML容器页面中设置样式

如果原生路线选项不够,则可以应用您自己的自定义样式。

/* in the HTML file embedding the video */
video::cue {
    background-color: rgba(0, 0, 0, 0.8);
    color: #ffc800;
    padding-bottom: 2em;
}

video::cue(b) {
    color: rgb(51, 216, 18);
}

video::cue(.myclass) {
    color: red;
}
另请参见

相关问题