IOS 11 и web RTC

Alexei

New Member
Здравствуйте, после обновления мобильных устройств под управлением IOS 10 до 11 версии ( тестировалось на iphone 7,8,6$ ipad pro, ipad air2), перестал воспроизводится rtsp видеопоток на сайте через ваш плеер. Wcs 5.0.2106 (отсюда же и взят демо плеер) , 8u144, CentOS 7.3.
Логи сервера, если необходимо готовы предоставить.
 

Max

Administrator
Staff member
Здравствуйте.
Обновление для поддержки iOS 11 Safari
В iOS 11 вышла поддержка технологии WebRTC (getUserMedia).
Поэтому чтобы заработало, нужно сделать следующее
1. Обновить сервер и Web SDK до последней сборки
Code:
service webcallserver update 2484
Web SDK:
https://flashphoner.com/downloads/b...4a0ed220c495e0c604cdcd342da957c522a9a3.tar.gz
2. Если вы используете свой плеер (страницу воспроизведения), на ней нужно добавить следующий код по клику на кнопку Play
Code:
Flashphoner.playFirstVideo(remoteVideo);
https://github.com/flashphoner/flas.../examples/demo/streaming/player/player.js#L88
Этот код нужно добавить для iOS Safari.
Без обновления
Чтобы в iOS 11 заработало без обновления, нужно для iOS 11 инициализировать API с приоритетным провайдером WSPlayer
Пример, если iOS11, то инициализируем так
Code:
Flashphoner.init({
flashMediaProviderSwfLocation: '../../../../media-provider.swf',
receiverLocation: '../../dependencies/websocket-player/WSReceiver2.js',
decoderLocation: '../../dependencies/websocket-player/video-worker2.js',
preferredMediaProvider: 'WSPlayer'
});
https://github.com/flashphoner/flas.../examples/demo/streaming/player/player.js#L16
Эта строка ставит WSPlayer в приоритет:
Code:
preferredMediaProvider: 'WSPlayer'
И тогда воспроизведение должно работать в iOS11.
 

Alexei

New Member
Спасибо. обновили , протестировали пока на одном устройстве (айфон 6) - работает.
При обновлении по, появился еще один неприятный момент - включение звука ( плагина) и соответственно сильный щелчок в начале воспроизведения.
Каким либо образом можно убрать звуковой плагин из трансляции совсем!? Спасибо!
 

Max

Administrator
Staff member
На iOS 11, сейчас работают две технологии
1) WSPlayer через Canvas и Web Audio API
2) WebRTC через video - элемент
Если у вас щелчок, значит выполняется этот код
https://github.com/flashphoner/flas.../examples/demo/streaming/player/player.js#L86
Code:
Flashphoner.playFirstSound();
а этот код выполняется только для WSPlayer, а WSPlayer использует Web Audio API.
Никаких звуковых плагинов в iOS Safari нет. Возможно вы про Web Audio API.

В итоге, у вам используется WSPlayer. И он генерирует этот щелчок.
Подавить щелчок можно в коде flashphoner.js.
Найти функцию playFirstSound
https://github.com/flashphoner/flas..._api-2.0/src/websocket-media-provider.js#L144
Code:
var playFirstSound = function() {
    var audioBuffer = audioContext.createBuffer(1, 441, 44100);
    var output = audioBuffer.getChannelData(0);
    for (var i = 0; i < output.length; i++) {
        output[i] = Math.random() * 2 - 1;
    }
    var src = audioContext.createBufferSource();
    src.buffer = audioBuffer;
    src.connect(audioContext.destination);
    src.start(0);
};
И далее меняем рандомный звук на тишину (нули)
Code:
output[i] = Math.random() * 2 - 1;
меняем на
Code:
output[i] = 0;
После этого щелчок должен уйти.

Позже мы выпустим обновление Web SDK с отключением щелчка. Если срочно, можете подавить его прямо сейчас в коде.

Единственно не понятно, почему у вас в iOS 11 используется WSPlayer. Возможно обновление было установлено некорректно.
Пришлите тестовую страницу, мы проверим.
Адрес страницы можно выслать на logs@flashphoner.com
 

Alexei

New Member
Здравствуйте, небольшие уточнения по поводу наших проблем. Изначально мы пошли по второму пути, не обновляя wcs. Просто поменяли медиа провайдер по умолчанию, следуя вашему совету. Во втором случае просто закомментировали playfirstsound. Спасибо за помощь.
 

Max

Administrator
Staff member
Дело в том, что в iOS 11 появилась поддержка WebRTC.
Т.е. видео воспроизводится более качественное, быстрое, с меньшей задержкой и меньшей нагрузкой на мобильное устройство.
Если вы не стали обновлять Web SDK, у вас используется сейчас WSPlayer, у которого эти показатели хуже по сравнению с WebRTC.
Поэтому в будущем, все же есть смысл обновиться до последней версии.
Подробнее про iOS 11, WebRTC и WSPlayer написано в нашем блоге:
https://flashphoner.com/ios-safari-11-teper-umeet-webrtc/?lang=ru
 
Мы столкнулись с ограничением WebRTC iOS 11 - не более 1 потока(исключая поток с локальных камеры и микрофона) может воспроизводиться одновременно, если в потоке есть звук. Если в плеере выключать звук - несколько плееров одновременно работают в браузере на iOS 11. Но звук всё же нужен. Не планируете реализовать воспроизведение звука через микширование WebAudio в браузере из всех плееров и проигрывание одним потоком независимо от видео, для обхода ограничения?
 
Last edited:

Max

