yumata / lampa

GNU General Public License v2.0
333 stars 86 forks source link

Samsung Tizen проблемы с субтитрами и звуковой дорожкой #212

Open alexeynl opened 6 months ago

alexeynl commented 6 months ago

Телевизор Samsung Q9FNA (2018 г.). Обновления последние установлены. Версия Лампы 2.0.4 Проблема с субтитрами и звуковой дорожкой, если проигрывать торрент с несколькими звуковыми дорожками:

  1. Если использовать плеер Tizen (по умолчанию):

1.1. Субтитры отображаются, но без форматирования. Т.е. отсутствуют стили (шрифты и цвет), текст надписей не спозиционирован. Вот как выглядят в этом случае надписи: IMG_20231230_230712 а вот как они выглядят в плеере Jellyfin (читай далее): IMG_20231230_230516 1.2. Звуковая дорожка в этом случае переключается корректно. Видеодемонстрация:

https://github.com/yumata/lampa/assets/82229750/faed7546-1d10-410f-a4c2-2a6d78554dfd

  1. Если в настройках Лампы указать Тип плеера: встроенный при проигрывании того же торрента: 2.1. Субтитры не отображаются. 2.2. Звуковая дорожка не переключается, т.е. я переключаю дорожку, например, с русской (по умолчанию) на японскую, но озвучка остается на русском. Видеодемонстрация проблемы:

https://github.com/yumata/lampa/assets/82229750/24ed6783-6883-4b81-aa12-8b0efffc0b1f

