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

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

#EXTM3U
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-VERSION:4
#EXTINF:10.0,
#EXT-X-BYTERANGE:75232@0
media.ts
#EXTINF:10.0,
#EXT-X-BYTERANGE:82112@752321
media.ts 
#EXTINF:10.0, 
#EXT-X-BYTERANGE:69864
media.ts

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

4 ответов


здесь -hls_flags как опция ffmpeg. (https://www.ffmpeg.org/ffmpeg-formats.html)

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

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

выглядит так:

ffprobe -show_frames media.ts -print_format json

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

я обновлю этот ответ скриптом, если мне удастся с этим подходом.

обновление:

вот несколько полезных ссылок, которые я нашел к настоящему времени:

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

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

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

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

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

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

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


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

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


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

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

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