Twilio Video - опция переключения медиаустройств не работает

Я использую twilio с twilio-video v beta-2 в расчете на главную ветку этого репо https://github.com/twilio/video-quickstart-js
Я должен отобразить выбранный носитель и вставить в него устройства, но когда я пытаюсь обновить VideoDevice, я получил ошибку

updateVideoDevice error TypeError: track must be a LocalAudioTrack, LocalVideoTrack, LocalDataTrack, or MediaStreamTrack
at Object.INVALID_TYPE (index.js:30952)
at Object.validateLocalTrack (index.js:31469)
at LocalParticipant.unpublishTrack (index.js:17047)
at index.js:17096
at Array.reduce (<anonymous>)
at LocalParticipant.unpublishTracks (index.js:17095)
at index.js:36056

мой updateVideoDevice функция заключается в следующем

function updateVideoDevice(event) {
const select = event.target;
const localParticipant = room.localParticipant;
if (select.value !== '') {
    Video.createLocalVideoTrack({
        deviceId: { exact: select.value }
    }).then(function(localVideoTrack) {
        const tracks = Array.from(localParticipant.videoTracks.values());
        localParticipant.unpublishTracks(tracks);
        log(localParticipant.identity + " removed track: " + tracks[0].kind);
        detachTracks(tracks);

        localParticipant.publishTrack(localVideoTrack);
        log(localParticipant.identity + " added track: " + localVideoTrack.kind);
        const previewContainer = document.getElementById('local-media');
        attachTracks([localVideoTrack], previewContainer);
    })
    .catch(error => {
        console.error('updateVideoDevice error' ,error);
    });
}
}

Кто-нибудь может объяснить, что я делаю не так?

1 ответ

Решение

Twilio разработчик евангелист здесь.

Это выглядит как прорывное изменение между Twilio Video JS v1 и v2. В v2 документации звоню localParticipant.videoTracks возвращает Map из <Track.SID, LocalVideoTrackPublication>, призвание .values() на этой карте возвращается итератор LocalVideoTrackPublication s, который затем превращается в массив с помощью Array.from,

Проблема в том, что вы передаете этот массив LocalVideoTrackPublication с localParticipant.unpublishTracks(tracks); что вызывает ошибку, потому что unpublishTracks ожидает массив LocalTrack не LocalVideoTrackPublication s.

Вы можете исправить это, сопоставляя публикации и возвращая track имущество:

const tracks = Array.from(localParticipant.videoTracks.values())
                 .map(publication => publication.track);

Дайте мне знать, если это поможет.

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