LINUX.ORG.RU
ФорумTalks

Как читать субтитры из mkv-файла для html video под webOS?

 ,


0

1

Хочу накалякать видео-плеер для LG-телевизора, чтобы играть видео с домашнего сервера. LG неплохо поддерживает форматы, в принципе достаточно тупо <video><src=.../></video> и он играет какой-нибудь mkv с HEVC HDR DTS 7.1 и прочими страшными словами. Есть только две большие проблемы - во-первых он играет первую звуковую дорожку и не даёт интерфейса для выбора другой, во-вторых он вообще не играет субтитры. При этом если тот же файл играть с подключённой флешки, всё это можно настраивать, поэтому API где-то есть, но я не нашёл где. Для переключения треков я нашёл API, правда пока не тестировал, но для субтитров пока даже примерно не представляю, что с ними делать. Единственное, что придумал это вытаскивать субтитры из mkv во внешний файл и отдельно его обрабатывать, но мне это не очень нравится: mkvextract работает ОЧЕНЬ долго, судя по всему он читает весь mkv файл с начала до конца, если это какой-нибудь небольшой фильм в 50-GB, то это минут 20, я уже смотреть расхочу, пока он их вытащит.

Собственно тут два варианта, либо найти API в телевизоре, которое позволило бы его средствами вытаскивать субтитры из контейнера, либо найти способ очень быстро вытаскивать субтитры из mkv. Пока ни один вариант не знаю, как сделать.

★★★★★

html video умеет только один формат субтитров, и я очень сомневаюсь что подгрузка сабов из видео-файла предполагается. Извлекай сабы (mkvextract), конверть в нужный формат (ffmpeg) и подсовывай их отдельно

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Не дочитал пост. Да, mkvextract работает не быстро. Не разбирался, может это можно исправить.
Ещё можно скачивать сабы отдельно с какого-нибудь opensubtitles.org (сайт не фонтан, если кто-то подскажет аналоги получше, буду признателен)

MrClon ★★★★★
()

его средствами вытаскивать субтитры из контейнера

А я тебе говорил как сделать, но ты налепил хтмл-страничку и теперь страдаешь.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Открывал я прямую ссылку, там обычный HTML-плеер ровно с таким же интерфейсом и возможностями.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от iSage

DLNA я не понимаю, поэтому не хочу юзать. То, что работает непонятно как, глючит непредсказуемо, а я хочу, чтобы хотя бы глючило предсказуемо. На текущий момент поставил Emby со внешними субтитрами, этот набор работает приемлемо, хотя пытался транскодить, пока я ему в конфиге совсем не запретил это делать. Но Emby это такой комбайн на дотнете, что я его совсем не хочу юзать.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Подсмотри какие заголовки отдает апач с файлом. Если там майм тип не «application/octet-stream», то поменяй на октет (октет всегда браузер предлагает скачать, не пытаясь открыть своими встроенными пдф читалками или плеерами, например), а если октет, то добавь правильный в меджик конфиг апача. И скорми телеку по прямой ссылке. Главное — заставить/отучить его «изучать» содержимое файла, чтобы он как самый умный не подсовывал хтмл-плеер. Может помочь. А может не помочь, если он опять как самый умный, считает, что раз по хттп, значит вот тебе хтмл-плеер.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от Legioner

DLNA я не понимаю, поэтому не хочу юзать.

У меня телевизор LG, который я использую с DLNA. Субтитры читаются и переключаются. Звуковая дорожка — нет.

Wizard_ ★★★★★
()

вытаскивать субтитры из mkv во внешний файл

Для этого необязательно использовать mkvextract. Есть вот такая штука, например: https://www.npmjs.com/package/matroska-subtitles

С её помощью только что написал простенький скрипт, натравил на 8 ГБ фильм в mkv, он вытащил оттуда субтитры за 1 минуту и 50 секунд.

Можно ещё не вытаскивать субтитры из самого mkv-файла, а вытаскивать их из https://www.opensubtitles.org

Wizard_ ★★★★★
()
Ответ на: комментарий от Wizard_

2 минуты для 8 ГБ судя по всему ровно то же, что у меня, чтение всего файла. Если файл не 8 ГБ, а 50 ГБ, это уже 10+ минут, никакого терпения не хватит. Похоже это недостаток mkv. С интернета вытаскиваю, но там ещё дольше, куча вариантов и фиг знает какой подойдёт, пока все проверишь..

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Потоки в контейнере хранятся смешенно, а не отдельно каждый, поэтому нужно прочитать весь файл, чтобы вытащить какой-то один поток, будь это хоть видео, аудио или субтитры.

ValdikSS ★★★★★
()
Ответ на: комментарий от ValdikSS

Ну я это понимаю, но субтитры занимают очень мало места и меняются не так часто, раз в 5-10 секунд, то бишь если там есть смещения, не нужно читать его весь от начала до конца, достаточно читать нужные блоки, но это если в mkv есть эта информация, позволяющая пролистывать файл до следующего фрагмента смещения. Если никак, то, видимо, надо придумать, как браузеру скармливать этот vtt в стриминговом виде. Или вообще не пользоваться vtt а поставить div над video и вручную его обновлять, не так уж это и сложно.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

