๐Ÿ“ฆ asehee / streaming-p2p

โ˜… 0 stars โ‘‚ 0 forks ๐Ÿ‘ 0 watching
๐Ÿ“ฅ Clone https://github.com/asehee/streaming-p2p.git
HTTPS git clone https://github.com/asehee/streaming-p2p.git
SSH git clone git@github.com:asehee/streaming-p2p.git
CLI gh repo clone asehee/streaming-p2p
asehee asehee Create README.md b4a4011 10 months ago ๐Ÿ“ History
๐Ÿ“‚ master View all commits โ†’
๐Ÿ“ public
๐Ÿ“ src
๐Ÿ“„ .gitignore
๐Ÿ“„ index.html
๐Ÿ“„ package-lock.json
๐Ÿ“„ package.json
๐Ÿ“„ README.md
๐Ÿ“„ tsconfig.json
๐Ÿ“„ vite.config.ts
๐Ÿ“„ README.md

P2P ๋ฉ”์‹œ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ SDK

์ดˆ์ €์ง€์—ฐ P2P ๋ฉ”์‹œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ™œ์šฉํ•œ WebRTC ๊ธฐ๋ฐ˜ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ SDK์ž…๋‹ˆ๋‹ค. ์ด SDK๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์•™ ์„œ๋ฒ„ ์˜์กด๋„๋ฅผ ๋‚ฎ์ถ”๋ฉด์„œ๋„ ๋‹ค์ˆ˜์˜ ์‹œ์ฒญ์ž์—๊ฒŒ ๊ณ ํ’ˆ์งˆ์˜ ์ŠคํŠธ๋ฆผ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ง•

์ดˆ์ €์ง€์—ฐ ๋ฉ”์‹œ ๋„คํŠธ์›Œํฌ

  • WebRTC ๋ฐ์ดํ„ฐ ์ฑ„๋„ ์ตœ์ ํ™”๋กœ ์‹ค์‹œ๊ฐ„์— ๊ฐ€๊นŒ์šด ์ŠคํŠธ๋ฆฌ๋ฐ ์ œ๊ณต
  • ์ผ๋ฐ˜ CDN ์ŠคํŠธ๋ฆฌ๋ฐ(5-30์ดˆ ์ง€์—ฐ)๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ๋ฐ˜์‘์„ฑ

์ง€๋Šฅํ˜• ๋„คํŠธ์›Œํฌ ํ† ํด๋กœ์ง€

  • ์ง€๋ฆฌ์  ์œ„์น˜, ๋„คํŠธ์›Œํฌ ์ƒํƒœ, ํ•˜๋“œ์›จ์–ด ์„ฑ๋Šฅ ๋“ฑ์„ ๊ณ ๋ คํ•œ ์ตœ์  ์—ฐ๊ฒฐ ๊ตฌ์„ฑ
  • ๋ณ‘๋ชฉ ํ˜„์ƒ ์ž๋™ ๊ฐ์ง€ ๋ฐ ํ† ํด๋กœ์ง€ ์ตœ์ ํ™”

์ ์‘ํ˜• ํ’ˆ์งˆ ์กฐ์ ˆ

  • ๋„คํŠธ์›Œํฌ ๋ฐ ๋””๋ฐ”์ด์Šค ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ๋™์  ๋น„ํŠธ๋ ˆ์ดํŠธ, ํ•ด์ƒ๋„ ์กฐ์ ˆ
  • MediaCapabilities API๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฐ”์ด์Šค๋ณ„ ์ตœ์  ์ฝ”๋ฑ ์ž๋™ ์„ ํƒ
  • ๋‹ค์–‘ํ•œ ์ฝ”๋ฑ(VP8, H.264, VP9) ์ง€์›

์‹œ์ž‘ํ•˜๊ธฐ

# ์ €์žฅ์†Œ ๋ณต์ œ
git clone https://github.com/yourusername/p2p-mesh-streaming.git

# ์˜์กด์„ฑ ์„ค์น˜
cd p2p-mesh-streaming
npm install

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev

# ๋นŒ๋“œ
npm run build

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์ŠคํŠธ๋ฆฌ๋จธ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

import { createStreamingSDK } from 'p2p-mesh-streaming';

// SDK ์ดˆ๊ธฐํ™”
const streamingSdk = createStreamingSDK({
  roomId: 'unique-room-id',
  config: {
    signalingServer: 'wss://your-signaling-server.com'
  }
});

// ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
streamingSdk.on('connect', () => {
  console.log('์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค');
});

streamingSdk.on('error', (error) => {
  console.error('์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error);
});

// ์ŠคํŠธ๋ฆฌ๋ฐ ์‹œ์ž‘
async function startStream() {
  const stream = await streamingSdk.startStreaming({
    video: {
      width: { ideal: 1280 },
      height: { ideal: 720 },
      frameRate: { ideal: 30 }
    },
    audio: true
  });

  // ๋กœ์ปฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ‘œ์‹œ
  const videoElement = document.getElementById('local-video');
  videoElement.srcObject = stream;
  videoElement.play();
}

// ์ŠคํŠธ๋ฆฌ๋ฐ ์ค‘์ง€
function stopStream() {
  streamingSdk.stop();
}

// ์ŠคํŠธ๋ฆผ ํ’ˆ์งˆ ๋ณ€๊ฒฝ
function changeQuality(quality) {
  // 'low', 'medium', 'high', 'auto' ์ค‘ ์„ ํƒ
  streamingSdk.changeStreamQuality(quality);
}

์‹œ์ฒญ์ž๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

import { createStreamingSDK } from 'p2p-mesh-streaming';

// SDK ์ดˆ๊ธฐํ™” (๊ฐ™์€ roomId ์‚ฌ์šฉ)
const streamingSdk = createStreamingSDK({
  roomId: 'unique-room-id',
  config: {
    signalingServer: 'wss://your-signaling-server.com'
  }
});

// ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
streamingSdk.on('connect', () => {
  console.log('์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค');
});

streamingSdk.on('error', (error) => {
  console.error('์˜ค๋ฅ˜ ๋ฐœ์ƒ:', error);
});

// ์‹œ์ฒญ ์‹œ์ž‘
async function startViewing() {
  const videoElement = document.getElementById('remote-video');
  await streamingSdk.startViewing(videoElement);
}

// ์‹œ์ฒญ ์ค‘์ง€
function stopViewing() {
  streamingSdk.stop();
}

// ๋„คํŠธ์›Œํฌ ํ†ต๊ณ„ ๊ฐ€์ ธ์˜ค๊ธฐ
function getNetworkStats() {
  const stats = streamingSdk.getNetworkStats();
  console.log('๋„คํŠธ์›Œํฌ ํ†ต๊ณ„:', stats);
}

๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ ๋ชจ๋“œ ์‚ฌ์šฉ

์‹ค์ œ ์นด๋ฉ”๋ผ์™€ ์‹œ๊ทธ๋„๋ง ์„œ๋ฒ„ ์—†์ด๋„ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// ํ…Œ์ŠคํŠธ ๋ชจ๋“œ๋กœ SDK ์ดˆ๊ธฐํ™”
const streamingSdk = createStreamingSDK({
  roomId: 'test-room',
  config: {
    testMode: true // ํ…Œ์ŠคํŠธ ๋ชจ๋“œ ํ™œ์„ฑํ™”
  }
});