Streaming with zooming¶
Описание¶
Данный пример может быть использован для тестирования возможности увеличения изображения на лету при захвате с камеры в браузере
Поток, опубликованный с увеличением

Параметры URL, указанного в поле ввода:
test1.flashphoner.com:8443- адрес и вебсокет порт WCS2a12b361- bvz jge,kbrjdfyyjuj gjnjrf
На этой странице играю два видео
Local- видео с камерыPreview- видео для предварительного просмотра, как опубликовано на сервере
Код примера¶
Код данного примера находится на WCS-сервере по следующему пути:
/usr/local/FlashphonerWebCallServer/client/examples/demo/stream-zoom/stream-zoom.html
stream-zoom.css- файл стилейstream-zoom.html- HTML страница примераstream-zoom.js- скрипт, обеспечивающий работу примера
Тестировать данный пример можно по следующему адресу:
https://host:8444/client/examples/demo/streaming/stream-zoom/stream-zoom.html
Здесь host - адрес WCS-сервера.
Работа с кодом примера¶
Для разбора кода возьмем версию файла stream-zoom.js с хешем 7626dbf, которая находится здесь и доступна для скачивания в соответствующей сборке 2.0.260.
1. Инициализация API¶
Flashphoner.init() code
const init_page = function() {
//init api
try {
Flashphoner.init();
} catch(e) {
setText("notifyFlash", "Your browser doesn't support WebRTC technology needed for this example");
return;
}
...
}
2. CПодключение к серверу¶
Flashphoner.createSession() code
const start = function() {
//check if we already have session
if (currentSession) {
startStreaming(currentSession);
} else {
//create session
let url = getValue("url");
console.log("Create new session with url " + url);
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
...
}).on(SESSION_STATUS.DISCONNECTED, function(){
...
}).on(SESSION_STATUS.FAILED, function(){
...
});
}
}
3. Получение от сервера события, подтверждающего успешное соединение¶
SESSION_STATUS.ESTABLISHED code
const start = function() {
//check if we already have session
if (currentSession) {
startStreaming(currentSession);
} else {
//create session
let url = getValue("url");
console.log("Create new session with url " + url);
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){
//session connected, start streaming
currentSession = session;
startStreaming(session);
}).on(SESSION_STATUS.DISCONNECTED, function(){
...
}).on(SESSION_STATUS.FAILED, function(){
...
});
}
}
4. Публикация видео с возможностью увеличения¶
Session.createStream(), Stream.publish() code
В метод createStream() передаются параметры:
streamName- имя потока;localVideo-divэлемент для отображения видео с камерыconstraints.video.zoom: true- включает увеличение, если такая возможность поддерживаетсяconstraints.audio: true- включает захват аудио
const startStreaming = function(session) {
let streamName = getValue("url").split('/')[3];
disableItem("url");
session.createStream({
name: streamName,
display: localVideo,
constraints: {
video: {
zoom: true
},
audio: true
}
}).on(STREAM_STATUS.PUBLISHING, function(publishStream){
...
}).on(STREAM_STATUS.UNPUBLISHED, function(){
...
}).on(STREAM_STATUS.FAILED, function(stream){
...
}).publish();
}
5. Получение от сервера события, подтверждающего успешную публикацию¶
STREAM_STATUS.PUBLISHING code
При получении данного события, создается поток для отображения публикации при помощи метода Session.createStream(), и для этого потока вызывается метод Stream.play()
const startStreaming = function(session) {
let streamName = getValue("url").split('/')[3];
disableItem("url");
session.createStream({
name: streamName,
display: localVideo,
constraints: {
video: {
zoom: true
},
audio: true
}
}).on(STREAM_STATUS.PUBLISHING, function(publishStream){
setStatus(STREAM_STATUS.PUBLISHING);
//play preview
session.createStream({
name: streamName,
display: remoteVideo
}).on(STREAM_STATUS.PLAYING, function(previewStream){
//enable stop button
onStarted(publishStream, previewStream);
}).on(STREAM_STATUS.STOPPED, function(){
publishStream.stop();
}).on(STREAM_STATUS.FAILED, function(stream){
//preview failed, stop publishStream
if (publishStream.status() === STREAM_STATUS.PUBLISHING) {
setStatus(STREAM_STATUS.FAILED, stream);
publishStream.stop();
}
}).play();
}).on(STREAM_STATUS.UNPUBLISHED, function(){
...
}).on(STREAM_STATUS.FAILED, function(stream){
...
}).publish();
}
6. Настройка слайдера для управления увеличением¶
Stream.getZoomCapabilities, Stream.setZoom code
const setUpZoom = function(publishStream) {
// Check if zoom capabilities available
if (publishStream) {
let zoom = document.getElementById("zoom");
let zoomCapabilities = publishStream.getZoomCapabilities();
if (zoomCapabilities) {
// Set up zoom control
setText("info", "Zoom can be used with the camera");
setAttribute("info", "class", "text-muted");
zoom.min = zoomCapabilities.min;
zoom.max = zoomCapabilities.max;
zoom.step = zoomCapabilities.step;
zoom.value = zoomCapabilities.value;
zoom.oninput = async function(event) {
await publishStream.setZoom(event.target.value);
console.log("Zoom value: " + publishStream.getZoom());
};
enableItem("zoom");
} else {
setText("info", "Zoom can't be used with the camera");
setAttribute("info", "class", "text-danger");
}
}
}