production конфиг

Ritmius

Member
Добрый день подскажите какие параметры нужны в конфигурации для production только голосовых чатов.
 

Max

Administrator
Staff member
Это проделали , но связь все равно хрипит , запаздывает , пропадает
Если микширование видео для всех потоков не нужно, можно отключить его в настройках сервера
Code:
mixer_video_enabled=false
Это резко снизит транскодинговую нагрузку на сервер.
Также можно публиковать только аудио потоки, чтобы снизить нагрузку на каналы между пользователями и сервером, а для повышения качества аудио увеличить битрейт звука
Code:
session.createStream({
     name: "streamName",
     display: fp-video,
     constraints: {
            video: false,
            audio: {
                   bitrate: 64000
            }
     }
}).publish()
На стороне сервера для повышения качества аудио в выходном потоке микшера нужно указать битрейт кодирования в Opus
Code:
opus.encoder.bitrate=64000
 

Ritmius

Member
битрейт поставили качество стало получше, но задержка в секунду и даже более осталась, как можно убрать задержку
 

Max

Administrator
Staff member
битрейт поставили качество стало получше, но задержка в секунду и даже более осталась, как можно убрать задержку
Задержка может быть обусловлена каналами. Поэтому мы и предлагали отключить публикацию и проигрывание видео, если нужно только аудио. Если вы это сделали, но задержка осталась, уточните, пожалуйста, следующее:
1. Как публикуются потоки (WebRTC, или есть RTMP либо републикация WebRTC как RTMP)?
2. Между чем и чем измерялась задержка: от паблишера до зрителя исходного потока, от паблишера до зрителя потока в микшере?
 

Ritmius

Member
1. отключили, используем sdk android , iPhone
2. оба спикера говорят через mcu микшер задержка 1.5-2 секунды
 

Ritmius

