Динамическая смена displayElement

alexanderY

Member
Добрый день.

Внедряем Флэшфонер в существующее приложение, на замену Janus. Поэтому стараемся не менять особо бизнес-логику. Только точки соприкоснования с видео-сервером.

По логике у нас, локальный и удалённые стримы, могут иногда менять своё положение в DOM. И вот тут я немного застрял. Раньше мы просто клонировали элемент video и заново навешивали на него стрим с помощью attachMediaStream (без разницы, локальный или удаленный), но у нас тогда не было поддержки флэш-клиентов.

Сейчас Flashphoner JS-клиент берёт на себя чуть больше, т.е. сам следит за привязкой стрима к конкретному DOM-элементу. Что можно сделать, не прерывая стрим, чтобы стрим перестал показываться в одном блоке, и запустился в другом? Конечно, можно сделать stop/unpublish стрима и опубликовать его заново, но этот способ прерывает стрим и спрашивает у пользователя разрешение на камеру и микрофон. Так что это не вариант.
 

Max

Administrator
Staff member
Добрый день.
При использовании Flash, переместить элемент скорее всего не получится.
При использовании HTML5 просто удаляем DIV элемент из DOM, сохраняя на него ссылку и добавляем в другое место. (Нам нужно это проверить чтобы убедиться что работает именно так).
Таким образом, если используете и Flash и WebRTC, то такие манипуляции общим способом делать не получится. Например для WebRTC (HTML5) придется перемещать элемент в DOM, а для Flash делать stop/start.
 

alexanderY

Member
Спасибо за ответ. С флэшем тогда пока повременим. Удаление элемента с сохранением ссылки не работает. Точнее говоря, стрим не прекращается (зрители его видят), но в video#localvideo нет изображения. Попробую реализовать с помощью attachMediaStream, отпишусь по результатам.
 

Max

Administrator
Staff member
Мы проверили. Это работает следующим образом:
Code:
document.getElementById(currentPlayerId).removeChild(videoElement);
document.getElementById(newPlayerId).appendChild(videoElement);
videoElement.play();
Т.е. убираем элемент из одного блока и добавляем в другой.
После добавления вызываем play().
Это работает с Chrome и FF, не работает с IE.
В аттаче два примера
webrtc_switch_display - для remote video
streamer_example - для local video
 

Attachments

alexanderY

Member
Подтверждаю. У меня не работало, потому что я не догадался вызвать метод play(). Странно, что раньше этого не требовалось. Ну да ладно. Работает без сбоев.
 
Top