Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Общие правила

При публикации или воспроизведении видео на мобильных устройствах, браузер может по умолчанию требовать требует действий от пользователя (нажатие кнопки). Чтобы обойти это ограничение, необходимо использовать функции playFirstSound() (только при воспроизведении в WSPlayer) и playFirstVideo() (при воспроизведении по WebRTC в iOS Safari и по MSE в остальных браузерах):Кроме того, аудио в элементе HTML5 video должно быть заглушено

Code Block
languagejs
themeRDark
    let video = document.createElement('video');
    video.muted = true;

Включить аудио при воспроизведении можно также только по нажатию кнопки пользователем.

Таким образом, запуск публикации или воспроизведения потока в мобильном браузере в сборке WebSDK 2.0.212 должен проводиться по следующим правилам:

1. Если Websocket соединение уже установлено, и для запуска публикации или проигрывания используется отдельная кнопка, которую нажимает пользователь (Publish/Play), дополнительных действий в коде приложения не требуется

2. Если по нажатию кнопки пользователем устанавливается Websocket соединение, а затем по событию SESSION_STATUS.ESTABLISHED запускается публикация и воспроизведение, то необходимо использовать функцию playFirstVideo()  при публикации

code

Code Block
languagejs
themeRDark
        if (Browser.isSafariWebRTC()) {
            Flashphoner.playFirstVideo(localVideo, true, PRELOADER_URL).then(function() {
                publishStream();
            });
            return;
        }

и воспроизведении

code

Code Block
languagejs
themeRDark
        if (Flashphoner.getMediaProviders()[0] === "WSPlayer") {
            Flashphoner.playFirstSound();...
        } else if (Browser.isSafariWebRTC() || Flashphoner.getMediaProviders()[0] === "MSE") {
            Flashphoner.playFirstVideo(remoteVideo, false, PRELOADER_URL).then(function () {
                startplayStream();
            });
            return;
        }

Функция playFirstVideo  возвращает Promise, который разрешается, если в указанном видеоэлементе на странице remoteVideo удалось успешно проиграть тестовый фрагмент видео, путь к которому указан константой PRELOADER_URL . Если Promise был разрешен, в данном видеоэлементе на странице может быть запущено воспроизведение видеопотока с сервера. Если Promise был отклонен, воспроизведение не может быть запущено.Функция должна быть вызвана для воспроизведения любого видео, в том числе и видеозвонка.

3. Если Websocket соединение устанавливается, а затем по событию SESSION_STATUS.ESTABLISHED запускается воспроизведение при загрузке страницы (autoplay), необходимо использовать playFirstVideo  и отключить автоматическое включение звука при создании потока

code

Code Block
languagejs
themeRDark
    var options = {
        name: streamName,
        display: remoteVideo,
        flashShowFullScreenButton: true
    };
    ...
    if (autoplay) {
        options.unmutePlayOnStart = false;
    }
    stream = session.createStream(options).on(STREAM_STATUS.PENDING, function (stream) {
        ...
    });
    stream.play();

Публикация и воспроизведение в режиме Low Power Mode

В режиме Low Power Mode на iOS устройствах для публикации или воспроизведения обязательно требуется действие пользователя. Автозапуск воспроизведения в этом режиме не работает. Для того, чтобы определить этот режим, используется функция playFirstVideo : в Low Power Mode Promise, который возвращает эта функция, будет отклонен

code

Code Block
languagejs
themeRDark
                if (Browser.isSafariWebRTC()) {
                    Flashphoner.playFirstVideo(pDisplay, false, PRELOADER_URL).then(function() {
                        playStream(participant, pDisplay);
                    }).catch(function (error) {
                        // Low Power Mode detected, user action is needed to start playback in this mode
                        console.log("Can't atomatically play participant" + participant.name() + " stream, use Play button");
                        onParticipantStopped(participant);
                    });
                }