Member
mixer/find_all
[
{
"localMediaSessionId": "f47b2f1d-0ff4-4324-acbf-8fb61c8867fd",
"localStreamName": "c91cdff223a631877bfae1b2488a4b7d",
"uri": "mixer://c91cdff223a631877bfae1b2488a4b7d",
"status": "PROCESSED_LOCAL",
"hasAudio": true,
"hasVideo": false,
"record": false,
"mediaSessions": [],
"mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
"mixerActivityTimerCoolOffPeriod": 1,
"mixerActivityTimerTimeout": -1,
"mixerAppName": "liveroom",
"mixerAudioOpusFloatCoding": false,
"mixerAudioSilenceThreshold": -50.0,
"mixerAudioThreads": 4,
"mixerAutoScaleDesktop": true,
"mixerDebugMode": false,
"mixerDesktopAlign": "TOP",
"mixerDisplayStreamName": false,
"mixerFontSize": 20,
"mixerFontSizeAudioOnly": 40,
"mixerIdleTimeout": 60000,
"mixerInBufferingMs": 200,
"mixerIncomingTimeRateLowerThreshold": 0.95,
"mixerIncomingTimeRateUpperThreshold": 1.05,
"mixerMcuAudio": true,
"mixerMcuVideo": false,
"mixerMcuMultithreadedMix": false,
"mixerMinimalFontSize": 1,
"mixerMcuMultithreadedDelivery": false,
"mixerOutBufferEnabled": false,
"mixerOutBufferInitialSize": 2000,
"mixerOutBufferStartSize": 150,
"mixerOutBufferPollingTime": 100,
"mixerOutBufferMaxBufferingsAllowed": -1,
"mixerShowSeparateAudioFrame": true,
"mixerTextAutoscale": true,
"mixerTextColour": "0xFFFFFF",
"mixerTextBulkWriteWithBuffer": true,
"mixerTextBulkWrite": true,
"mixerTextBackgroundOpacity": 100,
"mixerTextBackgroundColour": "0x2B2A2B",
"mixerTextPaddingLeft": 5,
"mixerVoiceActivitySwitchDelay": 0,
"mixerVoiceActivityFrameThickness": 6,
"mixerVoiceActivityFramePositionInner": false,
"mixerVoiceActivityColour": "0x00CC66",
"mixerVoiceActivity": true,
"mixerVideoWidth": 1280,
"mixerVideoThreads": 4,
"mixerVideoStableFpsThreshold": 15,
"mixerVideoQuality": 24,
"mixerVideoProfileLevel": "42c02a",
"mixerVideoLayoutDesktopKeyWord": "desktop",
"mixerVideoHeight": 720,
"mixerVideoGridLayoutPadding": 30,
"mixerVideoGridLayoutMiddlePadding": 10,
"mixerVideoFps": 30,
"mixerVideoDesktopLayoutPadding": 30,
"mixerVideoDesktopLayoutInlinePadding": 10,
"mixerVideoBufferLength": 1000,
"mixerVideoBitrateKbps": 2000,
"mixerUseSdpState": true,
"mixerType": "NATIVE",
"mixerThreadTimeoutMs": 33,
"mixerTextPaddingTop": 5,
"mixerTextPaddingRight": 4,
"mixerTextFont": "Serif",
"mixerTextPaddingBottom": 5,
"mixerTextDisplayRoom": true,
"mixerTextCutTop": 3,
"mixerRealtime": true,
"mixerPruneStreams": false,
"audioMixerOutputCodec": "opus",
"audioMixerOutputSampleRate": 48000,
"audioMixerMaxDelay": 300,
"mixerAudioOnlyHeight": 360,
"mixerAudioOnlyWidth": 640,
"mixerTextOutsideFramePadding": 50,
"mixerTextOutsideFrame": "NO",
"mixerVideoDesktopFullscreen": false
},
{
"localMediaSessionId": "d2cb332f-1a55-4244-a137-74e957b3f3af",
"localStreamName": "8f37438910e4c709a1947188cfb38a51",
"uri": "mixer://8f37438910e4c709a1947188cfb38a51",
"status": "PROCESSED_LOCAL",
"hasAudio": true,
"hasVideo": false,
"record": false,
"mediaSessions": [
{
"localMediaSessionId": "52331c2a-3e1d-435a-bf46-7d6f7539e40e",
"audioLevel": 100,
"videoMuted": false,
"localStreamName": "DnSvnDbFknHFf8nQw9FwdMCuLjEztB#8f37438910e4c709a1947188cfb38a51"
}
],
"mixerLayoutClass": "com.flashphoner.media.mixer.video.presentation.GridLayout",
"mixerActivityTimerCoolOffPeriod": 1,
"mixerActivityTimerTimeout": -1,
"mixerAppName": "liveroom",
"mixerAudioOpusFloatCoding": false,
"mixerAudioSilenceThreshold": -50.0,
"mixerAudioThreads": 4,
"mixerAutoScaleDesktop": true,
"mixerDebugMode": false,
"mixerDesktopAlign": "TOP",
"mixerDisplayStreamName": false,
"mixerFontSize": 20,
"mixerFontSizeAudioOnly": 40,
"mixerIdleTimeout": 60000,
"mixerInBufferingMs": 200,
"mixerIncomingTimeRateLowerThreshold": 0.95,
"mixerIncomingTimeRateUpperThreshold": 1.05,
"mixerMcuAudio": true,
"mixerMcuVideo": false,
"mixerMcuMultithreadedMix": false,
"mixerMinimalFontSize": 1,
"mixerMcuMultithreadedDelivery": false,
"mixerOutBufferEnabled": false,
"mixerOutBufferInitialSize": 2000,
"mixerOutBufferStartSize": 150,
"mixerOutBufferPollingTime": 100,
"mixerOutBufferMaxBufferingsAllowed": -1,
"mixerShowSeparateAudioFrame": true,
"mixerTextAutoscale": true,
"mixerTextColour": "0xFFFFFF",
"mixerTextBulkWriteWithBuffer": true,
"mixerTextBulkWrite": true,
"mixerTextBackgroundOpacity": 100,
"mixerTextBackgroundColour": "0x2B2A2B",
"mixerTextPaddingLeft": 5,
"mixerVoiceActivitySwitchDelay": 0,
"mixerVoiceActivityFrameThickness": 6,
"mixerVoiceActivityFramePositionInner": false,
"mixerVoiceActivityColour": "0x00CC66",
"mixerVoiceActivity": true,
"mixerVideoWidth": 1280,
"mixerVideoThreads": 4,
"mixerVideoStableFpsThreshold": 15,
"mixerVideoQuality": 24,
"mixerVideoProfileLevel": "42c02a",
"mixerVideoLayoutDesktopKeyWord": "desktop",
"mixerVideoHeight": 720,
"mixerVideoGridLayoutPadding": 30,
"mixerVideoGridLayoutMiddlePadding": 10,
"mixerVideoFps": 30,
"mixerVideoDesktopLayoutPadding": 30,
"mixerVideoDesktopLayoutInlinePadding": 10,
"mixerVideoBufferLength": 1000,
"mixerVideoBitrateKbps": 2000,
"mixerUseSdpState": true,
"mixerType": "NATIVE",
"mixerThreadTimeoutMs": 33,
"mixerTextPaddingTop": 5,
"mixerTextPaddingRight": 4,
"mixerTextFont": "Serif",
"mixerTextPaddingBottom": 5,
"mixerTextDisplayRoom": true,
"mixerTextCutTop": 3,
"mixerRealtime": true,
"mixerPruneStreams": false,
"audioMixerOutputCodec": "opus",
"audioMixerOutputSampleRate": 48000,
"audioMixerMaxDelay": 300,
"mixerAudioOnlyHeight": 360,
"mixerAudioOnlyWidth": 640,
"mixerTextOutsideFramePadding": 50,
"mixerTextOutsideFrame": "NO",
"mixerVideoDesktopFullscreen": false
}
]
 

