Я не могу инициализировать createOffer () после завершения рендеринга локального потока? - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю над потоковой передачей видео / аудио в своем проекте и использую библиотеку реагировать-нативно-webrt c для реализации вышеуказанных функций. Сначала я рендерил локальный поток в ComponentDidMount ()

componentDidMount () {
 this.getLocalStream();
}

getLocalStream() {
      mediaDevices.enumerateDevices().then(sourceInfos => {
      console.log("mediaDevices.enumerateDevices", sourceInfos);
      let videoSourceId;
      for (let i = 0; i < sourceInfos.length; i++) {
        const sourceInfo = sourceInfos[i];
        if(sourceInfo.kind === "videoinput" && sourceInfo.facing === (this.state.isFront ? "front" : "environment")) {
          videoSourceId = sourceInfo.id;
        }
      }
      mediaDevices.getUserMedia({ 
        audio: true, 
        // IF simulator/audio call is running for webrtc then video to false.
        video: this.state.isSwitching,
          facingMode: (this.state.isFront ? "user" : "environment"),
          optional: (videoSourceId ? [{sourceId: videoSourceId}] : [])
        }
      )
      .then(stream => { 
        InCallManager.start({media: 'audio'});
        InCallManager.startRingtone('_BUNDLE_');
        if (this.state.isSwitching === false) {
            InCallManager.setSpeakerphoneOn(true);
            InCallManager.setForceSpeakerphoneOn(true); 
        }
        this.setState({videoUrl: stream.toURL(),})
        localStream = stream;
        pc.addStream(localStream);
        connectedUser = false;
        createPC(this.state.roomID,true);
      })
      .catch(error => {
        // Log error
        console.log('Error',error.message);
        this.setState({loading: false});
      });
      });
    }

. После его успешного рендеринга я инициирую предложение () для другого партнера; однако метод RTCPeerConnection p c .createOffer () не может инициировать и не выполняет функцию, внутри нее logi c. Я пробовал много способов сделать метод триггера, но это не удалось.

const createPC = (socketId, isOffer) => {  

       pcPeers = {
         ...pcPeers,
         [socketId]: pc,
       };
      if (isOffer){
        pc.createOffer(function(desc) {
          log("fgf");
          console.log('createOffer', desc);
          pc.setLocalDescription(desc, function () {
            console.log('setLocalDescription', pc.localDescription);
            socket.emit('exchange', {'to': socketId, 'sdp': pc.localDescription });
          }, logError);
        }, logError);
      }


// On Add Stream:
 pc.onaddstream = event => {
  //console.log('onaddstream', event.stream);
  const remoteList = this.state.remoteList;
  remoteList[socketId] = event.stream.toURL();
  this.setState({
    remoteList: remoteList,
  });
};
// ice candidates
pc.onicecandidate = event => {
  log('Howeeeee');
  if (event.candidate) {
    socket.emit('exchange', { to: socketId, candidate: event.candidate });
  }
};
  return pc;
}

В чем причина того, что вас не уволили даже после предоставления всех параметров методам. Поскольку я новичок в React Native, может ли кто-нибудь помочь мне, где я совершил ошибку. Помощь будет высоко оценена.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Я решил свою проблему путем понижения версии response-native-webrt c до 1.67.1, что вполне совместимо с response native 0.59.0.

0 голосов
/ 10 апреля 2020

[Edit]

Вы делаете ошибку, когда вызываете createOffer ().

createOffer () возвращает значение Promise, поэтому он не использует параметр как обратный вызов.

попробуйте вот так

 if (isOffer){
    pc.createOffer()
        .then(function(desc) {
            console.log("createOffer, desc);
            pc.setLocalDescription(desc);
            // something to do
        }).
        .catch(err => console.error(err));
}

и я рекомендую прочитать этот документ MDN о createOffer ().

...