Предвосхищая отсылки к тому, что проблема на стороне телевизора (читал тикеты с аналогичными проблемами):

  1. Действительно встроенный плеер на этом телевизоре имеет проблемы с воспроизведением субтитров, описанные в п.1.1. Например, при воспроизведении с флешки и по DLNA та же проблема. Собственно для этого я и хотел использовать встроенный плеер лампы.
  2. Была аналогичная проблемы на этом же телевизоре с Jellyfin. Его виджет имел проблемы из п. 1.1 и 2.2 и какое-то время я решал их транскодингом на стороне сервера Jellyfin (прожиганием субтитров в видеоряд налету). В этом году пересобрал клиент (виджет) Jellyfin (https://github.com/jellyfin/jellyfin-tizen) и обнаружил, что проблема с субтитрами (скрин приведен выше как они сейчас отображаются в Jellyfin) и звуковой дорожкой пофиксили и теперь транскодинг мне не нужен.

Пожалуйста, пофиксите встроенный плеер лампы на Samsung Tizen, т.к.:

  1. Плеер Tizen, очевидно, Samsung на этом телеке уже не пофиксит никогда.
  2. Опыт с другим плеером, говорит о том, что проблему можно решить доработкой встроенного плеера (плеера виджета).
yumata commented 6 months ago

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

Ламповый плеер увы я пофиксить не могу, это уже внутренности так сказать браузера, к которому я не имею доступ.

alexeynl commented 6 months ago

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

Не понял про какие символы речь. Если вы про первый скриншот, то это кривое отображение надписей (их позиционирование). Это лишь одно из проявлений проблемы встроенного плеера Tizen. Проблема не только в этих "символах", а в отображении субтитров плеером Tizen в целом. Похоже он не умеет форматировать субтитры. Сравните как выглядят обычные субтитры (не надписи) на 1:23 первого демострационного видео и сравните как они должны выглядеть в форматированном виде: Должно быть так (задумано автором субтитров/раздачи): image Tizen плеер отображает так: image

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

А если подсмотреть реализацию у коллег из Jellyfin (https://github.com/jellyfin/jellyfin-tizen)?

Ламповый плеер увы я пофиксить не могу, это уже внутренности так сказать браузера, к которому я не имею доступ.

Вот это тоже не понял. Я могу понять, что Tizen плеер не в вашей власти, но плеер лампы вы же сами пишете.

yumata commented 6 months ago

А если подсмотреть реализацию у коллег из Jellyfin (https://github.com/jellyfin/jellyfin-tizen)?

Смотрел, но ничего путного не нашел, разве что есть часть кода, которая отвечает за загрузку шрифтов, но откуда эти шрифты тянутся и как к плееру подключаются я без понятия. Но судя по логики, как я понимаю, мне нужно загрузить все шрифты в телек и подключать из названия шрифта в субтитрах. Я так полагаю, но не уверен, так как абсолютно все шрифты подключить это тупо, наверно это делается как-то иначе.

но плеер лампы вы же сами пишете.

Нет, это плеер html5, я лишь визуально сверстал к нему интерфейс для управления, внутренности плеера мне недоступны.

alexeynl commented 6 months ago
  1. Итак по поводу вот этих символов, которые выдает Tizen плеер в субтитрах:

IMG_20231230_230712

Это видео в mkv контейнере. Субтитры идут отдельным потоком в формате ASS/SSA:

Снимок экрана 2024-01-02 170311

Я вытащил субтитры из контейнера.

[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).txt

И нашел эти непонятные символы, которые появляются на экране:

Снимок экрана 2024-01-02 165950

Это служебный текст, который Tizen плеер зачем то выводит в качестве текста субтитров. Очевидно, что встроенный плеер не умеет корректно выводить ASS/SSA субтитры. Хотя поддержка со стороны Samsung заявлена.

Пробовал на этом же телевизоре с флешки воспроизвести тот же самый контейнер, та же ерунда с субтитрами.

  1. Исходя из вышесказанного, плеером Tizen проблему не решить. Поэтому для решения проблему вижу следующие пути:

Что скажете?

alexeynl commented 6 months ago

Кстати поиск по ключевым словам html5 player ass subtitles выдает ссылки на обсуждение проблемы и готовые решения:

https://stackoverflow.com/questions/19627329/how-can-i-use-subtitles-with-video-in-html5-and-reveal-js https://github.com/SABRE-JS/SABRE.js https://github.com/libass/JavascriptSubtitlesOctopus https://github.com/weizhenye/ASS https://github.com/luxluth/ass-html5

alexeynl commented 6 months ago

Пока рылся по ссылкам выше наткнулся на такое интересное замечание:

Subtitles not shown in fullscreen when using with pure HTML5 video. Fullscreen working in any player with custom controls (see example with Video.js player). Why this happens?

Взято оно отсюда: https://libass.github.io/JavascriptSubtitlesOctopus/native.html

Может это и есть причина почему субтитры не отображаются во встроенном (html5) плеере Lamp'ы?

yumata commented 6 months ago

Взято оно отсюда: https://libass.github.io/JavascriptSubtitlesOctopus/native.html

В примерах показано, как вставить свои субтитры формата .ass, это не проблема когда они идут отдельным файлом, проблема когда они вшиты в видео. HTML5 никак не читает субтитры, такую возможность делают на уровне телевизора.

Очевидно, что встроенный плеер не умеет корректно выводить ASS/SSA субтитры. Хотя поддержка со стороны Samsung заявлена.

Возможно формат претерпел изменений, а в телевизорах не завезли обновления, вот и выводит непонятные символы, возможно как вариант, самому чистить эти символы начиная со знака {

Также, лампа умеет читать субтитры форматов vtt ,lrc, smi, ssa, ass, sub, srt, sbv, json если они идут как отдельные файлы от видео.

alexeynl commented 6 months ago

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

Да именно так к сожалению. Внимательно изучал эти ссылки уже после того как скинул.

HTML5 никак не читает субтитры, такую возможность делают на уровне телевизора.

Уже давно бы смирился и согласился бы с вами, если бы не Jellyfin :) Попробую еще поизучать этот вопрос.

возможно как вариант, самому чистить эти символы начиная со знака {

Вы наверно до сих пор не поняли суть проблемы :). Проблема не в присутствии мусорных символов, а в том, что здесь мы видим

IMG_20231230_230712 — копия

часть текста надписи, которая на самом деле должна располагаться на двери:

IMG_20231230_230516 — копия

Надеюсь так нагляднее и понятнее... Удаление символов из текста ничего не даст. Оно не решает проблему с правильным позиционированием и форматированием текста.

alexeynl commented 6 months ago

Нашел вот такое решение для встроенных в mkv субтитров:

https://github.com/pawitp/mkv-player

Оно вполне себе рабочее в Chromium браузерах. Протестировал его в Edge, Yandex Browser и Chrome. Результат:

Снимок экрана 2024-01-02 221933

Снимок экрана 2024-01-02 222141

В Firefox правда не работает, но я не думаю, что в Tizen используется этот браузер, надо пробовать.

yumata commented 6 months ago

Нашел вот такое решение для встроенных в mkv субтитров:

https://github.com/pawitp/mkv-player

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

Удаление символов из текста ничего не даст. Оно не решает проблему с правильным позиционированием и форматированием текста.

Теперь я понял о чем речь, однако я не нашел в сети документации формата ass, как его парсить и что в нем ваше прописано. Но даже если я разберусь и сделаю парсер, то это не имеет смысла если субтитры будут вшиты))

Уже давно бы смирился и согласился бы с вами, если бы не Jellyfin :)

