Программируемое совместное использование экрана Twilio не работает - PullRequest
0 голосов
/ 06 августа 2020

Я снимаю экран пользователя и публикую эту дорожку в локальном объекте-участнике комнаты, но канал продолжает отображать камеру пользователя. Если я записываю объект комнаты в консоль, он не отображает несколько дорожек. Обязательно ли отменить публикацию sh дорожки камеры пользователя перед попыткой опубликовать sh дорожку экрана пользователя? Я включил свой метод совместного использования экрана, чтобы вы могли его увидеть. Заранее благодарим за любую помощь, которую вы можете предоставить!

Я просмотрел эти ссылки, и код кажется очень похожим на то, что здесь написано, но, увы, он все еще не работает

- https://www.twilio.com/blog/screen-sharing-javascript-twilio-programmable-video

- https://www.twilio.com/blog/2018/01/screen-sharing-twilio-video.html

export default function useScreenShareToggle() {
  const { room, onError } = useVideoContext();
  const [isSharing, setIsSharing] = useState(false);
  const stopScreenShareRef = useRef<() => void>(null!);

  const shareScreen = useCallback(() => {
    navigator.mediaDevices
      .getDisplayMedia({
        audio: false,
        video: {
          frameRate: 10,
          height: 1080,
          width: 1920,
        },
      })
      .then(stream => {
        const track = stream.getTracks()[0];

        // All video tracks are published with 'low' priority. This works because the video
        // track that is displayed in the 'MainParticipant' component will have it's priority
        // set to 'high' via track.setPriority()
        room.localParticipant
          .publishTrack(track, {
            name: 'screen', // Tracks can be named to easily find them later
            priority: 'low', // Priority is set to high by the subscriber when the video track is 
rendered
          } as MediaStreamTrackPublishOptions)
          .then(trackPublication => {
            stopScreenShareRef.current = () => {
              room.localParticipant.unpublishTrack(track);
              // TODO: remove this if the SDK is updated to emit this event
              room.localParticipant.emit('trackUnpublished', trackPublication);
              track.stop();
              setIsSharing(false);
            };

            track.onended = stopScreenShareRef.current;
            setIsSharing(true);
          })
          .catch(onError);
      })
      .catch(error => {
        // Don't display an error if the user closes the screen share dialog
        if (error.name !== 'AbortError' && error.name !== 'NotAllowedError') {
          onError(error);
        }
      });
  }, [room, onError]);

  const toggleScreenShare = useCallback(() => {
    !isSharing ? shareScreen() : stopScreenShareRef.current();
  }, [isSharing, shareScreen, stopScreenShareRef]);

  return [isSharing, toggleScreenShare] as const;
}

Ps Я не писал этот код, поэтому могут быть некоторые нюансы поведения, которые я не замечаю. Если что-то кажется очевидным упущением, есть большая вероятность, что я только что это упустил, и это не намеренно.

...