在 mp4 中嵌入文本字幕以供桌面使用和网络使用?

在 mp4 中嵌入文本字幕以供桌面使用和网络使用?

自从我发现我可以在 Ubuntu 18.04 中的 Firefox 中播放 .MP4 视频(例如我的 Firefox 43 仍然无法做到这一点,但我的 Firefox 60 可以)以来,我对这个概念感到非常满意,特别是如果我必须将视频上传到某个地方进行分享;我只需要在服务器上设置 Mime 类型.htaccess,即在 Apache 服务器上创建一个文件,其中包含以下内容:

AddType video/mp4 .mp4

...然后我只需在浏览器中打开 http(s)://...mp4 链接,就完成了。

但是,在很多情况下,我还想添加字幕 - 首先,我不想将它们作为像素“刻录”到视频中(如“硬字幕”),我希望它们保留为单独的文本信息。我知道容器.mkv支持此功能,但 Firefox 不支持此功能(1422891 - [重新思考] Firefox 支持 mkv|matroska|video/x-matroska)。

因此,我发现 .MP4 作为容器实际上可以包含单独的字幕:

还,https://en.wikipedia.org/wiki/Comparison_of_video_container_formatsMP4“字幕/字幕”的注释:

ttxt,具有私有 objectTypeIndication 的 VobSubs 无法与 sceneDescription 一起使用(由 Nero 启动),BIFS

VOBSUB 是一种 .bmp/pixel 格式,所以它不引起我的兴趣,但ttxt很有趣。

但是,我想将字幕嵌入 .MP4 文件一次,然后让带字幕的文件可以在网络上(希望只需上传到提供正确 MIME 类型的服务器,不需要任何 javascript)和桌面播放器上查看(带有字幕)。

我可以为此使用什么程序?是否有示例,以便我知道我大致可以期待什么?


https://apple.stackexchange.com/questions/116927/auto-add-subtitles-into-the-mp4-videos

mp4 确实支持 ttxt 和 VobSub,但不支持 srt 或 ass。

https://gpac.wp.imt.fr/mp4box/ttxt-format-documentation/

3GPP 联盟已定义了一种文本流标准,独立于任何场景描述(如 SMIL、SVG 或 BIFS):3GPP 定时文本...也称为 MPEG-4 流文本

为了帮助创作文本流,GPAC 开发了一种 XML 格式,称为定时文本 (TTXT) - 使用的扩展名为 .ttxt。

ffmpeg 对 tx3g 的支持

FFmpeg 编解码器 mov_text 和 tx3g 是同一个东西:MPEG-4 第 17 部分(定时文本)。

答案1

关于这方面的信息有点零散,所以举个例子有点困难;当然,如果有更好的方法,我还是很乐意听听。但这是我在 Ubuntu 18.04 上所做的 - 首先,一个临时目录:

cd /tmp
mkdir videotest
cd videotest

让我们从获取输入视频开始 - Big Buck Bunny 预告片:

wget http://download.blender.org/peach/trailer/trailer_480p.mov \
 -O big_buck_bunny_trailer_480p.mov

这是 .mov 格式,但没问题,我们可以按照网页视频编码要点

ffmpeg -i big_buck_bunny_trailer_480p.mov \
 -vcodec libx264 -pix_fmt yuv420p -acodec aac \
 -strict -2 -profile:v baseline -level 3 \
 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
big_buck_bunny_trailer_480p.mp4