Я не знаю как он работает, но полагаю, что у него тоже есть экстрактор и свой личный парсер субтитров. Так как у него есть сервер, то экстрактор ему не проблема.

alexeynl commented 6 months ago
  1. По поводу mkv-player.

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

Это явно не так работает. Сервер тут нужен только, чтобы хранить скрипты. На стороне сервера ничего не извлекается и не декодируется: Во первых, на демонстрационной странице скрипта явно сказано, что mkv файлы на сервер не передаются, декодирование выполняется локально: image Во вторых, попробуйте самостоятельно кинуть на демонстрационную странице скрипта mkv файл. Вы заметите, что 200 мб файл начинает проигрываться мгновенно, что подтверждает, что файл на сервер не закачивается. А если не закачивается, значит и извлечение субтитров и другие операции происходят локально.

  1. По поводу Jellyfin. Вчера пытался разобраться, как это у них реализовано. При проигрывании на клиенте mkv файла, в логах сервера видно что на стороне Jellyfin сервера с помощью утилиты ffmpeg происходит извлечение из mkv контейнера:
    • т.н. attachments (что это такое см. в п. 3 ниже)
      [2024-01-03 14:23:01.985 +03:00] [INF] [21] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:3 \"/config/data/data/attachments/0/0ef50d3f-fbd8-c165-83f4-e1e1a23a1323\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:01.999 +03:00] [INF] [21] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:4 \"/config/data/data/attachments/6/6787158b-5081-0b78-df32-ced0676ce527\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:02.002 +03:00] [INF] [24] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:6 \"/config/data/data/attachments/a/af006ccf-d5e3-b197-c71c-c36edb73c25e\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:02.003 +03:00] [INF] [55] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:7 \"/config/data/data/attachments/b/bbca7ed9-4a29-4426-b17e-6beafa368bcd\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:02.004 +03:00] [INF] [21] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:5 \"/config/data/data/attachments/6/6c67c5d2-f367-6819-a97e-183d09f27ecc\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:02.005 +03:00] [INF] [50] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-dump_attachment:8 \"/config/data/data/attachments/5/5f12d9d9-fb83-6d75-9347-f41cc1fbac0b\" -i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -t 0 -f null null"
      [2024-01-03 14:23:02.174 +03:00] [INF] [50] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/0/0ef50d3f-fbd8-c165-83f4-e1e1a23a1323" to "/config/data/data/attachments/0/0ef50d3f-fbd8-c165-83f4-e1e1a23a1323"
      [2024-01-03 14:23:02.176 +03:00] [INF] [24] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/b/bbca7ed9-4a29-4426-b17e-6beafa368bcd" to "/config/data/data/attachments/b/bbca7ed9-4a29-4426-b17e-6beafa368bcd"
      [2024-01-03 14:23:02.178 +03:00] [INF] [55] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/6/6c67c5d2-f367-6819-a97e-183d09f27ecc" to "/config/data/data/attachments/6/6c67c5d2-f367-6819-a97e-183d09f27ecc"
      [2024-01-03 14:23:02.181 +03:00] [INF] [24] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/6/6787158b-5081-0b78-df32-ced0676ce527" to "/config/data/data/attachments/6/6787158b-5081-0b78-df32-ced0676ce527"
      [2024-01-03 14:23:02.184 +03:00] [INF] [54] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/a/af006ccf-d5e3-b197-c71c-c36edb73c25e" to "/config/data/data/attachments/a/af006ccf-d5e3-b197-c71c-c36edb73c25e"
      [2024-01-03 14:23:02.189 +03:00] [INF] [18] MediaBrowser.MediaEncoding.Attachments.AttachmentExtractor: ffmpeg attachment extraction completed for "/config/data/data/attachments/5/5f12d9d9-fb83-6d75-9347-f41cc1fbac0b" to "/config/data/data/attachments/5/5f12d9d9-fb83-6d75-9347-f41cc1fbac0b"
    • скрипта ASS субтитров
      [2024-01-03 14:16:12.127 +03:00] [INF] [25] MediaBrowser.MediaEncoding.Subtitles.SubtitleEncoder: "/usr/lib/jellyfin-ffmpeg/ffmpeg" "-i file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\" -copyts -map 0:2 -an -vn -c:s copy \"/config/data/data/subtitles/4/495c43c9-ce0e-4ff1-67df-c22b000b285a.ass\""
      [2024-01-03 14:16:12.316 +03:00] [INF] [31] MediaBrowser.MediaEncoding.Subtitles.SubtitleEncoder: ffmpeg subtitle extraction completed for "file:\"/data/qbittorrent/downloads/anime/Soredemo Ayumu wa Yosetekuru/[SubsPlease] Soredemo Ayumu wa Yosetekuru - 01 (1080p).mkv\"" to "/config/data/data/subtitles/4/495c43c9-ce0e-4ff1-67df-c22b000b285a.ass"

      Что происходит на стороне клиента Jellyfin на Tizen я не знаю как посмотреть. Зато при проигрывании этого видео в веб интерфейсе Jellyfin с помощью браузера на ПК видно, что при активации субтитров в плеере браузер подгружает с сервера Jellyfin небезызвестный уже нам скрипт для рендеринга субтитров subtitle-octopus, а тот в свою очередь - файл субтитров Stream.ass:

