...
Code Block | ||
---|---|---|
| ||
rtp_activity_video=false |
Если браузер Chrome публикует пустое видео при занятой веб-камере
Некоторые версии браузера Chrome не возвращают ошибку в случае, если веб-камера занята другим процессом, а публикуют поток с пустым видео (черный экран). Остановить публикацию в этом случае можно двумя способами: при помощи JavaScript и HTML5 на клиенте, или при помощи настройки на сервере.
Остановка публикации потока на стороне клиента
Видеодорожка, созданная браузером Chrome для занятой камеры, останавливается в пределах первой секунды публикации, затем поток публикуется уже без видео. При этом состояние видеодорожки (переменная readyState
) меняется на ended
, и генерируется соответствующее событие onended
, которое может быть перехвачено веб-приложением. Для того, чтобы использовать это событие:
1. Добавляем в скрипт веб-приложения функцию регистрации обработчика события onended, в котором завершаем публикацию при помощи stream.stop()
...
language | js |
---|---|
theme | RDark |
...
Контроль наличия медиа трафика работает только при публикации, но не при проигрывании потоков.
Отключение контроля активности видео и аудио дорожек по имени потока
В сборке 5.2.1784 добавлена возможность отключить контроль активности видео и аудио дорожек в потоках, имя которых совпадает с регулярным выражением
Code Block | ||
---|---|---|
| ||
rtp_activity_audio_exclude=stream1
rtp_activity_video_exclude=stream1 |
Это может быть полезно для потоков, трафик в которых может останавливаться на длительное время, например, для потоков с экрана или окна приложения:
Code Block | ||
---|---|---|
| ||
rtp_activity_audio_exclude=.*-screen$
rtp_activity_video_exclude=.*-screen$ |
В данном случае контроль активности не будет применяться к потокам с именами conference-123-user-456-screen
Если браузер Chrome публикует пустое видео при занятой веб-камере
Некоторые версии браузера Chrome не возвращают ошибку в случае, если веб-камера занята другим процессом, а публикуют поток с пустым видео (черный экран). Остановить публикацию в этом случае можно двумя способами: при помощи JavaScript и HTML5 на клиенте, или при помощи настройки на сервере.
Остановка публикации потока на стороне клиента
Видеодорожка, созданная браузером Chrome для занятой камеры, останавливается в пределах первой секунды публикации, затем поток публикуется уже без видео. При этом состояние видеодорожки (переменная readyState
) меняется на ended
, и генерируется соответствующее событие onended
, которое может быть перехвачено веб-приложением. Для того, чтобы использовать это событие:
1. Добавляем в скрипт веб-приложения функцию регистрации обработчика события onended, в котором завершаем публикацию при помощи stream.stop()
Code Block | ||||
---|---|---|---|---|
| ||||
function addVideoTrackEndedListener(localVideo, stream) { var videoTrack console.error("Video source error. Disconnect..."= extractVideoTrack(localVideo); if (videoTrack && videoTrack.readyState == 'ended') { streamconsole.stop(error("Video source error. Disconnect..."); }stream.stop(); } } |
2. Добавляем функцию удаления обработчика события при завершении публикации
Code Block | ||||
---|---|---|---|---|
| ||||
function removeVideoTrackEndedListener(localVideo else if (videoTrack) { var videoTrack = extractVideoTrack(localVideo); if(videoTrack videoTrack.onended = function (event) { videoTrack.onended = null; console.error("Video source } } |
3. Добавляем функцию извлечения видеодорожки
Code Block | ||||
---|---|---|---|---|
| ||||
function extractVideoTrack(localVideo) { error. Disconnect..."); return localVideo.firstChild.srcObject.getVideoTracks()[0]; } |
...
stream.stop();
};
}
} |
2. Добавляем функцию удаления обработчика события при завершении публикации
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream(function removeVideoTrackEndedListener(localVideo) { var videoTrack = extractVideoTrack(localVideo); name: streamName, if(videoTrack) { display: localVideo, videoTrack.onended = null; ... }).on(STREAM_STATUS.PUBLISHING, function (stream} } |
3. Добавляем функцию извлечения видеодорожки
Code Block | ||||
---|---|---|---|---|
| ||||
function extractVideoTrack(localVideo) { addVideoTrackEndedListener(localVideo, stream); return localVideo.firstChild.srcObject.getVideoTracks()[0]; } |
4. При публикации потока регистрируем обработчик события
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({
name: streamName,
display: localVideo,
...
}).on(STREAM_STATUS.PUBLISHING, function (stream) {
addVideoTrackEndedListener(localVideo, stream);
setStatus("#publishStatus", STREAM_STATUS.PUBLISHING);
onPublishing(stream);
...
}).publish(); |
...
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ name: streamName, display: localVideo, cacheLocalResources: true, receiveVideo: false, receiveAudio: false, videoContentHint: "detail" ... }).publish(); |
По умолчанию, эта опция В сборках WebSDK до 2.0.242 эта опция по умолчанию установлена в detail
и указывает браузеру удерживать разрешение, заданное в constraints при публикации. Однако, при публикации с некоторых веб камер, подключаемых по USB, браузер может в этом случае сбрасывать FPS. Если необходимо удерживать FPS, но разрешение публикации при этом не важно, необходимо установить опцию в motion
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ name: streamName, display: localVideo, cacheLocalResources: true, receiveVideo: false, receiveAudio: false, videoContentHint: "motion" ... }).publish(); |
Начиная со сборки 2.0.242, videoContentHint
установлена в motion
по умолчанию. Значения detail
или text
следует выбирать только при публикации экрана в браузере.
В сборке WebSDK 2.0.204 в пример Media Devices добавлен пример установки опции videoContentHint
...
Code Block | ||||||
---|---|---|---|---|---|---|
| session.createStream({
name: streamName,
display: remoteVideo,
constraints: {
| |||||
session.createStream({
name: streamName,
display: remoteVideo,
constraints: {
audio: {
bitrate: 64000
},
...
}
...
}).publish(); |
или на стороне сервера
Code Block | ||
---|---|---|
| ||
opus_formats = maxaveragebitrate=64000;stereo=1;sprop-stereo=1; |
В этом случае браузер Firefox публикует стерео звук.
Публикация стерео звука в браузерах на основе Chrome
Для публикации стерео звука из Chrome, кроме настройки сервера, необходимы также изменения в коде клиента. В зависимости от реализации клиента, способы публикации будут разными
С использованием Web SDK
При использовании Web SDK, необходимо при публикации указать следующую опцию в ограничениях:
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({
name: streamName,
display: localVideo,
constraints: {
audio: {
stereo: true
},
...
}
...
}).publish(); |
С использованием Websocket API
Если в проекте используется только Websocket API, необходимо отключить эхоподавление
Code Block | ||||
---|---|---|---|---|
| ||||
var constraints = {
audio: {
echoCancellation: false,
googEchoCancellation: false
},
...
};
...
navigator.getUserMedia(constraints, function (stream) {
...
}, reject); |
При включенном эхоподавлении Chrome публикует моно звук, даже если в настройках кодека Opus заданы параметры стерео.
Обход блокировки шифрованного UDP трафика
В некоторых случаях шифрованный UDP медиатрафик может блокироваться на стороне провайдера. При этом публикация WebRTC потока с использованием UDP транспорта не будет работать и завершится с ошибкой Failed by RTP activity
. В таких случаях рекомендуется использовать TCP транспорт на стороне клиента
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({
name: streamName,
display: localVideo,
transport: "TCP"
...
}).publish(); |
Также можно использовать внешний или встроенный TURN сервер либо RTMP или RTSP для публикации потока.
Поддержка избыточности при публикации аудио
В сборке 5.2.1969 добавлена поддержка избыточности при публикации аудио данных (RED, RFC2198). Это позволяет снизить влияние потерь при публикации аудио в кодеке opus. Данная возможность включается при помощи настройки
Code Block | ||
---|---|---|
| ||
codecs=red,opus,alaw,ulaw,g729,speex16,g722,mpeg4-generic,telephone-event,h264,vp8,flv,mpv |
Обратите внимание, что кодек red
должен быть указан перед кодеком opus
. В этом случае браузер, поддерживающий RED, будет отправлять избыточные данные в аудио пакетах. Отметим, что битрейт публикации аудио будет повышен.
Для тех случаев, когда RED не может быть применен, его следует исключить:
Code Block | ||
---|---|---|
| ||
codecs_exclude_sip=red,mpeg4-generic,flv,mpv
codecs_exclude_sip_rtmp=red,opus,g729,g722,mpeg4-generic,vp8,mpv |
Получение дополнительной информации о конфигурации клиента
В сборке WebSDK 2.0.246, поставляемой со сборкой WCS, начиная с 5.2.2015, добавлена передача на сервер дополнительной информации о конфигурации публикующего клиента. Эти данные могут помочь при диагностике и решении проблем с публикацией.
Данные передаются в REST хуках.
Информация о системе
Информация о системе и браузере передается в REST хуке /connect
Code Block | ||||
---|---|---|---|---|
| ||||
{
"nodeId" : "VuQnlozpitGdVKzoIZg3f2JmJdMldzPV@192.168.0.40",
"appKey" : "defaultApp",
"sessionId" : "/192.168.0.231:11641/192.168.0.40:8443-b7efee23-45ac-4591-9aec-37f896ef10f1",
...,
"clientInfo" : {
"architecture" : "x86",
"bitness" : "64",
"brands" : [ {
"brand" : "Not/A)Brand",
"version" : "8"
}, {
"brand" : "Chromium",
"version" : "126"
}, {
"brand" : "Google Chrome",
"version" : "126"
} ],
"fullVersionList" : [ {
"brand" : "Not/A)Brand",
"version" : "8.0.0.0"
}, {
"brand" : "Chromium",
"version" : "126.0.6478.127"
}, {
"brand" : "Google Chrome",
"version" : "126.0.6478.127"
} ],
"mobile" : false,
"model" : "",
"platform" : "Windows",
"platformVersion" : "10.0.0"
}
} |
Warning |
---|
Информация об архитектуре, версии операционной системы и полном номере сборки браузера доступна только в браузерах на основе Chromium |
Информация о системе и браузере доступна также в ответах на REST запросы /connection/find
и /connection/find_all
Информация о медиа устройствах клиента
Информация о медиа устройствах клиента передается в REST хуке /publishStream
Code Block | ||||
---|---|---|---|---|
| ||||
{ "nodeId" : "d2hxbqNPE04vGeZ51NPhDuId6k3hUrBB@192.168.0.39", "appKey" : "defaultApp", "sessionId" : "/192.168.0.83:42172/192.168.0.39:8443-325c8258-81a6-43de-8c74-1bf582fb436a", "mediaSessionId" : "bb237f90-39be-11ef-81b8-bda3bf19742b", "name" : "test", "published" : true, ..., "localMediaInfo" : { "devices" : { "video" : [ { "id" : "bc18c5c2510d338d7b2c26bce4e37967feea3172f54ba2077558775d51839419", "label" : "HD Webcam C615 (046d:082c)", "type" : "camera" }, { "id" : "1f78289ccdbf27d67d605a35d6288acbdefe257275d4b5403525fb5cb1e1822e", "label" : "HP HD Camera (0408:5347)", "type" : "camera" } ], "audio" : [ { "id" audio: {"de988681c02901db0bfe012cd393eb2db5245fc2fb34709a26686ae6ca85b3ba", "label" : "HD Webcam bitrate: 64000C615 Mono", "type" : "mic" }, { ..."id" : "default", } ... }).publish(); |
или на стороне сервера
Code Block | ||
---|---|---|
| ||
opus_formats = maxaveragebitrate=64000;stereo=1;sprop-stereo=1; |
В этом случае браузер Firefox публикует стерео звук.
Публикация стерео звука в браузерах на основе Chrome
Для публикации стерео звука из Chrome, кроме настройки сервера, необходимы также изменения в коде клиента. В зависимости от реализации клиента, способы публикации будут разными
С использованием Web SDK
При использовании Web SDK, необходимо при публикации указать следующую опцию в ограничениях:
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream({ name: streamName, display: remoteVideo, constraints:"label" : "Default", "type" : "mic" }, { "id" : "e7f4beddb0d71ea1f618cf3bab0f7e94053b622ddaf312c403824caa006f5889", "label" : "Quantum 600 Mono", "type" : "mic" }, { audio"id" : {"fc6ac664dec546102d3f83b7fb5981afe3f0e88f8b76ffbe660ecfdd989bcf96", stereo"label" : true "Family 17h (Models 10h-1fh) HD Audio Controller Analog }Stereo", "type" ...: "mic" } } ... }).publish(); |
С использованием Websocket API
Если в проекте используется только Websocket API, необходимо отключить эхоподавление
Code Block | ||||
---|---|---|---|---|
| ||||
] }, var constraints = "tracks" : { "video" : audio:[ { "trackId" echoCancellation: false"1922f1d0-3a3f-4fa5-bd6e-e91ac84c666c", "device" : "HD Webcam C615 googEchoCancellation: false(046d:082c)" } }], "audio" ...: [ { }; "trackId" : "44187ea1-b756-4feb-80f0-ac57934c2200", ... navigator.getUserMedia(constraints, function (stream) { "device" : "MediaStreamAudioDestinationNode" } ...] }, reject); |
...
}
} |
Здесь:
- devices - список доступных браузеру медиа устройств
- tracks - с каких устройств захватываются видео и аудио дорожки в данном потоке
Информация о медиа устройствах доступна также в ответах на REST запросы /stream/find
и /stream/find_all
Известные проблемы
1. Если веб-приложение расположено внутри iframe элемента, публикация видеопотока может не пройти.
...