Изменить 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")

streamB

Я старался:

__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 области:

  1. изменить удаленную видеодорожку (что другие могут видеть из вас)

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);
    });
});
  1. смените свой дисплей видео (Вы видите себя)

Лучше просто добавить новый видеоэлемент (или использовать существующий видеоэлемент), но назначить srcObject новому захваченному потоку

Другие вопросы по тегам