image

Подытоживая видится, что у Jellyfin выполнена следующая реализация для ASS/SSA субтитров:

  1. По поводу шрифтов и формата субтитров.

Но судя по логики, как я понимаю, мне нужно загрузить все шрифты в телек и подключать из названия шрифта в субтитрах. Я так полагаю, но не уверен, так как абсолютно все шрифты подключить это тупо, наверно это делается как-то иначе.

Для корректного рендеринга ASS субтитров нужно загрузить те шрифты, которые используются в файле (скрипте) субтитров, а не все существующие в мире - это не реально.

Если субтитры внедрены в контейнер (идут отдельной ASS дорожкой), то авторы субтитров помещают сами шрифты, используемые в субтитрах, в mkv контейнер (внутри так называемых attachments). Подробнее можно почитать здесь: https://www.matroska.org/technical/attachments.html.

Если субтитры идут в раздаче отдельным файлом, то авторы субтитров, как правило размещают все необходимые файлы для рендеринга в отдельную директорию внутри раздачи. Пример:

image

Также шрифты могут находится внутри самого ASS/SSA скрипта. На том же сайте есть раздел посвященный различным форматам субтитров и дается ссылка на спецификацию формата ASS/SSA: https://www.matroska.org/technical/subtitles.html. Но такого на практике я не видел.

  1. По поводу парсинга субтитров.

Но даже если я разберусь и сделаю парсер,

у него ... свой личный парсер субтитров.

