HLS support

snark13

Member
День добрый

Есть несколько вопросов (и предложений) по HLS стримам.

У нас настало время апргрейда версии (использовался билд 972, сейчас пробуем самые актуальные).
Обнаружили одну из проблем -
Раньше сразу по запросу {streamname}/{streamname}.m3u8 возвращался плейлист со списком TS сегментов, сейчас возвращается мастерплейлист с сылками на плейлисты уже разных уровней кодирования (если включен ABR). Но у нас нет необходимости в ABR - нам нужен HLS только одного уровня без перекодирования AS IS. Но и в этом случае
Code:
hls_ll_enabled=false
ll_hls_fragmented_mp4=false
hls_new_http_stack=true
hls_abr_enabled=false
мы получаем мастер плейлист с сылками на один плейлист.

Проблема в том что перед WCS у нас стоит NGINX на котором стоит модуль аутентификации который проверяет параметр authkey в query и только с корректным authkey разрешается дальше проброс к WCS (проброс идет со всеми query оригинального запроса). Но в возвращаемом мастер плейлисте находится ссылка на плейлист с сегментами и в этом url уже query от оригинального запроса нету и запрос клиента к этому (второму плейлисту) уже режется на стороне NGINX.
Вопрос - можно ли сделать одну из опций -
или сделать опционально возможным старый формат плейлиста HLS (без отдельного мастер плейлиста)
или в URL к последующим плейлистам добавлять query от запроса к мастер плейлисту (к сегментам можно так же добавлять а можно и не добавлять) ?

сейчас как временное решение помогает добавление такого параметра в конфиг файл -
Code:
client_acl_property_name=authkey
в этом случае параметр authkey из запроса к мастер плейлисту передается дальше -
запрос к
/PCamCR0001H/PCamCR0001H.m3u8?authkey=JWToken
в плейлисте получаю
Code:
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=1110017,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x960,FRAME-RATE=26.0
av_PCamCR0001H_o/av_PCamCR0001H_o.m3u8?sessionId=7&authkey=JWToken
но таким образом можно передать только один параметр из запроса, а иногда надо что бы передавалось много.

Второй вопрос -
формат плейлиста с сегментами -
сейчас я получаю такой плейлист -

Code:
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-SERVER-CONTROL:CAN-SKIP-UNTIL=12.0,HOLD-BACK=6.0
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:13574
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:30.881Z
#EXTINF:1.0,
av_PCamCR0001H_o13574.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:31.881Z
#EXTINF:1.0,
av_PCamCR0001H_o13575.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:32.881Z
#EXTINF:1.0,
av_PCamCR0001H_o13576.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:33.881Z
#EXTINF:1.007,
av_PCamCR0001H_o13577.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:34.888Z
#EXTINF:1.0,
av_PCamCR0001H_o13578.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:35.888Z
#EXTINF:1.0,
av_PCamCR0001H_o13579.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:36.888Z
#EXTINF:1.0,
av_PCamCR0001H_o13580.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:37.888Z
#EXTINF:1.0,
av_PCamCR0001H_o13581.ts?sessionId=7
#EXT-X-PROGRAM-DATE-TIME:2148-07-04T05:35:38.888Z
#EXTINF:1.981,
av_PCamCR0001H_o13582.ts?sessionId=7
1) непонятно откуда берется EXT-X-PROGRAM-DATE-TIME - можно как-то через конфиг указать что бы он не добавлялся в плейлист ?
2) стрим идет с ключевыми кадрами каждую секунду, в конфиге прописано
Code:
hls_time_min=2000
hls_time=2
то есть я хочу что бы сегменты были по 2 секунды, но WCS режет стрим на сегменты по одной секунде (в 972 билде сегменты были именно той длины как я указывал - 2 секунды).

p.s. Полная секция конфига для HLS -

Code:
hls_discontinuity_enabled=false
hls_enable_session_debug=false
hls_hold_segments_before_delete=true
hls_hold_segments_size=120
hls_list_size=8
hls_time_min=2000
hls_time=2
hls_auto_start=true
hls_player_width=0
hls_player_height=0
hls_ll_enabled=false
ll_hls_fragmented_mp4=false
hls_new_http_stack=true
hls_abr_enabled=false
client_acl_property_name=authkey
Спасибо.
 

Max