По дефолту апач вообще не отдаёт content-type. Пробовал ставить application/octet-stream и video/x-matroska, в обоих случаях браузер выдаёт ошибку, что-то вроде загрузка файлов не поддерживается.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Как минимум, время затраченное на скачку. На 50 ГБ у меня уйдет не меньше двух часов.

Впрочем, если тебе удобно, то это твое дело.

Deleted
()
Ответ на: комментарий от Deleted

Я обычно закачиваю за пару недель до просмотра, так что не проблема. Вот лишние движения, всякие извлечения дорожек и прочее раздражают.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

По дефолту апач вообще не отдаёт content-type

Не может быть!!! https://pic4a.ru/87/6II.png

Если поменяю на октет стрим, то браузер вместо показа плеера на странице будет открывать диалог с предложением сохранить файл. Кстати «Accept-range: bytes» дает возможность перематывать файл сразу к середине например, если клиент умеет (докачка 206 Partial content).

Ты что-то делаешь не так.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Хз, я ничего особо не делал.

[root@home ~]# cat /etc/httpd/conf.d/downloads.conf
Alias /downloads /srv/downloads
<Directory /srv/downloads>
    Options Indexes
    Require all granted
</Directory>
[root@home ~]# curl --head 'http://home.vbezhenar.com/downloads/movies/The_MARTIAN_UHD_HDR_RMX-BLUEBIRD.mkv'
HTTP/1.1 200 OK
Date: Sun, 08 Jul 2018 12:14:43 GMT
Server: Apache/2.4.6 (Red Hat Enterprise Linux)
Last-Modified: Thu, 05 Jul 2018 23:23:31 GMT
ETag: "bd28701de-57048d5e08e95"
Accept-Ranges: bytes
Content-Length: 50776703454
Перематывание работает. Кстати если этот URL открывать на обычном компе, то действительно открывается не ролик, а текстовая каша. Но на телевизоре нормально работает.

Прикола ради поставил video/mp4, на компьютере заработало (точней не заработало, т.к. Edge матроску не понимает, но попыталось заработать), на телевизоре тоже работает (с тем же HTML-плеером).

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 3)
Ответ на: комментарий от Legioner

на обычном компе, то действительно открывается не ролик, а текстовая каша

Агаа!

Положи в диру с кинами вот такой .htaccess:

ForceType application/octet-stream
Или другой тип укажи, какого у тебя там файлы. Если браузер предлагает скачать (или воспроизводит в том же окне если ты поставил не октет), значит все правильно. Теперь проверяй что делает телек.

Чтобы не прописывать всякие FilesMatch в том же .htaccess подставляя типы по расширению, у апача есть в конфигах файл magic — вот в нем все типы к расширениям описаны. Форсить тип надо только если хочешь заставить загрузить, т.е. тот хак, которым я и предлагаю обмануть телек.

video/mp4 эт не матроска.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 4)
Ответ на: комментарий от deep-purple

Да пробовал я, через AddType в конфиге Апача и curl-ом проверял, всё правильно отдаёт, телек на octet stream или на матроску просто ошибку выдаёт и всё, не могу мол я скачивать файлы. Я знаю что video/mp4 это не матроска, но её телек распознаёт и играет, думаю ему пофиг на конкретный контент-тайп, он его уже по данным определяет.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Варианты:

1) С одной стороны значит это телек такой себе умный и все за тебя решает.

2) С другой стороны, странно, что твой апач сам не подставляет заголовок с типом файла. Ты убедился браузером с компа что все так как я описал? Дело в том что апач должен подставлять заголовок с типом, а если он не знает какой тип (определяет по расширению файла, правила описаны в magic файле), то он подставит дефолтный (text/html, например). Это означает, что апач твой не настроен.

3) Ведь, иначе как так, телеку не похер на заголовки и он выдает ошибку (но тут нюанс, с октет стримом он может ждет еще один заголовок attachment с именем файла).

4) Если ничего не выйдет, тогда и я тоже сдамся и будем лепить горбатого с вытаскиванием сабов и показом их в диве.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Как я понимаю ситуацию со стороны телека. octet-stream положено скачивать. Непонятно что (про video/x-matroska видимо он не знает), тоже положено скачивать. Заголовок content-disposition насколько я помню не важен, им можно задать имя файла, но если его не задавать, браузер всё равно будет скачивать файл с каким-нибудь именем из URL-а. Это он и пытается делать, с выдаванием ошибки. Если content-type нет или он знаком телевизору (video/mp4), то он уже запускает html player, который играет переданный ему стрим.

Апач с дефолтным конфигом из RHEL-а, я там вообще ничего не менял, только добавил процитированный выше файлик. Может он из коробки неправильно настроен, хз.

Legioner ★★★★★
() автор топика
Последнее исправление: Legioner (всего исправлений: 2)
Ответ на: комментарий от Legioner

content-disposition насколько я помню не важен, им можно задать имя файла

Возможно для телека он важеш — кладет данные в кеш.

Если content-type нет или он знаком телевизору (video/mp4), то он уже запускает html player

Вот это и надо проверить, но только после того как убедишься что апач отдает типы в заголовках.

Может апач из коробки неправильно настроен

Нет, он настроен, но не под твой юзкейс. Они ж не знали как ты его будешь телеком мучать.

deep-purple ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.