Не надо изобретать велосипед и делать "свой" парсер. Во первых, это не такая простая задача, поймете это почитав спецификацию на формат ASS, ссылку на которую я привел выше. Этот только один из много численных форматов субтитров. Во вторых никакую из перечисленных мной проблем вы не решите. Нужно использовать готовые библиотеки, для ASS/SSA тот же JavascriptSubtitlesOctopus, который походу уже стандарт де факто. Jellyfin, как мы видим, тоже использует данную библиотеку.

  1. По поводу субтитров в Lamp'е при проигрывании из раздач, где они идут отдельными файлами.

Я проверил на своем ТВ Samsung и к моему удивлению такие субтитры действительно воспроизводятся. Причем как Tizen плеером, так и встроенным в Lamp'у. К сожалению, как и в случае с субтитрами в mkv контейнерах субтитры в формате ASS/SSA отображаются также некорректно (без форматирования и позиционирования).

Во первых, как удалось это реализовать? Torrserver точно этого не умеет я даже писал по этому поводу разработчику, чтобы он добавил возможность включать такие субтитры в поток, но был послан. Во вторых, у меня почему-то это не работает на Android смартфоне. Ни VLC ни MX Player субтитры не видит. Что может быть не так?

yumata commented 6 months ago

Буду честен, я в душе не е..., как эти проекты запускать в формате script.js без ноды и всего прочего г.... 😄 , мне нужно готовый файл subtitles.js, mkv-extractor.js, ffmpeg.js

Я пытался понять, как сборки на ноде привести в один файл, но так и не понял.

yumata commented 6 months ago

Во первых, как удалось это реализовать? Torrserver точно этого не умеет я даже писал по этому поводу разработчику, чтобы он добавил возможность включать такие субтитры в поток, но был послан. Во вторых, у меня почему-то это не работает на Android смартфоне. Ни VLC ни MX Player субтитры не видит. Что может быть не так?

Все просто оказалось, лампа смотрит есть ли файл субтитры с таким же название файла как видео, если есть, то подгружает его и парсит встроенным парсером субтитров в лампе.

alexeynl commented 6 months ago

Прежде чем дальше двигаться к пониманию возможного решения, давайте сначала разложим в голове вышесказанное по полочкам и подведем предварительные итоги:

  1. Имеем проблему с отображением субтитров в клиенте Lamp'ы Samsung Smart TV в торрент раздачах.
  2. Проблема характерна не только для Lamp'ы, но и для других конкурирующих продуктов.
  3. Проблема проявляется в том, что субтитры выводятся на экран не так как задумано их автором субтитров, а именно: отсутствует цветовое оформление, шрифты и позиционирование.
  4. Проблема касается субтитров в формате ASS/SSA.
  5. Проблема касается ASS/SSA субтитров как в составе mkv контейнера, так и в виде отдельного .ass файла (т.н. внешние субтитры).
  6. Общий охват проблемы: практически весь аниме контент, поскольку ASS/SSA субтитры являются фактически стандартом де факто в фансабинге.
  7. Причина проблемы в системе Tizen. По сути системе предоставляет разработчика два плеера: т.н. Tizen плеер и HTML5 плеер. Оба не распознают ASS формат субтитров в соответствии с его спецификацией. Samsung официально поддерживает формат ASS субтитров, но по факту это не так.
  8. Добавлять сторонние плееры, которые бы поддерживали ASS/SSA субтитры, в систему Tizen нельзя.
  9. Tizen плеер выводит только текстовую часть субтитров ASS/SSA субтитров. Также иногда захватывает и выводит в картинку служебную часть в виде текста.
  10. HTML5 плеер не распознает и не выводит ASS/SSA субтитры совсем. HTML5 в соответствии со спецификацией умеет только WEBVTT, ASS/SSA не поддерживаются.
  11. Добавить поддержку ASS субтитров в Tizen плеер силами разработчиков Lamp'ы и аналогов очевидно не получится.
  12. Возможное решение видится в добавлении в HTML5 плеер рендеринга ASS/SSA субтитров с помощью сторонних JavaScript библиотек.
  13. Для того, чтобы рендерить ASS/SSA субтитры, находящиеся внутри mkv контейнеров, необходимо дополнительно их извлечь.
  14. Для рендеринга ASS/SSA субтитров также нужны шрифты. Шрифты находятся обычно там же где и сами субтитры: внутри контейнера или отдельным файлами в раздаче.
