Как создать список плейлистов m3u8 byte-range для HLS?

Apple дает пример поддержки сегментов байтового диапазона в файлах m3u8 для HLS

#EXTM3U
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-VERSION:4
#EXTINF:10.0,
#EXT-X-BYTERANGE:[email protected]
media.ts
#EXTINF:10.0,
#EXT-X-BYTERANGE:[email protected]
media.ts 
#EXTINF:10.0, 
#EXT-X-BYTERANGE:69864
media.ts

Но я не могу понять, как создать такой плейлист для данного файла .ts. Есть ли для этого инструменты?

Ответ 1

Похож на

ffprobe -show_frames media.ts -print_format json

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

Я обновлю этот ответ с помощью script, если мне удастся с этим подходом.

Update:

Вот несколько полезных ссылок, которые я нашел сейчас:

Bash скрипты для создания плейлистов iframe - требуется немного оптимизации, так как он вызывает ffprobe несколько раз

iframe-playlist-generator - проект на python, который можно использовать для создания списков воспроизведения iframe из обычных

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

Проекты на самом деле используют разные методы для поиска размера I-Frame - bash script просто использует то, что ffprobe показывает в pkt_size, а проект python добавляет немного voodoo, вычисляя размер как разность позиций пакетов и добавление 188 для сопоставления списков воспроизведения из apple. 188 байт - это размер пакета mpeg-ts, возможно, так или иначе связанный, однако мне не удалось понять, как это сделать. Это различие в расчете размера заставляет создавать разные плейлисты, возможно, один из них некорректен, но на самом деле VLC играет без проблем, поэтому я буду придерживаться более простого метода, пока он не будет доказан как некорректный.

Обновление 2:

Я создал рубиновый модуль, который может извлекать информацию I-Frame данного файла .ts с помощью ffprobe и строить как я -Frame и обычный byterange м3u8 плейлист (как было запрошено в вопросе) на основе этой информации.

Я нашел простой способ создания списка воспроизведения I-Frame, о котором я упоминал ранее, чтобы быть некорректным, поэтому я использовал метод из iframe-playlist-generator. Результат почти аналогичен плейлисту I-Frame, сгенерированному mediafilesegmenter -output-single-file -file-base output-dir/ input.ts, указанному Duvrai, но иногда есть некоторые промахи размером 188 байтов для случайных кадров, Я не мог понять шаблон, поэтому он в настоящее время игнорируется.

Ответ 2

В качестве опции ffmpeg существует -hls_flags. (https://www.ffmpeg.org/ffmpeg-formats.html)

Следующая команда генерирует одиночный ts файл, который сегментируется функцией диапазона байтов (поддерживается HLS версии 4) в файле индекса m3u8.

$ ffmpeg -i sample.mp3 -hls_time 20 -hls_flags single_file out.m3u8

Ответ 3

Вы можете использовать стандартный сегмент, такой как Apple mediafilesegmenter, проверить длину файлов и затем объединить (с программой cat) в один файл. Из размеров файлов у вас есть вся информация, необходимая для указания диапазонов байтов в файле списка воспроизведения.

Не так приятно, как просто загрузить инструмент из сети, но это не очень сложный алгоритм.

Ответ 4

Unified Streaming также предлагает инструмент, который может сделать это для вас:

mp4split --package-hls output-single-file -o prog_index.m3u8 input.mp4

Это часть их коммерческого потокового пакета (они предлагают бесплатную пробную версию по запросу). Они также предоставляют экземпляр Amazon AWS с почасовой оплатой.