Тестирование пропускной способности канала публикации¶
Начиная со сборки WCS 5.2.1972 и сборки SFU SDK 2.0.273 добавлена возможность тестирования пропускной способности канала публикации от клиента до сервера. Тестирование производится с использованием WebRTC data channels, без публикации медиапотока.
При входе в SFU комнату устанавливается WebRTC соединение с сервером
После этого становится доступен объект BitrateTest
Метод 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);
}
}
}
}