alexeynl commented 6 months ago

Все просто оказалось, лампа смотрит есть ли файл субтитры с таким же название файла как видео, если есть, то подгружает его и парсит встроенным парсером субтитров в лампе.

  1. Почему "оказалось"? Разве не вы разработчик ламы? Я точно туда написал с этой проблемой :)
  2. А как лампа смотрит внутрь раздачи и скачивает оттуда файл с внешними субтитрами? У нее есть свой торрент клиент?
  3. Что значит встроенный парсер субтитров? Каким образом вы передаете внешние ASS/SSA субтитры в HTML5 плеер? Я почитал про субтитры в HTML5, он умеет только в WEBVTT формат. А он максимально простой и кастрированный. В шрифты, форматирование и позиционирование он не умеет. Есть подозрение, что когда вы передаете в HTML5 плеер ASS/SSA файл субтитров где-то происходит явное или неявное переконвертирование в WEBVTT. В противном случае это не должно работать и "внешние" ASS/SSA субтитры не должны отображаться в HTML5 плеере.
alexeynl commented 6 months ago

Буду честен, я в душе не е..., как эти проекты запускать в формате script.js без ноды и всего прочего г.... 😄 , мне нужно готовый файл subtitles.js, mkv-extractor.js, ffmpeg.js

Я пытался понять, как сборки на ноде привести в один файл, но так и не понял.

Если вопрос в том как внедрить в существующий проект mkv-player, то насколько я понял он на react'е. Может это оно: https://react.dev/learn/add-react-to-an-existing-project

yumata commented 6 months ago

3. Что значит встроенный парсер субтитров?

Вот он писал его не я, это кто-то сделал пулл и я его принял. Теперь я вижу что там есть Style и еще всякое парсит, но отдает только диалоги.

2. А как лампа смотрит внутрь раздачи и скачивает оттуда файл с внешними субтитрами? У нее есть свой торрент клиент?

Когда раздачу открываете, то лампа показывает наличие видеофайлов в раздаче, в лампе стоит фильтр, который выводит только видеофайлы, а все остальное скрыто. Так вот, когда запускаете видео, лампа параллельно смотрит в раздачи файл субтитров и загружает его, благо торсервер может любой файл с раздачи отдать для загрузки. Далее после загрузки файла с субтитрами лампа его парсит, определяет метки времени диалогов и поверх видео выводит текст.

8. Tizen плеер выводит только текстовую часть субтитров ASS/SSA субтитров.

В документации сказано:

duration : How long the subtitle data should show(unsigned long value in milliseonds)
subtitles : DOMString. The actual subtitle data. It can be of type text of type image.
type : DOMString of unsigned int value. A value of '0' means subtitle data is of type text and '1' means subtitle data is of type Image
attributes : array of AVPlaySubtitleAttribute "attr_type": "AttributeType:value"; "start_pos": start position as long; "stop_pos": stop position as long

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

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

alexeynl commented 6 months ago

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

Во первых, проблема с правильным отображением касается не только субтитров внутри mkv контейнеров. Внешние ASS/SSA субтитры, которые в раздаче идут отдельным файлом, сейчас на телевизоре Tizen тоже выводятся без форматирования хоть через Tizen плеер, хоть встроенный плеер Лампы. Решать проблему извлечения субтитров из контейнеров есть смысл только после того, как будет найдено решение по их корректному отображению.

Во вторых, какую задачу мы решаем: одинакового отображения субтитров на всех устройства или все таки их правильного отображения :)? Я предлагаю все таки не распыляться, попробовать в рамках данного issue решить конкретную проблему с отображение ASS/SSA субтитров на телевизорах с Tizen, а потом уже искать какое-то универсальное решение или пути по его универсификации. Иначе мы с такими планами с места не сдвинемся...

Вот он писал его не я, это кто-то сделал пулл и я его принял. Теперь я вижу что там есть Style и еще всякое парсит, но отдает только диалоги.

