Как создать список воспроизведения 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 с почасовой оплатой.