Administrator
Staff member
Добрый день.
но таким образом можно передать только один параметр из запроса, а иногда надо что бы передавалось много.
В настоящее время проброс параметров не поддерживается. Создали тикет по добавлению этого функционала WCS-4105. О продвижении сообщим.
1) непонятно откуда берется EXT-X-PROGRAM-DATE-TIME - можно как-то через конфиг указать что бы он не добавлялся в плейлист ?
Этот тэг нужен по стандарту в случае, если HLS стрим разделен на дорожки в контейнере m4s или содержит текстовые дорожки вроде субтитров. Его присуствие при использовании контейнера ts никак не должно влиять на проигрывание. Поясните, пожалуйста, к каким именно проблемам приводит наличие этого тэга?
то есть я хочу что бы сегменты были по 2 секунды, но WCS режет стрим на сегменты по одной секунде
Да, нарезка осуществляется по заданному размеру сегмента или по ключевым кадрам. В идеале интервал ключевых кадров должен соответствовать размеру сегмента. В данном случае, если речь о публикации WebRTC или захвате RTSP, лучше выставить настройку
Code:
periodic_fir_request=true
periodic_fir_request_interval=2000
При публикации RTMP следует указать интервал 2 с в настройках OBS или другого RTMP кодировщика.
 

snark13

Member
Этот тэг нужен по стандарту в случае, если HLS стрим разделен на дорожки в контейнере m4s или содержит текстовые дорожки вроде субтитров. Его присуствие при использовании контейнера ts никак не должно влиять на проигрывание. Поясните, пожалуйста, к каким именно проблемам приводит наличие этого тэга?
Вроде проблем нету, просто непонятно откуда берется 2148 год в EXT-X-PROGRAM-DATE-TIME (возможно что-то из оригинального RTSP потока, но вроде там ничего такого нет)... ненормальная дата режет глаза.

по размеру сегмента завтра попробую, за открытие тикета по пробросу параметров - спасибо.
 

Max

Administrator
Staff member
ненормальная дата режет глаза
Значение берется по меткам времени из видеопотока, так что год может быть любой. Например, у RTMP потока метки времени всегда начинаются с нуля при публикации. В данном случае такая метка приходит от RTSP источника.
 

snark13

Member
Значение берется по меткам времени из видеопотока, так что год может быть любой. Например, у RTMP потока метки времени всегда начинаются с нуля при публикации. В данном случае такая метка приходит от RTSP источника.
Тогда возможно имело бы смысл в случае некорректных timestamp-ов и использовании TS контейнера (а не fMP4) не писать EXT-X-PROGRAM-DATE-TIME в плейлист (хотя это как я указал - на работоспособность не влияет)

По поводу размера сегментов -
Сегмент не должен резаться по каждому ключевому фрейму, в сегменте могут быть несколько ключевых фреймов
Если поток кодируется с частотой - каждую секунду ключевой фрейм, то сегмент может быть не только 1 секунду размером но и 2 и 3 и 10.
добавление параметров
Code:
periodic_fir_request=true
periodic_fir_request_interval=2000
не помогло

Попробовал поставить размер сегмента в 10 секунд -

Code:
hls_time_min=10000
hls_time=10
periodic_fir_request=true
periodic_fir_request_interval=10000
Все равно получаю плейлист с сегментами размером в 1 секунду -

Code:
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-SERVER-CONTROL:CAN-SKIP-UNTIL=12.0,HOLD-BACK=6.0
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:52:58.79Z
#EXTINF:1.046,
av_DTempCam03L_o0.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:52:59.836Z
#EXTINF:1.0,
av_DTempCam03L_o1.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:00.836Z
#EXTINF:1.0,
av_DTempCam03L_o2.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:01.836Z
#EXTINF:1.039,
av_DTempCam03L_o3.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:02.875Z
#EXTINF:1.0,
av_DTempCam03L_o4.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:03.875Z
#EXTINF:1.01,
av_DTempCam03L_o5.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:04.885Z
#EXTINF:1.99,
av_DTempCam03L_o6.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:06.875Z
#EXTINF:1.031,
av_DTempCam03L_o7.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:07.906Z
#EXTINF:1.0,
av_DTempCam03L_o8.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:08.906Z
#EXTINF:1.01,
av_DTempCam03L_o9.ts?sessionId=2
#EXT-X-PROGRAM-DATE-TIME:2148-07-07T18:53:09.916Z
#EXTINF:1.99,
av_DTempCam03L_o10.ts?sessionId=2
Это баг.
Вот полный конфиг файл (реальный IP частично скрыт)

Code:
# Config flashphoner.properties
# To get more settings:
# ssh -p 2001 admin@localhost
# default password: admin
# show node-settings
# show node-settings | grep port

#server ip
ip                     =....173.21
ip_local               =10.157.0.7