Почитал исходники. Еще бы почитать ту часть кода, где эти функции вызываются. Пока что похоже, что они служат для конвертирования всех популярных форматов субтитров в простой текстовый с полной потерей форматирования (стилей, шрифтов, позиционирования). Если это так:

  1. Не понятно зачем это сделано. Возможно это костыль, чтобы быстро без заморочек реализовать работоспособные субтитры на всех, даже на самых отсталых устройствах, где поддерживаются только текстовый формат субтитров.
  2. Если мы хотим решить проблему с корректным отображением форматированных субтитров на тех устройствах, где это возможно, тогда нужно менять логику для этих устройств и убирать для них эту конвертацию.

В документации сказано:

Все еще пытаетесь воскресить мертвого (Tizen плеер)?... Попытка не пытка, но и горбатого могила исправит :)

subtitles : DOMString. The actual subtitle data. It can be of type text of type image.
type : DOMString of unsigned int value. A value of '0' means subtitle data is of type text and '1' means subtitle data is of type Image

Ну то есть в Tizen плеер можно передавать данные субтитров как виде текста так и в виде картинки. Тогда если мы хотим правильно отобразить форматированные субтитры (ASS/SSA формате) в Tizen плеере , вероятно их нужно передавать в виде картинки, т.е. предварительно сконвертировав ASS/SSA в картинку. Но без описания или примеров, как выполнить такую конвертацию вряд ли что-то тут получится.

Честно я бы не тратил время на реверс инжениринг Tizen плеера. Кажется, что уже реализованное у Jellyfin решение по доработке системного HTML5 плеера, вполне можно взять за основу и для Lamp'ы. Наиболее перспективный план реализации видится такой:

  1. Создать под это дополнительную копию встроенного (HTML5) плеер Lamp'ы, чтобы не ломать существующий. Назвать как-нибудь так: "Встроенный v.2 (beta 1)".
  2. Добавить в него библиотеки по рендерингу ASS/SSA субтитров.
  3. На первом этапе в "beta 1 версии" плеера:
    • убрать конвертирование ASS/SSA субтитров в текстовый
    • передавать и рендерить в плеере только ASS/SSA субтитры идущие в раздаче отдельным файлом
  4. Когда п.3. будет нормально работать можно уже развить успех и реализовать извлечение ASS/SSA субтитров и шрифтов из контейнеров mkv. Переименовать этот встроенный плеер Лампы во "Встроенный v.2 (beta 2).
alexeynl commented 6 months ago

Забыл написать в предыдущем сообщении еще кое-что по поводу плеера Tizen. В документации к AVPlay API Samsung нашел такую функцию

setExternalSubtitlePath Sets the local path for the external subtitle file. Only absolute local paths are supported. If the subtitle file is stored remotely, you must first download the file to local storage, and pass the absolute local path.

void setExternalSubtitlePath(DOMString filePath);

Возможно, если передать в Tizen плеер файл субтитров из раздаче в исходном ASS/SSA формате, то они будут отображаться как положено. Хотя шансов на это чуть более чем 0, потому что

  1. Метод не предусматривает передачу плееру шрифтов. Не понятно как плеер будет рендерить субтитры, если используемые в ASS/SSA скрипте шрифты отсутствуют в системе.
  2. Повторюсь нет никаких успешных примеров, когда ASS/SSA субтитры отображались бы корректно Tizen плеером. Даже при проигрывании встроенным проводником (или как он там правильно называется в Tizen) субтитры в ASS/SSA формате в составе контейнера отображаются также некорректно. Выбрать внешние файлы субтитров - вообще не помню чтобы была такая возможность.
alexeynl commented 6 months ago

По поводу setExternalSubtitlePath похоже отбой. Нашел в документации к MSX пояснение, что функция понимает только текстовый формат субтитров (srt), что в принципе логично:

Note: Subtitle files should be specified in the SubRip Text (SRT) format.

image

yumata commented 6 months ago
  1. Не понятно зачем это сделано. Возможно это костыль

