В сборке 2.0.186 добавлены примеры идентификации опубликованных аудио/видео дорожек.
На скриншоте ниже показаны имена аудио mic1
и видео cam1
дорожек в примере SFU Player
Анализ кода примеров
Рассмотрим исходный код примеров SFU SDK, доступный на GitHub с тэгом 8287dd9.
1. Обозначение треков для публикации в конфигурационном файле config.json
audio track type code
{ ..., "media": { "audio": { "tracks": [{ "source": "mic", "channels": 2, "type": "mic1" }] }, ... } }
video track type code
{ ..., "media": { ... "video": { "tracks": [ { "source": "camera", "width": 1280, "height": 720, "codec": "H264", ..., "type": "cam1" } ] } } }
2. Добавление обозначения треков в конфигурацию WebRTC при публикации
Room.join
code
let streams = await getVideoStreams(mainConfig); let audioStreams = await getAudioStreams(mainConfig); if (state.isConnected() && state.isActive()) { //combine local video streams with audio streams streams.push.apply(streams, audioStreams); let config = {}; //add our local streams to the room (to PeerConnection) streams.forEach(function (s) { let contentType = s.type || s.source; //add local stream to local display localDisplay.add(s.stream.id, $("#" + state.inputId()).val(), s.stream, contentType); //add each track to PeerConnection s.stream.getTracks().forEach((track) => { config[track.id] = contentType; addTrackToPeerConnection(state.pc, s.stream, track, s.encodings); subscribeTrackToEndedEvent(state.room, track, state.pc); }); }); //start WebRTC negotiation state.waitFor(state.room.join(state.pc, null, config), MAX_AWAIT_MS); }
3. Получение события ADD_TRACKS на стороне зрителя
SFU_ROOM_EVENT.ADD_TRACKS, setTrackInfo()
code
room.on(constants.SFU_ROOM_EVENT.ADD_TRACKS, function(e) { console.log("Received ADD_TRACKS"); ... for (const pTrack of e.info.info) { let createDisplay = true; for (let i = 0; i < participant.displays.length; i++) { let display = participant.displays[i]; if (pTrack.type === "VIDEO") { if (display.hasVideo()) { continue; } display.videoMid = pTrack.mid; display.setTrackInfo(pTrack); createDisplay = false; break; } else if (pTrack.type === "AUDIO") { if (display.hasAudio()) { continue; } display.audioMid = pTrack.mid; display.setTrackInfo(pTrack); createDisplay = false; break; } } if (!createDisplay) { continue; } let display = createRemoteDisplay(participant.nickName, participant.nickName, mainDiv, displayOptions); participant.displays.push(display); if (pTrack.type === "VIDEO") { display.videoMid = pTrack.mid; display.setTrackInfo(pTrack); } else if (pTrack.type === "AUDIO") { display.audioMid = pTrack.mid; display.setTrackInfo(pTrack); } } })...;
4. Отображение идентификатора трека
AddRemoveTracks.info.info.contentType
, setTrackInfo()
code
setTrackInfo: function(trackInfo) { if (trackInfo) { ... if (trackInfo.type) { contentType = trackInfo.contentType || ""; if (trackInfo.type == "VIDEO" && displayOptions.type && contentType !== "") { showItem(videoTypeDisplay); videoTypeDisplay.innerHTML = contentType; } if (trackInfo.type == "AUDIO") { audioStateButton.setContentType(contentType); } } } }, ...