Table of Contents |
---|
Пример плеера
Данный плеер может использоваться для воспроизведения любого типа потока с Web Call Server:
- RTSP
- WebRTC
- RTMPRTMFP
- SIP
Ниже представлен пример воспроизведения RTSP-потока в web-плеере.
Код примера
Код данного примера находится на сервере по следующему пути:
...
Тестировать данный пример можно по следующему адресу:
https://host:8888/client2/examples/demo/streaming/player/player.html
Здесь host - адрес вашего WCS-сервера.
Работа с кодом примера
Для разбора кода возьмем версию файла player.js с хешем cf0daabc6b86e21d5a2f9e4605366c8b7f0d27eb 7fff01f, которая находится здесь и доступна для
скачивания в соответствующей сборке 2.0.3.18219.1894.
1. Инициализация API.
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.init({flashMediaProviderSwfLocation receiverLocation: '../../dependencies/websocket-player/WSReceiver2.js', decoderLocation: '../../media-provider.swf'/dependencies/websocket-player/video-worker2.js', preferredMediaProvider: mediaProvider }); |
2. Подключение к серверу.
Flashphoner.createSession() код code
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status());... //session connected, start playback playStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ setStatus(SESSION_STATUS.DISCONNECTED); onStopped();... }).on(SESSION_STATUS.FAILED, function(){ setStatus(SESSION_STATUS.FAILED); onStopped();... }); |
3. Получение от сервера события, подтверждающего успешное соединение
SESSION_STATUS.ConnectionStatusEvent ESTABLISHED код code
Code Block | ||||
---|---|---|---|---|
| ||||
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status()); //session connected, start playback playStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ setStatus... }).on(SESSION_STATUS.DISCONNECTED);FAILED, function(){ ... onStopped(); }}); |
4. Воспроизведение видеопотока
Session.createStream(), Stream.play() code
Code Block | ||||
---|---|---|---|---|
| ||||
stream = session.createStream(options).on(SESSIONSTREAM_STATUS.FAILEDPENDING, function (stream) { setStatus(SESSION_STATUS.FAILED);... onStopped(}); }); |
...
stream.play() |
...
; |
При создании передается передаются:
- streamName - имя видеопотока
...
- remoteVideo -
div
...
- элемент, в котором будет отображаться видео
...
- разрешение, к которому должна быть транскодирована картинка
- unmutePlayOnStart: false - отключает автоматическое воспроизведение звука при autoplay для соблюдения требований браузеров
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream( var options = { name: streamName, display: remoteVideo, flashShowFullScreenButton: true }).on(STREAM_STATUS.PLAYING, function(stream; if (Flashphoner.getMediaProviders()[0] === "MSE" && mseCutByIFrameOnly) { options.mediaConnectionConstraints = { cutByIFrameOnly: mseCutByIFrameOnly } } if (resolution_for_wsplayer) { document.getElementById(stream.id()).addEventListener('resize', function(event)options.playWidth = resolution_for_wsplayer.playWidth; options.playHeight = resolution_for_wsplayer.playHeight; } else if (resolution) { options.playWidth = resolution.split("x")[0]; options.playHeight = resizeVideo(event.target)resolution.split("x")[1]; } })if (autoplay) { options.unmutePlayOnStart = false; } |
5. Получение от сервера события, подтверждающего успешное воспроизведение потока
STREAM_STATUS.PLAYING code
Code Block | ||||
---|---|---|---|---|
| ||||
setStatus(stream = session.statuscreateStream(options));.on(STREAM_STATUS.PENDING, function (stream) { onStarted(stream);... }).on(STREAM_STATUS.STOPPEDPLAYING, function (stream) { $("#preloader").hide(); setStatus(STREAM_STATUS.STOPPEDstream.status()); onStoppedonStarted(stream); }).on(STREAM_STATUS.FAILEDSTOPPED, function() { ... setStatus }).on(STREAM_STATUS.FAILED);, function() { onStopped(... }); })stream.play(); |
56. Получение от сервера события, подтверждающего успешное воспроизведение потокаStreamStatusEvent PLAYING кодОбработка события о недостаточной пропускной способности канала
STREAM_EVENT, STREAM_EVENT_TYPE.NOT_ENOUGH_BANDWIDTH code
Code Block | ||||
---|---|---|---|---|
| ||||
session.createStream( }).on(STREAM_EVENT, function(streamEvent){ if (STREAM_EVENT_TYPE.NOT_ENOUGH_BANDWIDTH name: streamName, === streamEvent.type) { display: remoteVideo var }).on(STREAM_STATUS.PLAYING, function(stream) { info = streamEvent.payload.info.split("/"); var document.getElementById(stream.id()).addEventListener('resize', function(event){ remoteBitrate = info[0]; var networkBandwidth resizeVideo(event.target); }); setStatus(stream.status()); onStarted(stream); }).on(STREAM_STATUS.STOPPED, function() { = info[1]; console.log("Not enough bandwidth, consider using lower video resolution or bitrate. Bandwidth " + (Math.round(networkBandwidth / 1000)) + " bitrate " + (Math.round(remoteBitrate / 1000))); } else if (STREAM_EVENT_TYPE.RESIZE === streamEvent.type) { setStatus(STREAM_STATUS.STOPPED); ... } onStopped(); }); |
7. Обработка события об изменении размера картинки потока
STREAM_EVENT, STREAM_EVENT_TYPE.RESIZE code
Code Block | ||||
---|---|---|---|---|
| ||||
}).on(STREAM_STATUS.FAILEDEVENT, function(streamEvent) {{ ... setStatus} else if (STREAM_STATUS.FAILED); EVENT_TYPE.RESIZE === streamEvent.type) { onStopped(console.log("New video size: " + streamEvent.payload.streamerVideoWidth + "x" + streamEvent.payload.streamerVideoHeight); }).play() }); |
68. Остановка воспроизведения видеопотока.
Code Block | ||||
---|---|---|---|---|
| ||||
function onStarted(stream) {
$("#playBtn").text("Stop").off('click').click(function(){
$(this).prop('disabled', true);
stream.stop();
}).prop('disabled', false);
...
} |
79. Получение от сервера события, подтверждающего успешную остановку воспроизведения потока
StreamStatusEvent STOPPED кодSTREAM_STATUS.STOPPED code
Code Block | ||||
---|---|---|---|---|
| ||||
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function (stream) { ... name: streamName, }).on(STREAM_STATUS.STOPPED, function () { $("#preloader").hide(); display: remoteVideosetStatus(STREAM_STATUS.STOPPED); onStopped(); }).on(STREAM_STATUS.PLAYINGFAILED, function(stream) { document.getElementById(stream.id()).addEventListener('resize', function(event)... }).play(); |
10. Регулировка громкости воспроизведения
Stream.unmuteRemoteAudio(), Stream.setVolume() code
Code Block | ||||
---|---|---|---|---|
| ||||
$("#volumeControl").slider({ range: "min", min: 0, max: 100, value: currentVolumeValue, step: 10, animate: true, slide: function(event, ui) { resizeVideo(event.target); //WCS-2375. fixed autoplay in ios safari }); if setStatus(stream.statusisRemoteAudioMuted()); { onStarted(stream stream.unmuteRemoteAudio(); }).on(STREAM_STATUS.STOPPED, function() {} currentVolumeValue = setStatus(STREAM_STATUS.STOPPED)ui.value; onStoppedstream.setVolume(currentVolumeValue); } }).on(STREAM_STATUS.FAILED, function() { setStatus(STREAM_STATUS.FAILEDslider("disable"); |
11. Автозапуск воспроизведения при загрузке страницы
Code Block | ||||
---|---|---|---|---|
| ||||
if (autoplay) { // We can start autoplay with muted audio only, so set volume slider to 0 #WCS-2425 $("#volumeControl").slider('value', 0); onStopped$("#playBtn").click(); }).play(); |