Начиная со сборки WCS 5.2.1972 и сборки SFU SDK 2.0.273 добавлена возможность тестирования пропускной способности канала публикации от клиента до сервера. Тестирование производится с использованием WebRTC data channels, без публикации медиапотока.
При входе в SFU комнату устанавливается WebRTC соединение с сервером
await state.room.join(state.pc, null, {});
После этого становится доступен объект BitrateTest
const bitrateTest = state.room.getBitrateTest();
Метод BitrateTest.test()
запускает тестирование канала публикации. Метод принимает на вход максимальную длительность теста в миллисекундах, и возвращает Promise, который разрешается по окончании теста. Тест отправляет пакеты по WebRTC data channel, получает от сервера отчеты о том, какой объем данных получен успешно, и вычисляет битрейт передачи данных. Функция, вызываемая при разрешении Promise после окончания теста, получает на вход последнее измеренное значение битрейта в кбит/с
bitrateTest.test($("#" + bitrateTestState.durationId()).val()).then((bitrateKbps) => { stateSelector.text("Test is finished, last measured bitrate: " + bitrateKbps + " kbps"); ... });
Объект BitrateTest
позволяет прослушивать событие onStatusUpdate
, обработчик этого события получает на вход текущее измеренное значение битрейта в кбит/с. Это позволяет отобразить прогресс измерения на странице
bitrateTest.setListener({ onStatusUpdate(bitrateKbps) { stateSelector.text("Current bitrate: " + bitrateKbps + " kbps"); } });
Полный код функции примера SFU Bitrate Test, запускающей тестирование канала
const startBitrateTest = async function (state) { if (state.room) { await state.room.join(state.pc, null, {}); const stateSelector = $("#" + state.currentStateId()); stateSelector.attr("style", "display:inline-block;margin-left: 10px"); try { const bitrateTest = state.room.getBitrateTest(); state.setBitrateController(bitrateTest); bitrateTest.setListener({ onStatusUpdate(bitrateKbps) { stateSelector.text("Current bitrate: " + bitrateKbps + " kbps"); } }); bitrateTest.test($("#" + bitrateTestState.durationId()).val()).then((bitrateKbps) => { stateSelector.text("Test is finished, last measured bitrate: " + bitrateKbps + " kbps"); state.setBitrateController(null); onStopClick(state); }); } catch (e) { if (e.type === constants.SFU_ROOM_EVENT.OPERATION_FAILED) { onOperationFailed(state, e); } else { console.error("Failed to start bitrate test: " + e); setStatus(state.errInfoId(), e.name, "red"); onStopClick(state); } } } }