Отсутствует звук в HLS у некоторых стримов

ph03n1x

New Member
Добрый день.
Мы используем CDN (origin,transcoder,edge) и столкнулись со следующей проблемой
Некоторые стримы после transcoder'a по HLS воспроизводятся без звука, по webrtc такой проблемы не наблюдаем и звук у этого же стрима есть.
Если запросить этот стрим до transcoder'a на origin сервере (с включённым HLS сервером), то такой проблемы на origin'e нет

Так же, заметили что подобные стримы (без звука) лагают, резкая смена кадров

В профиле на edge серверах, у нас выставлен

profiles:
-720p:
audio:
codec : opus
rate : 48000
video:
.....

Каких-то ошибок с audio в логах не вижу

В чем может быть проблема?
 

Max

Administrator
Staff member
Добрый день.
Если этот же поток играть на Edge по тому же профилю, но по WebRTC, проблема сохраняется?
Если да, то убедитесь, что:
- хватает производительности CDN узла с ролью Transcoder: проверьте загрузку CPU, количество одновременно транскодируемых потоков
- канала между Transcoder и Edge достаточно для пропуска стрима 720p
Если же при проигрывании по WebRTC проблем нет, проверьте, что на Edge отключен транскодинг HLS:
Code:
hls_player_width=0
hls_player_height=0
Если этих настроек нет на Edge, или указаны какие-то другие значения, то у Вас имеет место излишний транскодинг на Edge, для которого у Edge сервера может не хватать производительности.
Кроме того, для проигрывания по HLS звук транскодируется в AAC 48 кГц. По приведенному профилю, звук также будет транскодироваться на Edge, что дает дополнительную нагрузку на его CPU. Рекомендуем для проигрывания по HLS заказывать транскодинг звука по профилю:
Code:
profiles:
-720p-hls:
  audio:
   codec : mpeg4-generic
   rate : 48000
  video:
  .....
 

ph03n1x

New Member
Если этот же поток играть на Edge по тому же профилю, но по WebRTC, проблема сохраняется?
Нет, по WebRTC на EDGE серверах все хорошо и проблемные стримы по werbrtc воспроизводятся без проблем

- хватает производительности CDN узла с ролью Transcoder: проверьте загрузку CPU, количество одновременно транскодируемых потоков
Загрузка транскодера не более 40%

- канала между Transcoder и Edge достаточно для пропуска стрима 720p
Утилизация сети не более 50%

hls_player_width=0
hls_player_height=0
Это выставлено

Рекомендуем для проигрывания по HLS заказывать транскодинг звука по профилю:
Хорошо, сейчас попробуем
 

Max

Administrator
Staff member
Нет, по WebRTC на EDGE серверах все хорошо и проблемные стримы по werbrtc воспроизводятся без проблем
В таком случае проверьте нагрузку на CPU Edge сервера. Если заказывать транскодинг звука по профилю, то на Edge вообще не должно быть транскодинга, на странице статистики http://localhost:8081/?action=stat в разделе native_resource количество аудио кодеков, видео декодеров и энкодеров должно быть нулевым. Если это не так, значит на Edge работает транскодинг для HLS, и нужно по настройками выяснить, откуда он берется.
 

ph03n1x

New Member
Хм, у edge'a

Code:
native_resources.audio_codecs=124
native_resources.audio_resamplers=62
native_resources.video_transcoders=0
native_resources.video_decoders=4
native_resources.video_encoders=4



Code:
enable_extended_logging = false
client_acl_property_name = aclAuth
ip = __IPADDR__
ip_local   =  __IPADDR__
media_port_from= 10001
media_port_to  = 50000

webrtc_cc_min_bitrate=2000000
webrtc_cc_max_bitrate=3000000
webrtc_sdp_min_bitrate_bps=2000000
webrtc_sdp_max_bitrate_bps=3000000

wcs_activity_timer_timeout=86400000
global_bandwidth_check_enabled=true
webrtc_aes_crypto_provider=JCE
rtp_receive_buffer_size=13107200
rtp_send_buffer_size =13107200
ice_tcp_transport = true
ice_tcp_send_buffer_size=548576
ice_tcp_receive_buffer_size=548576
ice_tcp_channel_high_water_mark=5242880
ice_tcp_channel_low_water_mark=524288
ice_timeout=15
ice_tcp_nio=no

streaming_distributor_subgroup_enabled=true
streaming_distributor_subgroup_size=50
streaming_distributor_subgroup_queue_size=300
streaming_distributor_subgroup_queue_max_waiting_time=5000
streaming_distributor_audio_subgroup_queue_size=300
streaming_distributor_audio_subgroup_queue_max_waiting_time=5000
rtmp_use_stream_params_as_connection=true

codecs = opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,h264,vp8,mpv
compact_media_port_usage = false
rtp_bundle = true
ws.port = 8080
wss.port = 8443
ws.map_custom_headers = true
ws.ip_forward_header = X-Forwarded-For
wcs_agent_ssl = true
rest_hook_secret_key = __SECRET__
rest_hook_send_hash = true
https_server_enabled = true

hls_server_enabled = true
hls.http.port = 8082
hls_min_list_size=2
hls_discontinuity_enabled=true

hls_auto_start = true
hls_player_width=0
hls_player_height=0

rtsp_server_enabled = false
cdn_enabled = true
cdn_ip = __IPADDR__
cdn_role = edge
cdn_nodes_resolve_ip=false
cdn_point_of_entry = __IPADDR__
cdn_groups = EU
cdn_origin_allowed_to_transcode=false
opus_formats=stereo=1

disable_rest_auth = false
disable_streaming_proxy = false
наша edge конфигурация. Подскажите, из-за чего у нас проблема?
 

ph03n1x

New Member
как выяснилось edge сервера здесь не причем.

На транскодерах по метрикам мы видим streams_stats{param="streams_synchronization",instance=~".*"} некоторые стримы, у которых значения -7868866

При этом загрузка сервера не превышает и 40%, в том числе и сети

После рестарта транскодера, некоторое время все стримы работают корректно, но после некоторого времени, audio поток в hls отсутствует

Можем ли мы как-то повлиять на такое поведение?
 

Max

Administrator
Staff member
Подскажите, из-за чего у нас проблема?
Транскодинг звука на Edge скорее всего включается потому, что он по профилю забирает поток с аудио в Opus, а в HLS нарезается AAC, либо публикация идет с моно звуком, а в HLS по умолчанию нарезается стерео. Должен помочь профиль
Code:
profiles:
-720p-hls:
  audio:
   codec : mpeg4-generic
   rate : 48000
   channels: 2
  video:
  .....
Транскодинг видео для HLS по Вашим настройкам включаться не должен, скорее всего, он включается для WebRTC клиентов. Посмотрите здесь возможные причины для включения транскодинга.
На транскодерах по метрикам мы видим streams_stats{param="streams_synchronization",instance=~".*"} некоторые стримы, у которых значения -7868866
Это другая проблема, и связана она, скорее всего, с публикацией потока.
Проверьте метрики тех же потоков на Origin в то же время. Попробуйте также обновить сборку WCS до актуальной, т.к. по проблемам с синхронизацией при публикации из Firefox и Safari были фиксы.
Также может помочь увеличение буфера синхронизации между аудио и видео на Origin:
Code:
audio_incoming_buffer_size=100
video_incoming_buffer_size=100
 

ph03n1x

New Member
Сделали, не помогло.
После рестарта транскодера все стримы идут со звуком, спустя 10-20 минут некоторые стримы имеют метрику
streams_stats{instance="transcoder01", job="flashphoner", name="7684", param="streams_synchronization"}-229882

на origin данная метрика
streams_stats{instance="origin01", job="flashphoner", name="7684", param="streams_synchronization"}-10

Если на edge'e я активирую hls сервер и буду запрашивать стрим минуя отдельный транскодер, то ситуация такая же, некоторое время стрим работает корректно

Есть ли еще какие-то идеи?
 

Max

Administrator
Staff member
Если на Origin стрим заходит нормально, проблема может быть в канале Origin-Transcoder или Origin-Edge. Рекомендуем увеличить буфер синхронизации также на Transcoder и на Edge
Code:
audio_incoming_buffer_size=100
video_incoming_buffer_size=100
Кроме того, если Вы используете TCP как основной транспорт, измените настройку
Code:
ice_tcp_nio=no
на
Code:
ice_tcp_nio=false
Ключевые слова yes/no не поддерживаются для boolean настроек, только true/false
Также уточните, какая сборка WCS используется? Если не последняя, рекомендуем обновить до последней с этой страницы
Уточните способ публикации стрима на Origin: WebRTC, RTMP, захват RTSP потока с камеры?
 

ph03n1x

New Member
Сделали, не помогло.


"Если на Origin стрим заходит нормально, проблема может быть в канале Origin-Transcoder или Origin-Edge "
Минимум 800 мбит/с при нагрузке

"Уточните способ публикации стрима на Origin: WebRTC, RTMP, захват RTSP потока с камеры?"
rtmp


Версия 5.2.1085 запущена в докере на железных серверах

При установке параметра
ice_tcp_nio=false

Стримы начинают сыпаться/фризы
 

Max

Administrator
Staff member
Версия 5.2.1085 запущена в докере на железных серверах
Посмотрите, пожалуйста, эту статью, возможно, чем-то поможет Как использовать Docker для WebRTC в продакшене?
Мы не рекомендуем использовать докер-инстансы под нагрузкой, тем более транскодировать на них что-то. Все известные нам крупные CDN, использующие транскодинг, работают на железных серверах без виртуализации.
 