(请注意,如果没有该-vf ...选项,我们将得到一个“获取的宽度不能被 2 整除(853x480)”错误ffmpeg

然后,让我们获取此预告片的字幕 - 我在这里找到了它们:

wget https://raw.githubusercontent.com/moust/MediaPlayer/master/demo/subtitles.srt \
 -O big_buck_bunny_trailer_480p.srt

此时,我们可以快速尝试vlc big_buck_bunny_trailer_480p.mp4——这应该播放视频,并自动加载.srt具有匹配文件名的字幕。

到目前为止,我在 Ubuntu 18.04 上使用了这些软件版本:

$ vlc --version
VLC media player 3.0.4 Vetinari (revision 3.0.4-0-gf615db6332)
$ ffmpeg -version
ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers

现在,我们需要获取 MP4Box,我们可以这样做:

sudo apt install gpac

注意https://gpac.wp.imt.fr/downloads/gpac-nightly-builds/目前有最新版本的gpac_0.7.2-DEV-rev985;但是Ubuntu 18.04版本是:

$ apt-show-versions -r ^gpac
gpac:amd64/bionic 0.5.2-426-gc5ad4e4+dfsg5-3 uptodate
$ MP4Box -version
MP4Box - GPAC version 0.5.2-DEV-revVersion: 0.5.2-426-gc5ad4e4+dfsg5-3

现在我们可以首先转换.srt.ttxt

MP4Box -ttxt big_buck_bunny_trailer_480p.srt \
 -out big_buck_bunny_trailer_480p.ttxt

... 然后余烬.ttxt在。mp4

MP4Box -add \
 big_buck_bunny_trailer_480p.ttxt:lang=eng":name=English":layout=0x60x0x-1:group=2 \
 big_buck_bunny_trailer_480p.mp4 \
-out subtitled_video.mp4

subtitled_video.mp4将在 VLC 3.0.4 中显示字幕,但我必须在 VLC 中明确右键单击并选择字幕/子轨道/轨道 1 - [英语]。在subtitled_video.mp4Firefox 60 中打开将不显示字幕,也不会显示用于启用字幕的按钮/上下文菜单。

此时,我们要注意 Firefox 确实有一些用于字幕的 UI:

...然而,似乎仅有的对于 WebVTT wvtt//.vtt格式的字幕:

... 然后,仅有的通过 HTML5/JS 使用<video>标签(因此我们不能仅在视频中嵌入字幕,然后打开视频文件的直接 http* 链接并期望显示字幕)。此外,按照:

... 即使有<video>标签,目前也不支持视频中嵌入的字幕(.vtt需要单独的字幕文件) - 除了 mp4,由MP4Box.jsJS 库提供。

请注意,对于此MP4Box.js库:

此外,Git 存储库最近也有活动,但是https://github.com/gpac/mp4box.js/releases最后一个包含单独文件的版本是 v0.3.15 (2016 年 3 月 16 日),最后一个 .zip 版本是 v0.3.16 (2016 年 7 月 12 日);从源代码构建完整的 JS 库有点复杂(您必须使用grunt)。

此外,MP4Box.js除了字幕之外,MP4 还用于处理更多复杂任务,而演示页面相当复杂,旨在演示所有这些。因此,我花了一段时间来缩小演示页面,并想出一个只会打开和播放本地文件的 HTML .mp4,如下所示:

请注意,它使用了库的 v0.3.15 MP4Box.js(它是从旧的演示页面开发而来的);特别是因为新版本的库(和新的演示页面)具有略微不同的 API,这意味着旧的 JS 代码在与较新的库一起使用时会中断。

(另请注意,此测试页面在下载一半时会中断,出现mp4box.releaseUsedSamples未定义x.samples的消息;该页面尝试通过跳过此语句来解​​决此问题,这允许下载在 Firefox 60 中在结束前约 1 秒内完成 - 这意味着大多数视频将可播放,但您将无法循环播放它)

考虑到这一点,如果我们将其放置在与(嵌入字幕的)test-MP4Box.js-v0.3.15.html相同的目录中,并在 Firefox 中打开该页面,我们将在 JavaScript 控制台中看到以下内容:subtitled_video.mp4.ttxt.html

[0:00:00.552] [MSE] MIME type 'video/mp4; codecs="tx3g"' not supported for creation of a SourceBuffer for track id 3    mp4box.all.js:33:6
TypeError: Argument 1 of HTMLMediaElement.addTextTrack '' is not a valid value for enumeration TextTrackKind.     test-MP4Box.js-v0.3.15.html:412:20

因此,tx3g/txtt中的嵌入式字幕.mp4可以在 VLC 3.0.4 中查看,但不受支持MP4Box.js- 唯一支持的嵌入式字幕MP4Box.js是 WebVTT。

值得庆幸的是,我们可以用来MP4Box嵌入.srt我们已经拥有的 WebVTT:

MP4Box -add big_buck_bunny_trailer_480p.srt:fmt=VTT \
 big_buck_bunny_trailer_480p.mp4 
-out subtitled_video.mp4

...如果我们现在在 Firefox 60 中打开test-MP4Box.js-v0.3.15.html,我们会看到字幕和 CC 按钮:

ff-mp4box

然而,如果我们subtitled_video.mp4在 VLC 3.0.4 中使用嵌入的 WebVTT 字幕打开它,我们会发现遗憾的是字幕无法重现。

.mp4不过,在此提交中已添加了对 WebVTT 的支持mux: mp4:添加对 webvtt 的支持 · videolan/vlc@86f5f48 · GitHub从 2018 年 1 月 22 日起。为了获得此功能,我必须通过以下方式安装最新的 VLC nightly snap

sudo snap install --channel=edge vlc

...这给了我:

$ snap run vlc --version
VLC media player 4.0.0-dev Otto Chriek (revision 4.0.0-dev-5939-gee31d91)

... 而这个 VLC 4.0.0 终于可以播放带有嵌入式 WebVTT 字幕的字幕了subtitled_video.mp4。(不过,请注意https://askubuntu.com/questions/1106832/running-a-snap-installed-side-by-side-parallel-to-a-debian-package

答案2

由于上述内容有点复杂,我选择了另一种方法,写在这个测试脚本中(使用这篇文章中的相同文件;脚本也应该通过file://协议在本地工作):

基本上,这只是一个标准的 HTML5 视频播放器,带有一个包含文件 href 的字幕轨道.srt,如前所述,HTML5 视频引擎不支持。但是,在页面加载时,会通过字幕的属性.srt读取文件名,通过 XHR 读取文件,然后传递给src<track>https://github.com/imshaikot/srt-webvtt它会动态生成 W​​ebVTT .srt,并将其应用于字幕轨道,以便它可以工作。

因此,虽然不像在服务器上直接转储带有嵌入字幕的视频那么简单 - 但是我在这里所要做的就是在文件名中写入HTML播放器.mp4代码,而且我不需要担心进一步的转换,因为它是即时完成的。.srt<video>

相关内容