Так и есть, раньше было только vtt и str, но кто-то решил добавить еще другие форматы, чтобы хоть текст отображало.

2. Добавить в него библиотеки по рендерингу ASS/SSA субтитров.

Ну это понятное дело, но как я говорил, я понятие не имею, как с проекта получить готовый файл для подключения к лампе.

yumata commented 6 months ago

Опа, открыл демо версию и в исходниках нашел файл https://libass.github.io/JavascriptSubtitlesOctopus/assets/js/subtitles-octopus.js

yumata commented 6 months ago

И похоже я еще нашел экстрактор субтитров с mkv, https://github.com/mathiasvr/matroska-subtitles/blob/master/examples/web/index.html

Попробую потом поиграться.

yumata commented 6 months ago

Глупый вопрос, но где мне найти файл с субтитрами .ssa или .ass? Понимаю что в раздачах, но не везде же они есть.

yumata commented 6 months ago

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

alexeynl commented 6 months ago

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

Я так понимаю речь об ASS/SSA субтитрах в составе контейнера mkv. Сталкивался пару раз с упоминанием об этом. Но! Как же тогда VLC или MX Player читают такие субтитры в Лампе на Android'e? Я пробовал - субтитры в таких раздачах рендерятся данными плеерами с форматированием.

Получилось зарендерить ASS/SSA хотя бы в раздачах где они идут внешними файлами?

yumata commented 6 months ago

Я так понимаю речь об ASS/SSA субтитрах в составе контейнера mkv. Сталкивался пару раз с упоминанием об этом. Но! Как же тогда VLC или MX Player читают такие субтитры в Лампе на Android'e? Я пробовал - субтитры в таких раздачах рендерятся данными плеерами с форматированием.

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

yumata commented 6 months ago

Получилось зарендерить ASS/SSA хотя бы в раздачах где они идут внешними файлами?

Я пока проверял чтение сабов с файла.

alexeynl commented 6 months ago

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

Тогда в чем проблема? Скрипт не может передавать в рендерер субтитров считанные порции субтитров?

yumata commented 6 months ago

Тогда в чем проблема?

В том, что придется ждать когда загрузится файл, и параллельно плеер тоже будет грузить файл, два потока получается. Все это подходит, ждать когда загрузится весь файл с 20-50 гигами - это жесть)) Плееры они считывают файл во время воспроизведения, а так как в лампе нет своего плеера, то я не могу подключится к плеере и так-же считывать как они.

alexeynl commented 6 months ago

В том, что придется ждать когда загрузится файл, и параллельно плеер тоже будет грузить файл, два потока получается. Все это подходит, ждать когда загрузится весь файл с 20-50 гигами - это жесть)) Плееры они считывают файл во время воспроизведения, а так как в лампе нет своего плеера, то я не могу подключится к плеере и так-же считывать как они.

Зачем качать файл полностью (я так понимаю речь об mkv контейнере), да еще и два потока? Скачали порцию mkv-> извлекли из нее субтитры -> передали на вход рендерера -> рендерер наложи на видео поток. Скорее всего так это и работает в VLC и MX Player.

Скорее всего это также работает в mkv-player. Я же скидывал ссылку на него. Там все происходит мгновенно. Даже с учетом того, что файл обрабатывается локально, если бы это работало как вы описали, не было бы такой скорости.

yumata commented 6 months ago

Скорее всего это также работает в mkv-player.

Нет, там работает через файл, браузер копирует файл и создает виртуальную ссылку на него, а плеер считывает как blob: другими словами из память напрямую.

Зачем качать файл полностью (я так понимаю речь об mkv контейнере), да еще и два потока?

Ну скрипт качает его полностью, я в считывание и создание стримов не алё)) Поэтому если я ему скормлю видео с раздачи, он начнет качать полностью, при этом выбит ошибку, с раздачей чет не работает он))

alexeynl commented 6 months ago

Рендерить внешние субтитры тоже не получается?

yumata commented 6 months ago

Рендерить внешние субтитры тоже не получается?

Ну с этим вроде не должно быть проблем, позже гляну.