Ritmius

Member
stream/find_all
[
{
"appKey": "liveroom",
"sessionId": "mixer://8f37438910e4c709a1947188cfb38a51-bdbce622-c497-4c57-b005-97725b207fa3",
"mediaSessionId": "d2cb332f-1a55-4244-a137-74e957b3f3af",
"name": "8f37438910e4c709a1947188cfb38a51",
"published": true,
"hasVideo": false,
"hasAudio": true,
"status": "PUBLISHING",
"sdp": "v=0\r\no=- 1988962254 1988962254 IN IP4 0.0.0.0\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\nm=audio 0 RTP/AVP 111\r\na=rtpmap:111 opus/48000/2\r\na=sendonly\r\n",
"audioCodec": "opus",
"videoCodec": "H264",
"record": true,
"width": 0,
"height": 0,
"bitrate": 0,
"minBitrate": 0,
"maxBitrate": 0,
"quality": 0,
"history": false,
"gop": 0,
"fps": 0,
"audioBitrate": 0,
"codecImpl": "",
"transport": "UDP",
"cvoExtension": false,
"createDate": 1616758971425,
"mediaType": "mixer",
"mediaProvider": "WebRTC"
},
{
"appKey": "liveroom",
"sessionId": "/134.17.27.208:44618/45.89.16.15:8443-7b0d99dc-8cea-474e-b603-f216fae1bd80",
"mediaSessionId": "52331c2a-3e1d-435a-bf46-7d6f7539e40e",
"name": "DnSvnDbFknHFf8nQw9FwdMCuLjEztB#8f37438910e4c709a1947188cfb38a51",
"published": true,
"hasVideo": false,
"hasAudio": true,
"status": "PUBLISHING",
"sdp": "v=0\r\no=- 5811432146222774038 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio\r\na=msid-semantic: WMS ARDAMS-5766a7148d74deadfef49bbde02ec400\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:so9n\r\na=ice-pwd:bODzyTb8gzX/3K88sFIfABVY\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 B7:95:62:27:82:78:79:59:80:08:8B:92:8C:C1:AC:71:98:A0:CA:39:6F:EE:B0:23:C7:F8:D0:07:50:EF:7F:7E\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer...1\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:2589565551 cname:xQTzIOel/yHsud9l\r\na=ssrc:2589565551 msid:ARDAMS-5766a7148d74deadfef49bbde02ec400 ARDAMSa0-5766a7148d74deadfef49bbde02ec400\r\na=ssrc:2589565551 mslabel:ARDAMS-5766a7148d74deadfef49bbde02ec400\r\na=ssrc:2589565551 label:ARDAMSa0-5766a7148d74deadfef49bbde02ec400\r\n",
"audioCodec": "opus",
"record": false,
"width": 0,
"height": 0,
"bitrate": 0,
"minBitrate": 0,
"maxBitrate": 0,
"quality": 0,
"history": false,
"gop": 0,
"fps": 0,
"audioBitrate": 0,
"codecImpl": "",
"transport": "UDP",
"cvoExtension": false,
"createDate": 1616758970779,
"mediaType": "publish",
"mediaProvider": "WebRTC",
"custom": {
"token": "DnSvnDbFknHFf8nQw9FwdMCuLjEztB"
},
"origin": null
},
{
"appKey": "liveroom",
"sessionId": "mixer://8f37438910e4c709a1947188cfb38a51-bdbce622-c497-4c57-b005-97725b207fa3",
"mediaSessionId": "078ced33-f355-46a0-bf38-8b0604edc5f6",
"name": "8f37438910e4c709a1947188cfb38a51-DnSvnDbFknHFf8nQw9FwdMCuLjEztB8f37438910e4c709a1947188cfb38a51",
"published": true,
"hasVideo": false,
"hasAudio": true,
"status": "PUBLISHING",
"sdp": "v=0\r\no=- 1988962254 1988962254 IN IP4 0.0.0.0\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\nm=audio 0 RTP/AVP 111\r\na=rtpmap:111 opus/48000/2\r\na=sendonly\r\n",
"audioCodec": "opus",
"videoCodec": "H264",
"record": false,
"width": 0,
"height": 0,
"bitrate": 0,
"minBitrate": 0,
"maxBitrate": 0,
"quality": 0,
"history": false,
"gop": 0,
"fps": 0,
"audioBitrate": 0,
"codecImpl": "",
"transport": "UDP",
"cvoExtension": false,
"createDate": 1616758971719,
"mediaType": "mixer",
"mediaProvider": "WebRTC"
},
{
"appKey": "liveroom",
"sessionId": "/134.17.27.208:44618/45.89.16.15:8443-7b0d99dc-8cea-474e-b603-f216fae1bd80",
"mediaSessionId": "93e5f297-2cc6-4a93-a29f-74a857f092b8",
"name": "8f37438910e4c709a1947188cfb38a51-DnSvnDbFknHFf8nQw9FwdMCuLjEztB8f37438910e4c709a1947188cfb38a51",
"published": false,
"hasVideo": false,
"hasAudio": true,
"status": "PLAYING",
"sdp": "v=0\r\no=- 8233574296778643507 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio\r\na=msid-semantic: WMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:jlQt\r\na=ice-pwd:Ad1vn+Mo3bKRyRLqFm3uEAaE\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 BE:0C:EC:6D:CE:72:AB:77:C1:0C:FF:8B:29:98:3C:13:CE:17:CF:F5:26:C8:5A:6A:3D:3E:27:44:43:A1:7F:15\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:3 http://www.ietf.org/id/draft-holmer...1\r\na=recvonly\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\n",
"audioCodec": "opus",
"record": false,
"width": 0,
"height": 0,
"bitrate": 0,
"minBitrate": 0,
"maxBitrate": 0,
"quality": 0,
"parentMediaSessionId": "078ced33-f355-46a0-bf38-8b0604edc5f6",
"history": false,
"gop": 0,
"fps": 0,
"audioBitrate": 0,
"codecImpl": "",
"transport": "UDP",
"cvoExtension": true,
"createDate": 1616758971838,
"mediaType": "play",
"mediaProvider": "WebRTC",
"custom": {
"token": "DnSvnDbFknHFf8nQw9FwdMCuLjEztB"
},
"origin": null
}
]
 

