Описание
Приложение Two Way Streaming React показывает пример использования Web SDK во Vue.js приложении для публикации и проигрывания WebRTC потока
Проект доступен на GitHub, а также в архивах сборок Web SDK по следующему пути examples/react/two-way-streaming-vue, начиная со сборки 2.0.202.
Сборка проекта
1. Загрузите исходные тексты WebSDK
git clone https://github.com/flashphoner/flashphoner_client.git
2. Перейдите в каталог примера
cd flashphoner_client/examples/vue/two-way-streaming-vue
3. Установите зависимости
npm install
4. Запустите сборку для локального тестирования
npm run serve
или для выгрузки на свой веб-сервер
npm run build
Работа с кодом примера
Для разбора исходного кода примера возьмем версию с хэшем 6dc44b8, которая доступна здесь, а также в сборке Web SDK 2.0.202
Код приложения расположен в файле TwoWayStreamingApp.vue, дополнительные функции в файле fp-utils.js
1. Импорт API
import * as FPUtils from './fp-utils.js'; import * as Flashphoner from '@flashphoner/websdk';
2. Инициализация API
Flashphoner.init() code
onLoad() { try { Flashphoner.init({}); ... } catch(e) { console.log(e); ... } }
3. Подключение к серверу и получение события, подтверждающего установку соединения
Flashphoner.createSession(), SESSION_STATUS.ESTABLISHED code
onConnectClick() { let url = this.serverUrl; let session = this.session; if (!session) { console.log("Create new session with url " + url); this.connectButtonDisabled = true; this.serverUrlDisabled = true; Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, (session) => { this.sessionStatus = SESSION_STATUS.ESTABLISHED; this.sessionStatusClass = 'text-success'; this.onConnected(session); }).on(SESSION_STATUS.DISCONNECTED, () => { ... }).on(SESSION_STATUS.FAILED, () => { ... }); } ... }
4. Публикация потока
Session.createStream(), Stream.publish() code
publishStream() { let session = this.session; let streamName = this.publishStreamName; let localVideo = this.localVideo; if(session && localVideo) { session.createStream({ name: streamName, display: localVideo, cacheLocalResources: true, receiveVideo: false, receiveAudio: false }).on(STREAM_STATUS.PUBLISHING, (stream) => { ... }).on(STREAM_STATUS.UNPUBLISHED, () => { ... }).on(STREAM_STATUS.FAILED, () => { ... }).publish(); } }
5. Получение события, подтверждающего публикацию
STREAM_STATUS.PUBLISHING code
publishStream() { let session = this.session; let streamName = this.publishStreamName; let localVideo = this.localVideo; if(session && localVideo) { session.createStream({ ... }).on(STREAM_STATUS.PUBLISHING, (stream) => { this.publishStatus = STREAM_STATUS.PUBLISHING; this.publishStatusClass = 'text-success'; this.onPublishing(stream); }).on(STREAM_STATUS.UNPUBLISHED, () => { ... }).on(STREAM_STATUS.FAILED, () => { ... }).publish(); } }
6. Воспроизведение потока, изменение размера отображаемой картинки
Session.createStream(), Stream.play(), STREAM_STATUS.PENDING, FPUtils.resizeVideo() code
playStream() { let session = this.session; let streamName = this.playStreamName; let remoteVideo = this.remoteVideo; if(session && remoteVideo) { session.createStream({ name: streamName, display: remoteVideo }).on(STREAM_STATUS.PENDING, (stream) => { let video = document.getElementById(stream.id()); if (!video.hasListeners) { video.hasListeners = true; video.addEventListener('resize', (event) => { FPUtils.resizeVideo(event.target); }); } }).on(STREAM_STATUS.PLAYING, (stream) => { ... }).on(STREAM_STATUS.STOPPED, () => { ... }).on(STREAM_STATUS.FAILED, () => { ... }).play(); } }
7. Получение события, подтверждающего воспроизведение
STREAM_STATUS.PLAYING code
playStream() { let session = this.session; let streamName = this.playStreamName; let remoteVideo = this.remoteVideo; if(session && remoteVideo) { session.createStream({ name: streamName, display: remoteVideo }).on(STREAM_STATUS.PENDING, (stream) => { ... }).on(STREAM_STATUS.PLAYING, (stream) => { this.playStatus = STREAM_STATUS.PLAYING; this.playStatusClass = 'text-success'; this.onPlaying(stream); }).on(STREAM_STATUS.STOPPED, () => { ... }).on(STREAM_STATUS.FAILED, () => { ... }).play(); } }
8. Остановка воспроизведения
Stream.stop() code
onPlayClick() { let stream = this.playStreamObj; ... if (!stream) { ... this.playStream(); } else { this.playButtonDisabled = true; stream.stop(); } }
9. Получение события, подтверждающего остановку воспроизведения
STREAM_STATUS.STOPPED code
playStream() { let session = this.session; let streamName = this.playStreamName; let remoteVideo = this.remoteVideo; if(session && remoteVideo) { session.createStream({ name: streamName, display: remoteVideo }).on(STREAM_STATUS.PENDING, (stream) => { ... }).on(STREAM_STATUS.PLAYING, (stream) => { ... }).on(STREAM_STATUS.STOPPED, () => { this.playStatus = STREAM_STATUS.STOPPED; this.playStatusClass = 'text-success'; this.onStopped(); }).on(STREAM_STATUS.FAILED, () => { ... }).play(); } }
10. Остановка публикации
Stream.stop() code
onPublishClick() { let stream = this.publishStreamObj; ... ; if (!stream) { ... this.publishStream(); } else { this.publishButtonDisabled = true; stream.stop(); } }
11. Получение события, подтверждающего остановку публикации
STREAM_STATUS.UNPUBLISHED code
publishStream() { let session = this.session; let streamName = this.publishStreamName; let localVideo = this.localVideo; if(session && localVideo) { session.createStream({ ... }).on(STREAM_STATUS.PUBLISHING, (stream) => { ... }).on(STREAM_STATUS.UNPUBLISHED, () => { this.publishStatus = STREAM_STATUS.UNPUBLISHED; this.publishStatusClass = 'text-success'; this.onUnpublished(); }).on(STREAM_STATUS.FAILED, () => { ... }).publish(); } }
12. Закрытие соединения с сервером
Session.disconnect() code
onConnectClick() { let url = this.serverUrl; let session = this.session; if (!session) { ... } else { this.connectButtonDisabled = true; session.disconnect(); } }
13. Получение события, подтверждающего закрытие соединения
SESSION_STATUS.DISCONNECTED code
onConnectClick() { let url = this.serverUrl; let session = this.session; if (!session) { ... Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, (session) => { ... }).on(SESSION_STATUS.DISCONNECTED, () => { this.sessionStatus = SESSION_STATUS.DISCONNECTED; this.sessionStatusClass = 'text-success'; this.onDisconnected(); }).on(SESSION_STATUS.FAILED, () => { ... }); } ... }