1

С тех пор, как я понял, я могу играть.MP4-видео в моем Firefox в Ubuntu 18.04 (например, мой Firefox 43 до сих пор не может этого сделать, мой Firefox 60 может), я был очень доволен этой концепцией, особенно если мне нужно загрузить видео где-нибудь для обмена; Мне просто нужно настроить Mime Types на сервере, то есть добавить файл .htaccess на сервер Apache с помощью:

AddType video/mp4 .mp4

... тогда я просто открываю ссылку http(s)://...mp4 в браузере, и все готово.

Тем не менее, во многих случаях я также хотел бы добавить субтитры - и, например, я не хотел бы "записывать их" в видео в виде пикселей (как в "жестких субтитрах"), я хотел бы, чтобы они оставались как отдельная текстовая информация. Я знаю, что контейнер .mkv поддерживает это, но он не поддерживается в Firefox (1422891 - [Переосмысление] Поддержка mkv | matroska | video/x-matroska в Firefox).

Итак, я только что обнаружил, что.MP4 как контейнер может фактически включать отдельные субтитры:

Кроме того, https://en.wikipedia.org/wiki/Comparison_of_video_container_formats заметки для MP4 «Заголовки / субтитры»:

ttxt, VobSubs с закрытым objectTypeIndication не может использоваться с 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 или задницу.

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

Консорциум 3GPP определил стандарт для потоковой передачи текста, независимо от описания любой сцены, такой как SMIL, SVG или BIFS: синхронизированный текст 3GPP ... также известный как потоковый текст MPEG-4

Чтобы помочь в создании текстовых потоков, в GPAC был разработан формат XML, называемый TTXT для timed-text - расширение, используемое как .ttxt.

поддержка ffmpeg для tx3g

Кодек FFmpeg mov_text и tx3g - это одно и то же: MPEG-4 Part 17 (Timed Text).

2 ответа2

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, но я должен явно щелкнуть правой кнопкой мыши и выбрать Subtitle/Sub Track/Track 1 - [English] в VLC. Открытие subtitled_video.mp4 в Firefox 60 не покажет ни субтитров, ни кнопки / контекстного меню для их включения.

На данный момент, отметим, что Firefox имеет некоторый интерфейс для субтитров:

... однако, это, кажется, только для субтитров в формате WebVTT / wvtt / .vtt :

... и это только через HTML5/JS с использованием <video> (поэтому мы не можем просто вставлять субтитры в видео, открывать прямую ссылку http * на видеофайл и ожидать, что субтитры будут отображаться). Кроме того, согласно:

... даже с <video> , в настоящее время встроенные в видео субтитры не поддерживаются ( ожидается отдельный файл субтитров .vtt ) - за исключением mp4 библиотекой JS MP4Box.js .

Обратите внимание, что для этой библиотеки MP4Box.js :

Кроме того, Git-репозиторий имеет недавнюю активность, однако на https://github.com/gpac/mp4box.js/releases последний файл с отдельными файлами v0.3.15 (16 марта 2016 г.), а последний .zip - v0.3.16 (12 июля 2016 г.); и сборка полной библиотеки JS из исходного кода немного сложна (вы должны использовать grunt).

Кроме того, MP4Box.js предназначен для гораздо более сложных задач с MP4, чем просто субтитры, и демонстрационная страница довольно сложна, чтобы продемонстрировать все это. Итак, мне потребовалось некоторое время, чтобы уменьшить демонстрационную страницу и создать HTML-код, который просто откроет и воспроизведет локальный файл .mp4 , вот он:

Обратите внимание, что он использует v0.3.15 библиотеки MP4Box.js (он был разработан со старой демонстрационной страницы); тем более, что более новые версии библиотеки (и новая демонстрационная страница) имеют немного другой API, что означает, что старый код JS сломается при использовании с более новой библиотекой.

(также обратите внимание, что эта тестовая страница в противном случае прерывается при половинной загрузке, по адресу mp4box.releaseUsedSamples , с сообщением x.samples undefined; страница пытается обойти это, пропустив этот оператор, что позволяет завершить загрузку до 1 секунды до конца в Firefox 60 - это означает, что большая часть видео будет воспроизводиться, но вы не сможете его зациклить)

Имея это в виду, если мы test-MP4Box.js-v0.3.15.html в тот же каталог, что и subtitled_video.mp4 (в который были встроены субтитры .ttxt ), и откроем страницу .html в Firefox, мы получим показано в консоли JavaScript:

[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

... и если мы сейчас откроем test-MP4Box.js-v0.3.15.html в Firefox 60, мы увидим субтитры и кнопку CC:

ФФ-mp4box

Однако, если мы откроем этот subtitled_video.mp4 со встроенными субтитрами WebVTT в VLC 3.0.4, мы заметим, что, к сожалению, субтитры не могут быть воспроизведены.

Тем не менее, в этом коммите была добавлена поддержка WebVTT в .mp4 mux : mp4: добавлена поддержка webvtt · videolan/vlc @ 86f5f48 · GitHub от 22 января 2018 года. Чтобы получить это, я должен был установить последнюю версию VLC по ночам в виде 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 может, наконец, воспроизводить субтитры в subtitled_video.mp4 со встроенными субтитрами WebVTT. (Тем не менее, обратите внимание на трудности в https://askubuntu.com/questions/1106832/running-a-snap-installed-side-by-side-parallel-to-a-debian-package )

1

Поскольку вышесказанное немного сложнее, я выбрал другой подход, написанный на этом тестовом скрипте (с использованием тех же файлов в этом посте; скрипт также должен работать локально, через file:// protocol):

По сути, это просто стандартный видеоплеер HTML5 с дорожкой субтитров, содержащей ссылку на файл .srt , который, как упоминалось ранее, движок HTML5 не поддерживает. Однако при загрузке страницы имя файла .srt читается через атрибут src субтитра <track> , файл читается через XHR, а затем передается на https://github.com/imshaikot/srt-webvtt, который генерирует WebVTT из .srt на лету, и подает его на дорожку субтитров, поэтому он может работать.

Поэтому, хотя это и не так просто, как просто выгрузить видео со встроенными субтитрами на сервер - все, что мне нужно здесь сделать, это записать имена файлов .mp4 и .srt внутри кода проигрывателя HTML <video> , и я не нужно беспокоиться о преобразовании дальше, так как это делается на лету.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .