Восстановление качества потока

inpost

Member
Здравствуйте.
Для потока я указал 1000kbps битрейт. Большинство трансляций идут хорошо, но бывают изредка случаи подобных скачков пинга у некоторых клиентов с нестабильным потоком:


В этот момент начинает опускаться поток. Начало такое:

Далее происходит скачок пинга и картинка навсегда портится:


Можно ли как-то сделать, чтобы после восстановления стабильного соединения стрим возвращался в 1000битрейт? Чтобы скачки пинга влияли лишь на FPS и после восстановления - устанавливался обратно стабильный?

Хочу заметить, что скачки такие случаются через 1 раз в 30-60 секунд, то есть если пропускать 1 секунду, другие 29 или 59 потом идёт стабильный.

Сделать формата, если не может стабильно пропускать кадры - режет пропущенные и продолжает транслировать нормально.

Я не знаю, возможно ли такое в целом через настройки сделать или как?
 
"Деревянная" идея - отбрасывать руками UDP-кандидаты и стримить по TCP?
Задержка и потребление проца в среднем подрастут, но эта проблема должна по идее решиться.
Конечно, создателям продукта виднее - это так, мысли с задней парты.
 

inpost

Member
Резать не обязательно, дослать недостающее и восстановить качество.
 

Max

Administrator
Staff member
Добрый день.
С H.264 кодеком на Windows есть такая проблема. Битрейт может долго восстанавливаться.
Попробуйте переключиться на кодек VP8. Битрейт должен восстанавливаться быстро и проблема должна уйти.
В настройке codecs=
в файле WCS_HOME/conf/flashphoner.properties нужно поменять местами h264 и vp8.
Пример:
Code:
codecs=opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,vp8,h264,flv,mpv
Побочные эффекты:
Если стрим будут играть через RTMP или через WebRTC в iOS и Mac OS, включится транскодинг, который утилизирует CPU.

Анализ на основе пингов не информативен. Увеличение пингов лишь косвенно указывает что с сетью что-то было не так.
Если есть возможность, откройте вкладку Chrome и запустите chrome://webrtc-internals
В атаче пример графиков:
1) bweforvideo
2) ssrc video
Проблема с кодеком H.264 чаще всего в том, что падает битрейт и больше не поднимается.
Как вариант, можете проставить минимальный битрейт на стороне сервера
Code:
webrtc_cc_min_bitrate = 500000
Code:
webrtc_cc_max_bitrate = 15000000
в WCS_HOME/conf/flashphoner.properties
Эта настройка влияет на планку, которая показана в первом графике bweforvideo.
При этом браузер может спускаться ниже указанных настроек. Указанные настройки лишь говорят серверу не зажимать битрейт ниже указанных значений.
 

Attachments

inpost

Member
Здравствуйте.
webrtc_cc_min_bitrate = 500000
webrtc_cc_max_bitrate = 15000000
Очень помогли, качество не падало.
Но решился я обновить flashphoner до последней версии, сейчас поставилась : v. 0.5.28.2747 - 5.1.3584-b471586d70c6fb41523a01fcc0799a9defe18c60

И перестали работать. Вот о чём я:


Скажите, пожалуйста, эти настройки отключены? Или их как-то иначе можно включить? Или, может, это баг и они должны работать, просто в этой сборке проблемы?
 

Max

Administrator
Staff member
Добрый день.

Выглядит действительно как проблема с падающим битрейтом, но у нас на примере не воспроизводится.
Обновлили демку до версии 3584.
https://demo.flashphoner.com/client...dia_devices_manager/media_device_manager.html
Проверьте с нашим демо-примером. Нужно выбрать камеру и нажать Start со стандартными настройками.
При тестрировании, откройте в новой вкладке chrome://webrtc-internals
Там должны быть графики битрейта. См. вложение.

1. На первом отмеченном графике красной полосой (2.5Mbps) отмечен текущий ограничитель битрейта со стороны WCS-сервера.
Когда видеопоток идет в разнос (джиттер, запаздывание фреймов), WCS сервер посылает браузеру REMB сообщения о понижении битрейта.
Результат работы Bitrate Estimator должно быть видно на этом графике.
Если у вас выставлена настройка webrtc_cc_min_bitrate=500000, WCS сервер не должен высылать REMB-сообщения, которые снижают битрейт ниже заданной планки.
Т.е. красная линия должна всегда оставаться выше 500k.

2. На втором графике актуальный, действительный битрейт.
Если он падает до сверхнизких значений 50k-100k, это означает что:
а) Плохо с сетью.
Проверить сеть, убедиться что все в порядке.
Иногда Wifi может совместно с железом (мобильное устройство) давать такие потери.
б) Плохо с камерой / драйверами / CPU, компьютером
в) Плохо с аппаратным ускорением H.264 в Chrome
Обновиться до последней версии. Попробовать выключить аппаратное ускорение.
Попробовать переключиться на VP8.
г) Плохо WCS-серверу.
Убедитесь что на сервере достаточно памяти и CPU.
Убедитесь что в логе WCS_HOME/logs/gc_core.log нет частых сообщений "Full GC".

Сравните ваши потоки с нашим демо сервером.
Покажите конфиг flashphoner.properties

Есть еще один способ жестко указать битрейт для Chrome.
Ссылка на документацию
 

Attachments

inpost

Member
Дело в том, что у меня нет доступа к тем камерам, такое происходит у некоторых пользователей в чате.
Старый вариант работал так, что картинка была чёткой, а вот фпс падал. Это было хорошим решением, ровно то, что и хочется достичь вновь. Сейчас в новой версии качество низкое, но фпс достаточно высокий у этих пользователей.
Вот о чём я говорю, 2 видео-ролика с демонстрацией сейчас камер, что имеем от разных пользователей, доступа к которым не имеем:
https://monosnap.com/file/YF0Xc4mou9RJQNGmdOlLz0Y6gmLdPm
https://monosnap.com/file/Wu0b2Zd8AM09BGVk2TvIedkyg9bPmv

Вот что в логах пишут gc_core.log: Эта запись присутствует, но Админ пишет, что "свободно 40 гиг памяти и 10 ядре сейчас".

Code:
2018-10-10T15:54:23.116-0400: 5388.981: [GC (Allocation Failure)  316819K->230139K(818688K), 0.0340669 secs]
2018-10-10T15:55:05.478-0400: 5431.343: [GC (Allocation Failure)  326395K->228378K(832512K), 0.0123641 secs]
2018-10-10T15:55:18.046-0400: 5443.911: [GC (Allocation Failure)  324122K->237864K(834048K), 0.0677015 secs]
2018-10-10T15:55:27.382-0400: 5453.247: [GC (Allocation Failure)  333096K->245579K(831488K), 0.0581413 secs]
2018-10-10T15:55:47.155-0400: 5473.020: [GC (Allocation Failure)  337227K->235418K(817664K), 0.0360517 secs]
2018-10-10T15:56:20.122-0400: 5505.987: [GC (Allocation Failure)  326552K->235472K(830976K), 0.0453723 secs]
2018-10-10T15:56:55.649-0400: 5541.514: [GC (Allocation Failure)  326096K->228024K(808448K), 0.0465683 secs]
2018-10-10T15:57:10.182-0400: 5556.047: [GC (Allocation Failure)  318136K->238450K(829952K), 0.0820457 secs]
2018-10-10T15:57:39.434-0400: 5585.299: [GC (Allocation Failure)  328050K->241951K(816640K), 0.1498329 secs]
2018-10-10T15:58:16.669-0400: 5622.534: [GC (Allocation Failure)  331039K->241336K(826880K), 0.0651032 secs]
2018-10-10T15:58:50.260-0400: 5656.125: [GC (Allocation Failure)  329912K->240061K(813056K), 0.0407267 secs]
2018-10-10T15:59:27.321-0400: 5693.186: [GC (Allocation Failure)  328637K->241256K(824832K), 0.0721055 secs]
2018-10-10T16:00:01.550-0400: 5727.415: [GC (Allocation Failure)  329832K->242984K(825856K), 0.0237724 secs]
2018-10-10T16:00:12.710-0400: 5738.575: [GC (Allocation Failure)  331552K->262390K(819200K), 0.0362373 secs]
2018-10-10T16:00:24.134-0400: 5749.999: [GC (Allocation Failure)  344310K->268559K(825856K), 0.1010878 secs]
И вот конфиг:
Code:
#Config
# ip                                - External IP-address of server where Flashphoner installed (xxx.xxx.xxx.xxx)
# ip_local                          - Local IP-address of server where Flashphoner installed (xxx.xxx.xxx.xxx)
# port_from                         - Begin of range of ports for SIP signaling (integer)
# port_to                           - End of range of ports for SIP signaling (integer)
# media_port_from                   - Begin of range of ports for media-traffic (integer)
# media_port_to                     - End of range of ports for media-traffic (integer)
# waiting_answer                    - How many time will Flashphoner client wait for answer from other side (seconds, integer)
# serial_number                     - Flashponer license. You can get it here - http://flashphoner.com/license
# user_agent                        - SIP User Agent header, example: Flashphoner/1.0 [Default: Flashphoner/1.0]
# balance_header                    - SIP header name for balance info [Default: balance]
# cost_header                       - SIP header name for cost info [Default: cost]
# video_enabled                     - Enabling of video support (true/false)
# domain                            - Domain address of voip server (xxx.xxx.xxx.xxx)
# outbound_proxy                    - Outbound proxy (xxx.xxx.xxx.xxx)
# outbound_port                     - Port for outbound proxy
# dtmf                              - Dual-Tone Multi-Frequency. Values: rfc2833, info
# log_level                         - Level of logging (1-10)
# enable_context_logs               - Context logs with login,port and sip call id
# rtp_activity_detecting            - Hangup, if incomming audio stream is empty few seconds. Format:(true/false),seconds. Example:true,5
# force_h264_to_sorenson            - Transcoding incoming stream from H264 to Sorenson Park
# force_h264_to_h264                - Transcoding incoming stream from H264 to H264 (frame without slices)
# h264_max_nalu_size                - Max NALU size for H264
# codecs                            - List of supported codecs, ordered by priority. Example: alaw, ulaw, g729, speex16, h263
# codecs_exclude_sip                - List of codecs that should be excluded in sip call
# codecs_exclude_streaming          - List of codecs that should be excluded in streaming
# codecs_exclude_sip_rtmp           - List of codecs that should be excluded in sip as rtmp
# sip_msg_listener                  - Class, defined by developer. The class must implement interface ISipMessageListener. Example: com.flashphoner.sdk.sip.ChangeCallIdListener
# priority_outside_codecs           - Priority of outside codecs
# remove_ssrc_attr                  - Remove ssrc attribute from local sdp
# max_callid_length                 - Max call id length (min 4; max 32)
# use_tcp_for_long_sip_messages     - Use TCP transport for messages with big size
# enable_candidate_harvester        - Enable stun candidate hasvester
# save_client_logs                  - Save client logs after disconnect
# enable_extended_logging           - Save user logs in individual folder, true is default value
# record                            - Folder for record audio from calls. If empty then recording will be disabled
# record_filename_template          - Template for file name of record. Default: {id}-{date}
# preserve_non_mixed_recorded_files - Preserve non mixed recorded files. Default: false
# recording_by_user                 - Recording media by user side. Default: false

ip                     =192.99.67.31
ip_local               =192.99.67.31
port_from              =30000
port_to                =31000
media_port_from        =31001
media_port_to          =32000
waiting_answer         =60
user_agent             =Flashphoner/1.0
balance_header         =balance
cost_header            =cost
video_enabled          =true
domain                 =
outbound_proxy         =
outbound_port          =
log_level              =5
suppress_audio         =true
enable_context_logs    =false
rtp_activity_detecting =true,60
sip_msg_listener       =com.flashphoner.sdk.sip.ChangeCallIdListener
call_record_listener   =com.flashphoner.server.client.DefaultCallRecordListener
dtmf                     =rfc2833
auto_login_url         =/usr/local/FlashphonerWebCallServer/conf/account.xml
get_callee_url         =/usr/local/FlashphonerWebCallServer/conf/callee.xml
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
on_record_hook_script  =on_record_hook.sh
rtmp_transponder_stream_name_prefix =rtmp_
webrtc_cc_min_bitrate = 500000
webrtc_cc_max_bitrate = 15000000
 

Max

Administrator
Staff member
Попробуйте запустить отладку одного из таких потоков
Документация

Нужно выполнить REST запрос, пример которого есть в документации и тем самым поставить поток на отладку.
В результате в папку WCS_HOME/logs/client_logs/...
Запишутся подробные логи стрима данного конкретного пользователя.

sessionId можно найти с помощью REST запроса /rest-api/stream/find {"name":"steram1"}
Здесь stream1 - имя стрима, по которому ищем поток и его sessionId

Логи просьба выслать на support@flashphoner.com
с указанием ссылки на форум

Можете также прислать доступ в админку сервера и ssh.
Можем потестировать потоки с вашим сервером и посмотреть будут ли потери битрейта.
 

Max

Administrator
Staff member
Можно также переключиться на VP8. На этом кодеке битрейт падает редко.
Но в этом случае будет транскодинг на iOS плеерах, где есть только H.264.

Для включения VP8 нужно поменять местами кодеки h264 и vp8 в настройке codecs=
 

Max

Administrator
Staff member
Добрый день.
Посмотрите пожалуйста рекомендацию здесь.
Это должно улучшить качество.
 
Top