Изменить VideoTrack объекта MediaStream
В двух словах: я пытаюсь изменить VideoTrack
из MediaStream
объект.
(Документация: https://developer.mozilla.org/en-US/docs/WebRTC/MediaStream_API)
У меня есть объект MediaStream __o_jsep_stream_audiovideo
который создается библиотекой sipml.
__o_jsep_stream_audiovideo
выглядит так:
Таким образом, у него есть один AudioTrack и один VideoTrack. Сначала VideoTrack приходит с камеры пользователя (например, label: "FaceTime Camera"
).
Согласно документации:
MediaStream состоит из нуля или более объектов MediaStreamTrack, представляющих различные аудио- или видеодорожки.
Так что у нас должно получиться добавить больше треков в этот поток.
Я пытаюсь переключить / заменить VideoTrack на другой поток. Другой поток (streamB
) происходит от API Chromes ScreenCapture (label: "Screen"
)
Я старался:
__o_jsep_stream_audiovideo.addTrack(streamB.getVideoTracks()[0])
который, кажется, не имеет никакого эффекта.
Я также попытался назначить videoTracks напрямую (это было отчаянно, я знаю).
Должно быть, я упускаю что-то очевидное, не могли бы вы указать мне правильное направление?
я бегу
- Chrome (версия 34.0.1847.131) и
- Канарейка (Версия 36.0.1976.2 канарейка)
- OSX 10.9.2
2 ответа
Добавление и удаление дорожек в объекте MediaStream не сигнализирует о повторном согласовании, а также есть проблемы с MediaStream, имеющим две дорожки одного типа в Chrome.
Вероятно, вам следует просто добавить отдельный медиапоток к одноранговому соединению, чтобы он мог инициировать повторное согласование и обрабатывать потоки. Функция отслеживания добавления / удаления в Chrome очень наивна и не очень детализирована, и вам следует как можно больше от нее отходить.
Когда вы говорите об изменении видео дорожки, мы имеем в виду 2 области:
- изменить удаленную видеодорожку (что другие могут видеть из вас)
WebRTC получает новую версию этого, так как он устарел addStream/removeStream. Тем не менее, исключение в том, что они вводят новый интерфейс replaceTrack
stream.getTracks().forEach(function(track) {
// remote
qcClient.calls.values().forEach(function(call) {
var sender = call.pc.getSenders().find(function(s) {
return s.track.kind == track.kind;
});
sender.replaceTrack(track);
});
});
- смените свой дисплей видео (Вы видите себя)
Лучше просто добавить новый видеоэлемент (или использовать существующий видеоэлемент), но назначить srcObject новому захваченному потоку