Administrator
Staff member
Удалось воспроизвести похожую проблему. Сначала попытаемся решить нормально. Если нормально не получится, будем рассматривать обходные пути вроде Web Audio.
Если будут движения по этому вопросу, отпишем в эту тему.
 

Max

Administrator
Staff member
Официальные пояснения от Apple следующие
https://developer.apple.com/library...iderations/Device-SpecificConsiderations.html
Multiple Simultaneous Audio or Video Streams
Currently, all devices running iOS are limited to playback of a single audio or video stream at any time. Playing more than one video—side by side, partly overlapping, or completely overlaid—is not currently supported on iOS devices. Playing multiple simultaneous audio streams is also not supported. You can change the audio or video source dynamically, however. See Replacing a Media Source Sequentially for details.
Т.е. воспроизведение двух видео на одной странице не поддерживается на iOS устройствах.
Как не поддерживается и паралельное воспроизведение нескольких аудио потоков.

В наших тестах примера 2 Players, если начинаем играть второй поток, то первый поток ставится на паузу.

Вам похоже удалось найти workaround или это баг Safari.
Но действительно, если указать
Code:
session.createStream({constraints:{audio:false,video:true}}).play()
то два видео будут играть на одной странице без звука.

Но Apple вполне может "исправить" этот баг в следующей версии iOS и запретить воспроизведение двух и более видео.

Что касается микширования.
Сейчас у нас реализовано серверное микширование звука в экспериментальной пока еще ветке.
Если интересно, создайте пожалуйста отдельную тему на форуме. Покажем как можно протестировать.

По микшированию на стороне браузера - проверим, возможно ли это реализовать.
Если есть опыт работы с Web Audio API, можете попробовать реализовать самостоятельно.
Исходники Web SDK открыты. Инструкцию по их сборке находится здесь:
https://forum.flashphoner.com/threads/custom-flashphoner-js-compilation.11116
Чуть позже будет добавлена в документацию.
 
На коленке попробовали отделять потоки и микшировать, всё работает в десктопном Chrome, 3 камеры и 1 аудио с миксом звуковых потоков с 3-х камер, в iOS Safari играет несколько видео и 1 отдельный аудио с любой камеры без микширования, но Safari, включая десктопную, не микширует opus. Как я понимаю, для webrtc-потоков opus без вариантов ?
 

Max

Administrator
Staff member
Судя по SDP, Safari должен играть следующие кодеки:
Code:
a=rtpmap:111 opus/48000/2
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
SDP печатается в серверном логе WCS_HOME/logs/server_logs/flashphoner.log

В клиентском API можно убрать лишние кодеки. Например, чтобы использовать PCMA, можно убрать все кроме PCMA:
Code:
session.createStream({stripCodecs:[opus,ISAC,G722,ILBC,PCMU], name:'stream1'}).play();
Т.е. Safari должен нормально играть и PCMA и все кодеки, которые он показывает в SDP.
Другое дело, что при микшировании это вряд ли поможет.
 
Last edited:
В наших тестах при отключении opus в sdp webrtc-соединение происходит, Safari звук передает, но не воспроизводит. G722 отключить не удалось, на ISAC и G722 safari только передает микрофон, но не воспроизводит входящий звук. Это без микширования, просто 2 камеры peer2peer Safari-Chrome. Другие пары Chrome-Chrome, Chrome-Firefox без opus работают на ISAC/G722, но эти все приседания нужны только для iOS Safari.
 
Не получается создавать sound-only плеер с автовоспроизведением через flashphoner.js на iOS 11, плеер становится на паузу и распаузить его можно только в результате user action. С выводом video+sound такой проблемы нет, автовоспроизведение работает.
 

Max

Administrator
Staff member
с выводом video+sound такой проблемы нет, автовоспроизведение работает
Поясните что имеется ввиду под автовоспроизведением.
Мы специально вводили для iOS Safari следующие методы:
WS Player
Code:
Flashphoner.playFirstSound();
WebRTC
Code:
Flashphoner.playFirstVideo();
В первом случае пользователь может начать проигрывать видео без звука, но чтобы проиграть звук должен клинуть по экрану и "активировать" Web API audio context.
Во втором, пользователь опять же кликает по экрану чтобы задейстовать HTML5 <video/> элемент. Без этого видео не играет.
Это мы тестировали на iOS Safari 11.

Если у вас другое поведение, пожалуйста отпишите подробнее со скриншотами и кусками кода что происходит. Чтобы мы могли воспроизвести.
 
Оригинальная проблема в Safari iOS 11 : если не выключать звук в WebRTC-камерах, то на странице одновременно работает только одна remote webrtc-камера со звуком, остальные становятся на паузу.
Поясните что имеется ввиду под автовоспроизведением.
Добавленная через Flashphoner session.createStream() первая/единственная входящая remote webrtc-камера с видео и звуком воспроизводится без дополнительных кликов автоматически. iOS 11 в Safari. Аналогично с video-only камерой, но в этом случае это и ожидается. Для sound-only камеры нужен клик или уже работающее видео со звуком(запущенное кликом) на странице, и в этом случае на странице остаются одновременно 2 источника звука - видео-плеер и sound-only webrtc поток.
Во втором, пользователь опять же кликает по экрану чтобы задейстовать HTML5 <video/> элемент. Без этого видео не играет.
Посмотрим также на эти функции.
 

camaro396

Member
А я про эти функции не знал и прописывал
Code:
if(tmp = div.querySelector('video')) {
    tmp.setAttribute('playsinline', true);
    tmp.play();   
}
Естественно, работает только для стримов без звука.
 
Top