Внедрение управления камерой, микрофоном и параметрами потока
Ниже показано, как встроить код управления публикацией и воспроизведением потока в страницу вашего сайта или web-проекта
Содержание
- Управление параметрами потока при публикации
- Получение списка микрофонов и камер
- Тестирование микрофона и камеры
- Публикация в режиме «Только аудио» и «Только видео»
- Управление чувствительностью микрофона при захвате аудиопотока
- Управление параметрами аудиопотока при публикации
- Включение и отключение звука при публикации
- Публикация с указанием размеров видео, FPS и битрейта
- Включение и выключение видео при публикации
- Управление параметрами COD и CVO
- Выбор протокола транспорта для публикации потока
- Исключение кодеков при публикации потока
- Остановка публикации потока и «освобождение» камеры и микрофона
- Управление параметрами потока при воспроизведении
- Получение списка устройств воспроизведения
- Воспроизведение в режиме «Только аудио» и «Только видео»
- Управление уровнем громкости при воспроизведении
- Включение и отключение звука при воспроизведении
- Индикатор речи
- Воспроизведение с указанием размеров видео, битрейта и качества
- Выбор протокола транспорта для воспроизведения потока
- Исключение кодеков при воспроизведении потока
Управление параметрами потока при публикации
Для дальнейшего разбора примеров будет использоваться простая web-страница, на которой мы разместим div элемент и кнопки для управления публикацией. Для примеров с публикацией потоков в div элементе будет отображаться превью публикуемого потока.
В описаниях JS кода не будем останавливаться на объявлении констант и функциях подключения к WCS через WebSocket и остановки потока. Дополнительную информацию о них можно найти здесь.
Полный минимальный HTML код публикации потока:
publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JS код инициализации API и подключения к WCS через WebSocket. Так же при загрузке страницы назначаем исполняемые функции кнопкам:
function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish;
JS код публикации потока:
function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }); stream.publish(); console.log("Publish") }
JS код остановки публикации потока:
function stopPublish() { stream.stop(); console.log("Stop") }
Полный JS код минимального паблишера:
publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick= publishStream; stopBtn.onclick = stopPlay; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }); stream.publish(); console.log("Publish") } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Получение списка микрофонов и камер
Рассмотрим пример минимального кода для получения списков микрофонов и камер, доступных на устройстве пользователя. Создадим два пустых файла input-media-device-min.html и input-media-device-min.js. в которых разместим код, описанный ниже.
На HTML-странице в этом примере будут два поля со списком в которых будут выведены списки микрофонов и камер. Полный код HTML-страницы:
input-media-device-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="input-media-device-min.js"></script> </head> <body onload="init_api()"> <label>Microphone</label> <select id="audioInput"></select> <br/> <label>Camera</label> <select id="videoInput"></select> </body> </html>
JavaScript
Получаем доступные микрофоны и камеры при помощи функции Flashphoner.getMediaDevices(), которая будет запущена при загрузке HTML-страницы.
Полный JS код примера:
input-media-device-min.js
//Init Flashphoner API on page load & get a list of available input devices function init_api() { Flashphoner.init({}); Flashphoner.getMediaDevices(null, true).then(function(list) { //Get a list of available Microphone list.audio.forEach(function(device) { //List filling var audio = document.getElementById("audioInput"); var deviceInList = false; for (var i = 0; i < audio.options.length; i++) { if (audio.options[i].value === device.id) { deviceInList = true; break; } } if (!deviceInList) { var option = document.createElement("option"); option.text = device.label || device.id; option.value = device.id; audio.appendChild(option); } }); //Get a list of available Camera list.video.forEach(function(device) { //List filling var video = document.getElementById("videoInput"); var deviceInList = false; for (var i = 0; i < video.options.length; i++) { if (video.options[i].value === device.id) { deviceInList = true; break; } } if (!deviceInList) { var option = document.createElement("option"); option.text = device.label || device.id; option.value = device.id; if (option.text.toLowerCase().indexOf("back") >= 0 && video.children.length > 0) { video.insertBefore(option, video.children[0]); } else { video.appendChild(option); } } }); }); };
Тестирование микрофона и камеры
Тестирование проводится без создания потока и публикации его на сервер, локально, на уровне браузера.
Рассмотрим пример минимального кода для тестирования микрофона и камеры. Создадим два пустых файла test-media-device-min.html и test-media-device-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
test-media-device-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="test-media-device-min.js"></script> </head> <body onload="init_api()"> <div id="testScreen" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="testBtn">Test</button> <button id="stopTestBtn">Stop Test</button> </body> </html>
Полный JS код примера:
test-media-device-min.js
//Init Flashphoner API on page load function init_api() { Flashphoner.init({}); testBtn.onclick = startTest; stopTestBtn.onclick = stopTest; } //Test run function startTest() { var constraints = { audio: true, video: true }; var testScreen = document.getElementById("testScreen"); Flashphoner.getMediaAccess(constraints, testScreen).then(function(disp) { testStarted = true; }); } //Stopping testing function stopTest() { testStarted = false; document.getElementById("testScreen").innerHTML = ""; }
Публикация в режиме «Только аудио» и «Только видео»
Рассмотрим пример минимального кода для встраивания публикации в режиме «Только аудио» и «Только видео». Создадим два пустых файла audio-video-min.html и audio-video-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
audio-video-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="audio-video-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="publishAudio">Publish audio only</button> <button id="publishVideo">Publish video only</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Чтобы в потоке была только аудио составляющая указываем констрейнты следующим образом
constraints = { audio: true, video: false };
Публикуем поток с этими параметрами
function publishStreamAudio() { constraints = { audio: true, video: false }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish audio"); }
Далее, создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Чтобы в потоке была только видео составляющая указываем констрейнты следующим образом:
constraints = { audio: false, video: true };
Публикуем поток с этими параметрами.
function publishStreamVideo() { constraints = { audio: false, video: true }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish video"); }
Полный код JavaScript примера:
audio-video-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishAudio.onclick = publishStreamAudio; publishVideo.onclick= publishStreamVideo; stopBtn.onclick = stopPublish; } //Publish stream audio function publishStreamAudio() { constraints = { audio: true, video: false }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish audio"); } //Publish stream video function publishStreamVideo() { constraints = { audio: false, video: true }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish video"); } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Управление чувствительностью микрофона при захвате аудиопотока
Управление чувствительностью микрофона работает только в браузерах на движке Chromium.
Рассмотрим пример минимального кода для управления чувствительностью микрофона при захвате аудиопотока. Создадим два пустых файла mic-gain-publish-min.html и mic-gain-publish-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
mic-gain-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="mic-gain-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>Microphone Gain</label> <input id="sendGain" type="text" value="50"/><br/> <br/><button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем значение чувствительности микрофона. Для упрощения примера значение передаем в простом текстовом поле и для его изменения нужно будет перезапускать публикацию потока.
gainValue = document.getElementById("sendGain").value
Публикуем поток с этими параметрами. После успешной публикации потока устанавливаем значение чувствительности микрофона:
function publishStream() { gainValue = document.getElementById("sendGain").value stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }).on(STREAM_STATUS.PUBLISHING, function(stream) { stream.setMicrophoneGain(gainValue); }); stream.publish(); console.log("Publish") }
Полный JS код примера:
mic-gain-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { gainValue = document.getElementById("sendGain").value stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }).on(STREAM_STATUS.PUBLISHING, function(stream) { stream.setMicrophoneGain(gainValue); }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Управление параметрами аудиопотока при публикации
Рассмотрим пример минимального кода для управления параметрами аудио составляющей потока при публикации. Создадим два пустых файла parameters-audio-min.html и parameters-audio-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
parameters-audio-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="parameters-audio-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>FEC</label> <input id="sendFec" type="text" value="true"/><br/> <label>Stereo</label> <input id="sendStereo" type="text" value="true"/><br/> <label>Bitrate</label> <input id="sendBitrate" type="text" value="1000"/><br/> <br/> <button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем значения констрейнтов для audio из полей на HTML странице.
Для захвата аудио доступны параметры:
- FEC — использование Opus кодека с коррекцией ошибок (работает только для Opus). Значение: true, false;
- Stereo — переключение стерео/моно режима. Значение: true, false;
- Bitrate — установка битрейта звука (в кбит/с)
constraints = { audio: { fec: document.getElementById("sendFec").value, stereo: document.getElementById("sendStereo").value, bitrate: document.getElementById("sendBitrate").value, }, video: true, };
Публикуем поток с этими параметрами:
function publishStream() { constraints = { audio: { fec: document.getElementById("sendFec").value, stereo: document.getElementById("sendStereo").value, bitrate: document.getElementById("sendBitrate").value, }, video: true, }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish") }
Полный JavaScript код примера:
parameters-audio-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { constraints = { audio: { fec: document.getElementById("sendFec").value, stereo: document.getElementById("sendStereo").value, bitrate: document.getElementById("sendBitrate").value, }, video: true, }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Включение и отключение звука при публикации
Функция «Mute» позволяет отключить микрофон, не останавливая поток. В поток, в качестве аудио составляющей, при этом транслируется тишина.
Рассмотрим пример минимального кода для включения и отключения звука при публикации. Создадим два пустых файла mute-audio-publish-min.html и mute-audio-publish-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
mute-audio-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="mute-audio-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="publishBtn">Publish Stream</button> <button id="publishAudioMute">Mute</button> <button id="publishAudioUnMute">UnMute</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
1. Функция отключения микрофона и остановки захвата аудио составляющей потока
function audioMute() { stream.muteAudio(); }
2. Функция включения микрофона и возобновления захвата аудио составляющей потока
function audioUnMute() { stream.unmuteAudio(); }
Полный код JavaScript примера:
mute-audio-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; publishAudioMute.onclick= audioMute; publishAudioUnMute.onclick= audioUnMute; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }); stream.publish(); console.log("Publish"); } //Mute audio function audioMute() { stream.muteAudio(); } //UnMute audio function audioUnMute() { stream.unmuteAudio(); } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Публикация с указанием размеров видео, FPS и битрейта
Рассмотрим пример минимального кода для публикации с указанием размеров видео, FPS и битрейта. Создадим два пустых файла size-video-min.html и size-video-min.js, в которых разместим следующий код.
Полный код HTML — страницы:
size-video-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="size-video-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>Width</label> <input id="sendWidth" type="text" value="320"/><br/> <label>Height</label> <input id="sendHeight" type="text" value="240"/><br/> <label>FPS</label> <input id="sendFPS" type="text" value="30"/><br/> <label>Bitrate min</label> <input id="sendBitrateMin" type="text" value="1000"/> <label>max</label> <input id="sendBitrateMax" type="text" value="2000"/> <br/> <br/><button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем значения констрейнтов из полей на HTML странице.
Для публикации видео потока доступны следующие параметры
- width— ширина кадра (в px);
- height — высота кадра (в px);
- minBitrate — минимальное значение битрейта (в кбит/с);
- maxBitrate — максимальное значение битрейта (в кбит/с);
- frameRate — кадров в секунду.
constraints = { audio: true, video: { width: document.getElementById("sendWidth").value, height: document.getElementById("sendHeight").value, minBitrate: document.getElementById("sendBitrateMin").value, maxBitrate: document.getElementById("sendBitrateMax").value, frameRate: document.getElementById("sendFPS").value, } };
Публикуем поток с этими параметрами.
function publishStream() { constraints = { audio: true, video: { width: document.getElementById("sendWidth").value, height: document.getElementById("sendHeight").value, minBitrate: document.getElementById("sendBitrateMin").value, maxBitrate: document.getElementById("sendBitrateMax").value, frameRate: document.getElementById("sendFPS").value, } }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish") }
Полный код JavaScript примера:
size-video-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://p10.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { constraints = { audio: true, video: { width: document.getElementById("sendWidth").value, height: document.getElementById("sendHeight").value, minBitrate: document.getElementById("sendBitrateMin").value, maxBitrate: document.getElementById("sendBitrateMax").value, frameRate: document.getElementById("sendFPS").value, } }; stream = session.createStream({ name: "stream", display: document.getElementById("publish"), constraints: constraints, }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Включение и выключение видео при публикации
Функция «Mute» позволяет отключить камеру, не останавливая поток. В поток, в качестве видео составляющей, при этом транслируется черный экран.
Рассмотрим пример минимального кода для включения и выключения видео при публикации. Создадим два пустых файла mute-video-publish-min.html и mute-video-publish-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
mute-video-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="mute-video-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="publishBtn">Publish Stream</button> <button id="publishVideoMute">Mute Video</button> <button id="publishVideoUnMute">UnMute Video</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
1. Функция отключения камеры и остановки захвата видео составляющей потока
function videoMute() { stream.muteVideo(); }
2. Функция включения камеры и возобновления захвата видео составляющей потока
function videoUnMute() { stream.unmuteVideo(); }
Полный код JavaScript примера:
mute-video-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; publishVideoMute.onclick= videoMute; publishVideoUnMute.onclick= videoUnMute; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }); stream.publish(); console.log("Publish"); } //Mute Video function videoMute() { stream.muteVideo(); } //UnMute Video function videoUnMute() { stream.unmuteVideo(); } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Управление параметрами COD и CVO
COD — Cpu Overuse Detection — отслеживает загрузку процессора и при достижении некоторого порога инициирует события, которые приводят к сбросу разрешения браузером Chrome.
CVO — Coordination of video orientation extension — признак ориентации картинки. При публикации WebRTC потока с мобильного устройства, ориентация изображения может быть изменена при повороте устройства.
Рассмотрим пример минимального кода для управления параметрами COD и CVO. Создадим два пустых файла cod-cvo-publish-min.html и cod-cvo-publish-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
cod-cvo-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="cod-cvo-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>Cpu Overuse Detection</label> <input id="sendCod" type="text" value="true"/><br/> <label>Coordination of video orientation extension</label> <input id="sendCvo" type="text" value="false"/><br/> <br/><button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем параметры COD и CVO из полей на HTML странице
- COD — значения true, false;
- CVO — значения true, false.
googCpuOveruseDetection: document.getElementById("sendCod").value, ... cvoExtension: document.getElementById("sendCvo").value,
Публикуем поток с этими параметрами
function publishStream() { mediaConnectionConstraints = { "mandatory": { googCpuOveruseDetection: document.getElementById("sendCod").value, } } stream = session.createStream({ name: "stream", display: document.getElementById("publish"), mediaConnectionConstraints: mediaConnectionConstraints, cvoExtension: document.getElementById("sendCvo").value, }); stream.publish(); console.log("Publish") }
Полный js код примера:
cod-cvo-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { mediaConnectionConstraints = { "mandatory": { googCpuOveruseDetection: document.getElementById("sendCod").value, } } stream = session.createStream({ name: "stream", display: document.getElementById("publish"), mediaConnectionConstraints: mediaConnectionConstraints, cvoExtension: document.getElementById("sendCvo").value, }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Выбор протокола транспорта для публикации потока
Рассмотрим пример минимального кода для выбора протокола транспорта при публикации потока. Создадим два пустых файла transport-publish-min.html и transport-publish-min.js, в которых разместим следующий код.
На HTML страницу добавляем элемент «select», с помощью которого можно выбрать протокол транспорта — UDP или TCP.
Полный код HTML-страницы:
transport-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="transport-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>Transport protocol</label> <select id="transportInput"> <option value="UDP">UDP</option> <option value="TCP">TCP</option> </select> <br/><button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
1. Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем значение протокола из элемента «select» на HTML странице:
transport:document.getElementById("transportInput").value,
Публикуем поток с этими параметрами:
function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), transport:document.getElementById("transportInput").value, }); stream.publish(); console.log("Publish") }
Полный Js код примера:
transport-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), transport:document.getElementById("transportInput").value, }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Исключение кодеков при публикации потока
Рассмотрим пример минимального кода для исключения кодеков при публикации потока. Создадим два пустых файла codecs-publish-min.html и codecs-publish-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
codecs-publish-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="codecs-publish-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <label>Strip codecs</label> <input id="sendCodecs" type="text" value="H264,VP8,OPUS,G722,ALAW,ULAW"/><br/> <br/><button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «publish» в качестве параметров. Получаем список кодеков из поля на HTML странице:
stripCodecs:document.getElementById("sendCodecs").value,
Публикуем поток с этими параметрами:
function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), stripCodecs:document.getElementById("sendCodecs").value, }); stream.publish(); console.log("Publish") }
Полный js код примера:
codecs-publish-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick = publishStream; stopBtn.onclick = stopPublish; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), stripCodecs:document.getElementById("sendCodecs").value, }); stream.publish(); console.log("Publish") } //Stopping stream function stopPublish() { stream.stop(); console.log("Stop") }
Остановка публикации потока и «освобождение» камеры и микрофона
Рассмотрим пример минимального кода для остановки публикации потока и «освобождения» захваченных микрофона и камеры. Создадим два пустых файла release-media-device-min.html и release-media-device-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
release-media-device-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="release-media-device-min.js"></script> </head> <body onload="init_api()"> <div id="publish" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="publishBtn">Publish</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
После нажатия кнопки «Stop» последовательно вызываются событие «stop» для публикуемого потока и функция API «Flashphoner.releaseLocalMedia()», которая «отпускает» захваченные микрофон и камеру.
function stopPlay() { stream.stop(); Flashphoner.releaseLocalMedia(); console.log("Stop") }
Полный js код примера:
release-media-device-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); publishBtn.onclick= publishStream; stopBtn.onclick = stopPlay; } //Publish stream function publishStream() { stream = session.createStream({ name: "stream", display: document.getElementById("publish"), }); stream.publish(); console.log("Publish") } //Stopping stream & Release local media device function stopPlay() { stream.stop(); Flashphoner.releaseLocalMedia(); console.log("Stop") }
Управление параметрами потока при воспроизведении
Для тестирования этих примеров, опубликуйте на вашем WCS сервере видеопоток с именем «stream» любым удобным способом. Например, при помощи встроенного демо-примера «Two-way streaming».
При дальнейшем разборе примеров будет использоваться простая web-страница, на которой мы разместим div элемент и кнопки для управления воспроизведением. В div элементе будет отображаться воспроизведение запрошенного потока.
В описаниях JS кода не будем останавливаться на объявлении констант и функциях подключения к WCS через WebSocket и остановки потока. Дополнительную информацию о них можно найти здесь.
Полный HTML код минимального плеера:
play-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="play-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JS код инициализации API и подключения к WCS через WebSocket. Так же при загрузке страницы назначаем исполняемые функции кнопкам.
function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick = playStream; stopBtn.onclick = stopPlay; }
JS код воспроизведения потока
function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), }); stream.play(); console.log("Play") }
JS код остановки воспроизведения потока
function stopPublish() { stream.stop(); console.log("Stop") }
Полный JS код минимального плеера
play-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick= playStream; stopBtn.onclick = stopPlay; } //Play stream function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), }); stream.play();; console.log("Play"); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Получение списка устройств воспроизведения
Получение списка устройств воспроизведения работает в браузерах Chrome и MS Edge.
Рассмотрим пример минимального кода для получения списка устройств воспроизведения. Создадим два пустых файла output-media-device-min.html и output-media-device-min.js, в которых разместим следующий код.
На HTML-странице для этого примера разместим поле со списком, в котором будет выведен список устройств воспроизведения.
Полный код HTML-страницы:
output-media-device-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="output-media-device-min.js"></script> </head> <body onload="init_api()"> <label>Output</label> <select id="audioOutput"></select> </body> </html>
JavaScript
Получаем доступные устройства воспроизведения при помощи функции Flashphoner.getMediaDevices(), которая будет запущена при загрузке HTML страницы.
Полный JS код примера:
output-media-device-min.js
//Constants var MEDIA_DEVICE_KIND = Flashphoner.constants.MEDIA_DEVICE_KIND; //Init Flashphoner API on page load & get a list of available output devices function init_api() { Flashphoner.init({}); //Get a list of available output devices Flashphoner.getMediaDevices(null, true, MEDIA_DEVICE_KIND.OUTPUT).then(function (list) { list.audio.forEach(function (device) { var audio = document.getElementById("audioOutput"); var deviceInList = false; for (var i = 0; i < audio.options.length; i++) { if (audio.options[i].value === device.id) { deviceInList = true; break; } } if (!deviceInList) { var option = document.createElement("option"); option.text = device.label || device.id; option.value = device.id; audio.appendChild(option); } }); }); };
Воспроизведение в режиме «Только аудио» и «Только видео»
Рассмотрим пример минимального кода для воспроизведения потока в режиме «Только аудио» и «Только видео». Создадим два пустых файла play-audio-video-min.html и play-audio-video-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
play-audio-video-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="play-audio-video-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="playAudio">Play audio only</button> <button id="playVideo">Play video only</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
1. Создаем поток для воспроизведения при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Чтобы из потока воспроизводилось только аудио указываем констрейнты
constraints = { audio: true, video: false };
Воспроизводим поток с этими параметрами.
function playStreamAudio() { constraints = { audio: true, video: false }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play();; console.log("Play audio"); }
2. Далее создаем поток для воспроизведения при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Чтобы из потока воспроизводилось только видео указываем констрейнты следующим образом
constraints = { audio: false, video: true };
Воспроизводим поток с этими параметрами
function playStreamVideo() { constraints = { audio: false, video: true }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play(); console.log("Play video"); }
Полный код JavaScript примера:
play-audio-video-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playAudio.onclick = playStreamAudio; playVideo.onclick= playStreamVideo; stopBtn.onclick = stopPlay; } //Play stream audio function playStreamAudio() { constraints = { audio: true, video: false }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play();; console.log("Play audio"); } //Play stream video function playStreamVideo() { constraints = { audio: false, video: true }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play(); console.log("Play video"); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Управление уровнем громкости при воспроизведении
Рассмотрим пример минимального кода для управления уровнем громкости при воспроизведении потока. Создадим два пустых файла volume-play-min.html и volume-play-min.js, в которых разместим следующий код..
Полный код HTML-страницы:
volume-play-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="volume-play-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <label>Volume</label> <input id="playVolume" type="text" value="50"/><br/> <br/><button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Получаем значение громкости с HTML-страницы. Для упрощения примера значение передаем в простом текстовом поле и для его изменения нужно будет перезапускать воспроизведение потока.
volumeValue = document.getElementById("playVolume").value
Воспроизводим поток с этими параметрами. После начала воспроизведения потока устанавливаем значение громкости:
function playStream() { volumeValue = document.getElementById("playVolume").value stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), }).on(STREAM_STATUS.PLAYING, function(stream) { stream.setVolume(volumeValue); }); stream.play();; console.log("Play"); }
Полный JS код примера:
volume-play-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick= playStream; stopBtn.onclick = stopPlay; } //Play stream function playStream() { volumeValue = document.getElementById("playVolume").value stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), }).on(STREAM_STATUS.PLAYING, function(stream) { stream.setVolume(volumeValue); }); stream.play();; console.log("Play"); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Включение и отключение звука при воспроизведении
Рассмотрим пример минимального кода для включения и отключения звука при воспроизведении потока. Создадим два пустых файла play-mute-audio-min.html и play-mute-audio-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
play-mute-audio-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="play-mute-audio-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <br/> <button id="playBtn">play Stream</button> <button id="playAudioMute">Mute</button> <button id="playAudioUnMute">UnMute</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
1. Функция отключения звука
function audioMute() { stream.muteRemoteAudio(); }
2. Функция включения звука
function audioUnMute() { stream.unmuteRemoteAudio(); }
Полный код JavaScript для этого примера:
play-mute-audio-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick = playStream; playAudioMute.onclick= audioMute; playAudioUnMute.onclick= audioUnMute; stopBtn.onclick = stopPlay; } //Play stream function playStream() { constraints = { audio: true, video: true }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play(); console.log("play"); } //Mute audio function audioMute() { stream.muteRemoteAudio(); } //UnMute audio function audioUnMute() { stream.unmuteRemoteAudio(); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Индикатор речи
Рассмотрим пример минимального кода для встраивания индикатора речи. Создадим два пустых файла detect-speech-play-min.html и detect-speech-play-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
detect-speech-play-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="detect-speech-play-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <label>Talking</label> <div id="talking" style="width:20px;height:10px;border: solid 1px; background-color: #ffffff"></div> <br/><button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Получаем поток из плеера и определяем наличие аудио составляющей в потоке. Проверяем наличие аудио каждые 500 ms и меняем цвет div элемента «Talking»:
function detectSpeech(stream, level, latency) { var audioContext = new (window.AudioContext || window.webkitAudioContext)(); var mediaStream = document.getElementById(stream.id()).srcObject; var source = audioContext.createMediaStreamSource(mediaStream); var processor = audioContext.createScriptProcessor(512); processor.onaudioprocess = handleAudio; processor.connect(audioContext.destination); processor.clipping = false; processor.lastClip = 0; // threshold processor.threshold = level || 0.10; processor.latency = latency || 750; processor.isSpeech = function () { if (!this.clipping) return false; if ((this.lastClip + this.latency) < window.performance.now()) this.clipping = false; return this.clipping; }; source.connect(processor); // Check speech every 500 ms intervalID = setInterval(function () { if (processor.isSpeech()) { console.log("talking"); document.getElementById("talking").style.background = "#00ff00"; } else { document.getElementById("talking").style.background = "#ff0000"; console.log("NO_talking"); } }, 500); }
Функция определения наличия аудио составляющей в потоке
function handleAudio(event) { var buf = event.inputBuffer.getChannelData(0); var bufLength = buf.length; var x; for (var i = 0; i < bufLength; i++) { x = buf[i]; if (Math.abs(x) >= this.threshold) { this.clipping = true; this.lastClip = window.performance.now(); } } }
Полный JS код примера:
detect-speech-play-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick= playStream; stopBtn.onclick = stopPlay; } //Play stream function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), }).on(STREAM_STATUS.PLAYING, function(stream) { detectSpeech(stream); }); stream.play();; console.log("Play"); } function detectSpeech(stream, level, latency) { var audioContext = new (window.AudioContext || window.webkitAudioContext)(); var mediaStream = document.getElementById(stream.id()).srcObject; var source = audioContext.createMediaStreamSource(mediaStream); var processor = audioContext.createScriptProcessor(512); processor.onaudioprocess = handleAudio; processor.connect(audioContext.destination); processor.clipping = false; processor.lastClip = 0; // threshold processor.threshold = level || 0.10; processor.latency = latency || 750; processor.isSpeech = function () { if (!this.clipping) return false; if ((this.lastClip + this.latency) < window.performance.now()) this.clipping = false; return this.clipping; }; source.connect(processor); // Check speech every 500 ms intervalID = setInterval(function () { if (processor.isSpeech()) { console.log("talking"); document.getElementById("talking").style.background = "#00ff00"; } else { document.getElementById("talking").style.background = "#ff0000"; console.log("NO_talking"); } }, 500); } function handleAudio(event) { var buf = event.inputBuffer.getChannelData(0); var bufLength = buf.length; var x; for (var i = 0; i < bufLength; i++) { x = buf[i]; if (Math.abs(x) >= this.threshold) { this.clipping = true; this.lastClip = window.performance.now(); } } } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Воспроизведение с указанием размеров видео, битрейта и качества
При воспроизведении потока с указанием размеров видео, битрейта на WCS сервере будет включен транскодинг, что приведет к увеличению нагрузки на процессор сервера.
Рассмотрим пример минимального кода для воспроизведения с указанием размеров видео, битрейта и качества . Создадим два пустых файла play-size-video-min.html и play-size-video-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
play-size-video-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="play-size-video-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <label>Width</label> <input id="playWidth" type="text" value="320"/><br/> <label>Height</label> <input id="playHeight" type="text" value="240"/><br/> <label>Bitrate</label> <input id="playBitrate" type="text" value="1000"/><br/> <label>Quality</label> <input id="playQuality" type="text" value="0"/> <br/><button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток для воспроизведения при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Получаем значения констрейнтов из полей на HTML странице:
Для воспроизведения видео потока доступны следующие параметры
- width — ширина кадра (в px);
- height — высота кадра (в px);
- bitrate — значение битрейта (в кбит/с);
- quality — качество видео. Значение от 0 до 51 (0 — самое высокое качество, 51 — самое низкое качество).
constraints = { audio: true, video: { width: document.getElementById("playWidth").value, height: document.getElementById("playHeight").value, bitrate: document.getElementById("playBitrate").value, quality: document.getElementById("playQuality").value } };
Воспроизводим поток с этими параметрами:
function playStream() { constraints = { audio: true, video: { width: document.getElementById("playWidth").value, height: document.getElementById("playHeight").value, bitrate: document.getElementById("playBitrate").value, quality: document.getElementById("playQuality").value } }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play(); console.log("Play") }
Полный код JavaScript:
play-size-video-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick = playStream; stopBtn.onclick = stopPlay; } //Play stream function playStream() { constraints = { audio: true, video: { width: document.getElementById("playWidth").value, height: document.getElementById("playHeight").value, bitrate: document.getElementById("playBitrate").value, quality: document.getElementById("playQuality").value } }; stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), constraints: constraints, }); stream.play(); console.log("Play") } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Выбор протокола транспорта для воспроизведения потока
Рассмотрим пример минимального кода для выбора протокола транспорта при воспроизведении потока. Создадим два пустых файла transport-play-min.html и transport-play-min.js, в которых разместим следующий код.
На HTML-страницу добавляем элемент «select», с помощью которого можно выбрать протокол транспорта — UDP или TCP.
Полный код HTML-страницы:
transport-play-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="transport-play-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <label>Transport protocol</label> <select id="transportOutput"> <option value="UDP">UDP</option> <option value="TCP">TCP</option> </select> <br/><button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Получаем значение протокола из элемента «select» на HTML-странице:
transport:document.getElementById("transportOutput").value,
Воспроизводим поток с этими параметрами:
function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), transport:document.getElementById("transportOutput").value, }); stream.play();; console.log("Play"); }
Полный JS код примера:
transport-play-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick= playStream; stopBtn.onclick = stopPlay; } //Play stream audio function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), transport:document.getElementById("transportOutput").value, }); stream.play();; console.log("Play"); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Исключение кодеков при воспроизведении потока
Рассмотрим пример минимального кода для исключения кодеков при воспроизведении потока. Создадим два пустых файла codecs-play-min.html и codecs-play-min.js, в которых разместим следующий код.
Полный код HTML-страницы:
codecs-play-min.html
<!DOCTYPE html> <html lang="en"> <head> <script type="text/javascript" src="https://flashphoner.com/downloads/builds/flashphoner_client/wcs_api-2.0/current/flashphoner.js"></script> <script type="text/javascript" src="codecs-play-min.js"></script> </head> <body onload="init_api()"> <div id="myPlayer" style="width:320px;height:240px;border: solid 1px"></div> <label>Strip codecs</label> <input id="stripCodecs" type="text" value="H264,VP8,OPUS,G722,ALAW,ULAW"/><br/> <br/><button id="playBtn">Play</button> <button id="stopBtn">Stop</button> </body> </html>
JavaScript
Создаем поток при помощи функции session.createStream() и передаем имя потока «stream» и HTML элемент «myPlayer» в качестве параметров. Получаем список кодеков из поля на HTML странице:
stripCodecs:document.getElementById("stripCodecs").value,
Воспроизводим поток с этими параметрами:
function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), stripCodecs:document.getElementById("stripCodecs").value, }); stream.play();; console.log("Play"); }
Полный js код примера:
codecs-play-min.js
//Constants var SESSION_STATUS = Flashphoner.constants.SESSION_STATUS; var STREAM_STATUS = Flashphoner.constants.STREAM_STATUS; var session; var stream; //Init Flashphoner API on page load & Connect to WCS server over webSockets function init_api() { Flashphoner.init({}); session = Flashphoner.createSession({ urlServer: "wss://demo.flashphoner.com:8443" //specify the address of your WCS }).on(SESSION_STATUS.ESTABLISHED, function(session) { console.log("ESTABLISHED"); }); playBtn.onclick= playStream; stopBtn.onclick = stopPlay; } //Play stream function playStream() { stream = session.createStream({ name: "stream", display: document.getElementById("myPlayer"), stripCodecs:document.getElementById("stripCodecs").value, }); stream.play();; console.log("Play"); } //Stopping stream function stopPlay() { stream.stop(); console.log("Stop") }
Загрузить Web Call Server 5
Системные требования: Linux x86_64, 1 core CPU, 2 Gb RAM, Java
Установка:
- wget https://flashphoner.com/download-wcs5.2-server.tar.gz
- Распаковать и установить с помощью скрипта 'install.sh'
- Запустить сервер с помощью команды 'service webcallserver start'
- Открыть веб-интерфейс https://host:8444 и активировать вашу лицензию
Если вы используете серверы Amazon EC2, то скачивать ничего не нужно.