Ritmius

Member
что настроить , чтобы получить хорошее качество при разговоре большого количества людей с разным качеством интернета. Есть ли адаптивный битрейт, нужно ли tcp?
 

Max

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

По задержке в 1.5-2 секунды.

Воспроизводится ли задержка при участии двух одинаковых устройств? Например Android и Android.
Или Android и iphone. На каком именно устройстве задержка? Разнесены ли устройства по разным комнатам физически чтобы исключить эхо?

Мы проверим наличие задержки в наших тестах. Попробуем подтвердить.
 

Max

Administrator
Staff member
В случае если нам не удастся воспроизвести задержку на нашем сервере, нам потребуется SSH к вашему чтобы провести тест там.
Доступ можно передать через приватную форму.
 

Max

Administrator
Staff member
К сожалению, доступы не работают
1616990078796.png

Пожалуйста, предоставьте рабочие SSH доступы
 

Max

Administrator
Staff member
Проверили Ваш сервер.
К сожалению, описанные задержки не воспроизводятся в наших тестах на Вашем сервере при публикациях только аудио, либо аудио+видео двух потоков в MCU микшер и проигрывании MCU-потоков микшера. Публикация тестировалась из браузера в браузер (Chrome 89) и между мобильными приложениями (Android и iOS).
Однако в конфигурации есть несколько недочетов:
1. На сервере 125 Гб памяти, при этом под Java heap выделен всего 1 Гб (значение по умолчанию)
1617006351921.png

В любых сценариях микширования этого очень мало, малый объем памяти приводит к частой работе сборщика мусора (GC) и длительным паузам в работе Java машины под нагрузкой. Это может проявляться как фризы видео и задержки и заикания в аудио. Рекомендуем увеличить объем Java heap до 64 Гб в соответствии с документацией
Code:
-Xmx64g
-Xms64g
Также, если необходимо минимизировать задержки при сборке мусора, нужно переключиться на использование ZGC (у Вас уже используется JDK 12). Необходимо учесть, что ZGC дает меньшие паузы, но больше потребляет процессора, поэтому на Вашем сервере при использовании ZGC и микшировании видео одновременно получится запустить около 17 микшеров. Если микшируется только аудио, то микшеров можно будет запустить гораздо больше.
2. В данный момент у Вас максимальное количество одновременных REST hook запросов ограничено 20
1617008548440.png

Верхнюю строку при этом лучше закомментировать, чтобы не путаться. Нужно учесть, что при этом более 20 клиентов одномоментно подключиться не смогут, поскольку каждый клиент обращается к бэкенду при установке соединения с сервером.
3. Если в Вашем случае SIP звонки не используются, лучше избегать явного указания любых настроек, затрагивающих SIP часть, поскольку настройки по умолчанию оптимальны для случая, когда SIP звонки не нужны
1617009087907.png
 
Top