WebRTC (SFU) - boostcampwm-2022/web36-Japari GitHub Wiki

  • ์ €ํฌ ์กฐ๋Š” SFU ๋ฏธ๋””์–ด ์„œ๋ฒ„๋กœ mediasoup๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”์ƒ๋Œ€ํ™”๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ, ํ•œ ๋ฐฉ์— ์ตœ๋Œ€ 8๋ช…์ด ๋ฐฉ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ์†Œ๊ทœ๋ชจ N:M ํ˜•์‹์˜ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์— ์ ํ•ฉํ•œ SFU ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
    • SFU ๋ฐฉ์‹์€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ํ•„์š”์—†์ด ์„œ๋ฒ„์—๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— P2P ๋ฐฉ์‹๋ณด๋‹ค ํด๋ผ์ด์–ธํŠธ์˜ ๋ถ€ํ•˜๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ง
    1. ์œ ์ €๊ฐ€ ๋กœ์ปฌ stream์„ ์„ค์ •
    2. ํ•ด๋‹น ๋ฐฉ์˜ router๋กœ๋ถ€ํ„ฐ, ์—†๋‹ค๋ฉด router๋ฅผ ์ƒ์„ฑ
    3. ์ฝ”๋ฑ ์œ ํ˜•, ํด๋Ÿญ์†๋„ ๋“ฑ์ด ๋‹ด๊ธด ์ •๋ณด๋ฅผ ๋ฐ›์•„ device๋ฅผ ์ƒ์„ฑ
    4. ๊ทธ๋ฆฌ๊ณ  transport๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ŠคํŠธ๋ฆผ์„ consumeํ•˜๊ฑฐ๋‚˜, ์ž์‹ ์˜ ์ŠคํŠธ๋ฆผ์„ produce
  • ์ฒ˜์Œ ๋ฐ๋ชจ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ์žฅ์น˜๊ฐ€ ์žˆ์–ด์•ผ๋งŒ ํ•ด๋‹น ๋ฐฉ์˜ peer๋กœ ๋“ฑ๋ก๋˜์–ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์žฅ์น˜๊ฐ€ ์—†์–ด๋„ ๋ฐฉ์— ์ž…์žฅํ•˜๋ฉด peer์™€ consumer๋กœ ๋“ฑ๋กํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

    const getLocalStream = () => {
    	navigator.mediaDevices.getUserMedia({...})
    		.then(...)
    		.catch(error => {
    		  localUserMedia = false;
    			...
    	  });
    }
    
    const createSendTransport = async () => {
    	// ์žฅ์น˜๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐ”๋กœ consumer๋กœ ๋“ฑ๋ก
      if (!localUserMedia) {
        getProducers();
        return;
      }
    	
    	// ์žฅ์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ŠคํŠธ๋ฆผ์„ produceํ›„ consumer๋กœ ๋“ฑ๋ก
      socket.emit("media/createWebRtcTransport", { consumer: false }, (transportOptions: TransportOptions) => {
        producerTransport = device.createSendTransport(transportOptions);
        handleCreateProducerTransport();
      });
    };