#webrtc ports range
port_from              =30000
port_to                =31000
media_port_from        =31001
media_port_to          =32000
waiting_answer         =60
user_agent             =Flashphoner/1.0
video_enabled          =true
domain                 =
outbound_proxy         =
outbound_port          =
log_level              =2
enable_context_logs    =false
# rtp_activity_detecting =true,60
rtp_activity_detecting =true,20

client_timeout              =3600000
rtsp_activity_timer_timeout =7200000
session_idle_timeout        =600000

#codecs
codecs                   =opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,flv,mpv
codecs_exclude_sip       =mpeg4-generic,flv,mpv
codecs_exclude_streaming =flv,telephone-event
codecs_exclude_sip_rtmp  =opus,g729,g722,mpeg4-generic,vp8,mpv

#websocket ports
ws.port                 =8080
wss.port                =8443

record_rotation=30
record_h264_to_ts=true
stream_record_policy_template={streamName}-{startTimeMillis}-{endTimeMillis}
record_rotation_index_enabled=false

rest_access_control_allow_origin=*
rest_access_control_allow_headers=content-type,x-requested-with
rest_access_control_allow_methods=POST

webrtc_aes_crypto_provider=JCE

rtsp_fail_on_error_track=true

hls_ll_enabled=false
hls_new_http_stack=true
hls_auto_start=true
hls_preloader_enabled=false
hls_player_width=0
hls_player_height=0
hls_discontinuity_enabled=false
hls_enable_session_debug=false
hls_hold_segments_before_delete=true
hls_hold_segments_size=120
hls_list_size=8
hls_time_min=10000
hls_time=10
ll_hls_fragmented_mp4=false
hls_new_http_stack=true
hls_abr_enabled=false
client_acl_property_name=authkey
periodic_fir_request=true
periodic_fir_request_interval=10000


audio_incoming_buffer_size=100
video_incoming_buffer_size=100

http_enable_paths=rest,action,admin,shared,client,client_records,embed_player,empty,health-check

opus.encoder.bitrate=48000

turn_ip                     =....173.21
turn_ip_local               =10.157.0.7
turn_port                   =3478
turn_password=***
turn_media_port_from=36001
turn_media_port_to=36999
turn_media_ports_auditor_interval=5000
turn_media_ports_auditor_max_attempts=3
turn.server_channel_receive_buffer_size=1048576
turn.server_channel_send_buffer_size=1048576
 
Last edited:

Max

Administrator
Staff member
Здравствуйте.

Попробуйте добавить настройку. Должна решить вопрос с минимальным временем сегмента.
ll_hls_keep_min_segment_duration=true

Мы со своей стороны протестируем и задокументируем, если она работает.
 

snark13

Member
Здравствуйте.

Попробуйте добавить настройку. Должна решить вопрос с минимальным временем сегмента.
ll_hls_keep_min_segment_duration=true

Мы со своей стороны протестируем и задокументируем, если она работает.
Добрый день

Да - эта опция помогла -
Пробегают сегменты почти в три секунды (2.975 и 2.998) которые наверное можно было бы делить и делать сегменты размером в 1.975 и 1.998, но это уже значительно лучше чем было.

Вопрос - можно ли указывать дробное значение длительности сегментов для HLS ? (я бы тогда указал в 1.9 и это меня бы устроило полностью)

Code:
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-SERVER-CONTROL:CAN-SKIP-UNTIL=18.0,HOLD-BACK=9.0
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:92
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXT-X-SKIP:SKIPPED-SEGMENTS=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:41.728Z
#EXTINF:2.0,
av_PCamCR0001H_o95.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:43.728Z
#EXTINF:2.0,
av_PCamCR0001H_o96.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:45.728Z
#EXTINF:2.975,
av_PCamCR0001H_o97.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:48.703Z
#EXTINF:2.0,
av_PCamCR0001H_o98.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:50.703Z
#EXTINF:2.998,
av_PCamCR0001H_o99.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:53.701Z
#EXTINF:2.0,
av_PCamCR0001H_o100.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:55.701Z
#EXTINF:2.0,
av_PCamCR0001H_o101.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:57.701Z
#EXTINF:2.0,
av_PCamCR0001H_o102.ts?sessionId=3
#EXT-X-PROGRAM-DATE-TIME:2148-07-20T11:57:59.701Z
#EXTINF:2.011,
av_PCamCR0001H_o103.ts?sessionId=3
 

Max

Administrator
Staff member
Вопрос - можно ли указывать дробное значение длительности сегментов для HLS ? (я бы тогда указал в 1.9 и это меня бы устроило полностью)
Настройка ll_hls_time_min указывается в миллисекундах, в вашем случае
Code:
ll_hls_time_min=1900
Настройка hls_time_min сейчас не используется.
 
Top