ph03n1x

New Member
Мы воспользовались вашим советом и перенесли WCS на железные сервера без виртуализации и контейнеризации. К сожалению исходную проблему мы не решили, но появилось несколько вопросов
- на edge серверах мы имеем значения отличное от нуля у native_resources.audio_codecs и native_resources.audio_resamplers с чем это может быть связано? Изначально
Code:
native_resources.audio_codecs=124
native_resources.audio_resamplers=62
native_resources.video_transcoders=0
native_resources.video_decoders=4
native_resources.video_encoders=4
native_resources.video_decoders и native_resources.video_encoders пофиксили убрав из плеера параметры разрешения и битрейт


И еще вопрос, каким образом ограничить входящий (публикуемый) стрим по битрейту (rtmp, webrtc)?
У нас есть стримеры, которые выставляют в OBS очень высокий битрейт, из-за чего у нас видео дергается и аудио отбрасывается.
Если в момент проблемы перезагрузить transcoder, то на некоторое время все нормализуется (1-5 минут). Мы пробовали поднять video_encoder_max_threads до 6, но это не привело к решение проблемы.
 

Max

Administrator
Staff member
- на edge серверах мы имеем значения отличное от нуля у native_resources.audio_codecs и native_resources.audio_resamplers с чем это может быть связано?
Это означает, что есть транскодинг или ресемплинг звука на Edge. Почитайте, пожалуйста, здесь по настройке проброса аудио через CDN. D Вашем случае на HLS edge нужно пробрасывать звук в кодеке AAC (mpeg4-generic).
Также для HLS по умолчанию используется звук со следующими частотами дискретизации и количеством каналов:
Code:
m=audio 0 RTP/AVP 108 102 103
a=rtpmap:108 mpeg4-generic/48000/2
a=rtpmap:102 mpeg4-generic/32000/2
a=rtpmap:103 mpeg4-generic/44100/2
То есть если публикуется одноканальный звук (например, при публикации WebRTC по умолчанию), на HLS edge также будет транскодинг звука.
Рекомендуется весь транскодинг возложить на Transcoder узлы, и забирать аудио для HLS edge по профилю:
Code:
profiles:
-720p-hls:
  audio:
   codec : mpeg4-generic
   rate : 48000
   channels: 2
  video:
  .....
native_resources.video_decoders и native_resources.video_encoders пофиксили убрав из плеера параметры разрешения и битрейт
Да, если в настройках HLS edge указаны ненулевые параметры hls_player_width и hls_player_height, либо не указаны (используются значения по умолчанию, то включится транскодинг.
Рекомендуется весь транскодинг держать на Transcoder узлах. При этом в профиле видео для HLS потоков необходимо указать FPS и GOP:
Code:
profiles:
-720p-hls:
  audio:
   codec : mpeg4-generic
   rate : 48000
   channels: 2
  video:
   width : 1280
   height : 720
   bitrate: 1500
   gop : 90
   fps : 30
   codec : h264
Также рекомендуется развести WebRTC и HLS подписчиков по разным Edge серверам, т.к. в противном случае транскодинг аудио будет на Edge всегда из-за того, что для HLS используется AAC, а для WebRTC - Opus.
И еще вопрос, каким образом ограничить входящий (публикуемый) стрим по битрейту (rtmp, webrtc)?
Для WebRTC публикаций можно ограничить битрейт на стороне клиента или сервера. Следует учесть, что ограничения для браузера являются лишь рекомендацией к исполнению, то есть битрейт может выходить за указанные пределы.
Для RTMP потоков битрейт можно ограничить только настройками клиента (ffmpeg, OBS и т.п.).
У нас есть стримеры, которые выставляют в OBS очень высокий битрейт, из-за чего у нас видео дергается и аудио отбрасывается.
Если в момент проблемы перезагрузить transcoder, то на некоторое время все нормализуется (1-5 минут). Мы пробовали поднять video_encoder_max_threads до 6, но это не привело к решение проблемы.
Почитайте здесь рекомендации по тюнингу Transcoder узлов в условиях больших нагрузок. При этом сами по себе транскодеры должны быть мощными и, крайне желательно, физическими серверами. Обратите внимание, что количество CPU ядер (физических, не гипертрединговых) должно рассчитываться, исходя из следующих ограничений: 1 ядро для кодирования 2 720p потоков или 3 480p потоков, 2 ядра для кодирования 1 1080p потока, плюс запас в два ядра CPU. Гипертрединг на Transcoder узлах желательно отключать. Кроме уже упомянутого тюнинга, необходимо настроить ZGC для управления памятью Java машины.
 
Top