Как включить один и тот же сегмент в плейлист m3u8 несколько раз?

#http-live-streaming #m3u8

#http-прямая трансляция #m3u8

Вопрос:

У меня есть несколько файлов .ts, сгенерированных ffmpeg из прямой трансляции. Все они имеют одинаковую длину (ну, примерно). В идеале, они генерируются постоянно, с именами, представляющими дату и время, когда они были записаны (например, «2019-04-11_10-51-40.ts»). Но может случиться так, что по каким-либо техническим причинам запись на некоторое время была остановлена, и файлы не были сгенерированы.

Теперь у меня есть задача создать плейлист из этих файлов для определенного диапазона дат и времени — и если для части этого диапазона нет файлов, мне нужно показать только черный экран. Для этой цели у меня есть черное видео той же длины, что и другие файлы. Итак, я пытаюсь вручную создать файл .m3u8 и вставить это черное видео во все промежутки между обычными видео, которые у меня есть. Например:

 #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:34
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-51-40.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-52-15.ts
#EXTINF:25.00,
http://example.com/2019-04-11_10-52-48.ts
#EXT-X-ENDLIST
  

Проблема в том, что когда я пытаюсь воспроизвести этот плейлист, он воспроизводится некорректно: в зависимости от проигрывателя воспроизводится либо только одна черная часть, независимо от того, сколько их в последовательности (VLC), либо проигрыватель застревает после первого черного видео («Play HLS M3u8″расширение для Chrome или проигрывателя на нашем собственном сервисе, основанное на hls.js ).

Я также пытался использовать #EXT-X-DISCONTINUITY ; в этом случае воспроизводятся все видео, но индикатор выполнения падает до самого начала после каждого #EXT-X-DISCONTINUITY появления, что также является нежелательным поведением. Пример:

 #EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:34
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:30.07,
http://example.com/black_video.ts
#EXT-X-DISCONTINUITY
#EXTINF:30.07,
http://example.com/black_video.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-51-40.ts
#EXTINF:33.33,
http://example.com/2019-04-11_10-52-15.ts
#EXTINF:25.00,
http://example.com/2019-04-11_10-52-48.ts
#EXT-X-ENDLIST
  

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

На данный момент единственный способ, который я нашел, — это собрать все обычные видео для временного диапазона, заполнить пробелы черными видеофайлами, а затем объединить их в один файл ffmpeg -f concat и разделить объединенный файл обратно на части. Но этот подход работает намного дольше, чем ручное создание файла m3u8, поэтому я бы хотел его избежать.

Итак, в чем может быть причина того, что созданный вручную плейлист работает некорректно, и как я могу это исправить? Может быть, это проблема с самим плейлистом, или плейлист технически исправен, но проигрыватели, которые я использовал, возможно, не полностью реализуют спецификацию?

TLDR: я создаю плейлист m3u8 вручную и хочу вставить одно и то же видео несколько раз в этот плейлист. К сожалению, такой плейлист воспроизводится некорректно: в зависимости от проигрывателя либо это вставленное видео воспроизводится только один раз, независимо от того, сколько раз оно было включено, либо воспроизведение зависает после первой вставленной части видео. Может быть, что-то не так с плейлистом и как это можно исправить?

Ответ №1:

Добавьте тег #EXT-X-DISCONTINUITY до и после файла black_video.ts и измените тег #EXT-X-VERSION на 5. Это должно устранить проблему. Это решение сработало для меня на VLC player.

Комментарии:

1. Спасибо! Для веб-плеера это помогает добавлять метку прерывистости как до, так и после черного видео. Хотя я все еще не могу заставить его работать для VLC, изменение EXT-X-VERSION не помогло. Возможно, это ошибка в моей версии проигрывателя, или я пропустил какую-то настройку. В любом случае, для меня важнее заставить его работать в веб-плеере, поэтому я отмечаю ответ как принятый.

2. Это кажется решением. Спасибо!

3. Возможно ли также объединить сегменты таким образом, чтобы проигрыватель обрабатывал их как одно видео? С тегом EXT-X-DISCONTINUITY проигрыватели, похоже, воспроизводят их как отдельные видео, и, по крайней мере, в VLC иногда вообще не воспроизводятся.