```

基本的な WebRTC アプリケーションの構築

簡単なピアツーピアのビデオ通話アプリケーションを作成します。この例では、2 つのブラウザ タブを使用してピア接続をシミュレートします。

コードの説明

  1. ローカル ビデオのキャプチャ: getUserMedia を使用して、ユーザーのカメラからビデオをキャプチャします。

  2. ピア接続の作成: ローカル ピアとリモート ピアの間にピア接続を確立します。

  3. オファーと回答の交換: SDP (セッション記述プロトコル) を使用して接続の詳細を交換します。

  4. ICE 候補の処理: ICE 候補を交換して接続を確立します。

次の内容を含む main.js ファイルを作成します:

const localVideo = document.getElementById(\\'localVideo\\');const remoteVideo = document.getElementById(\\'remoteVideo\\');let localStream;let peerConnection;const serverConfig = { iceServers: [{ urls: \\'stun:stun.l.google.com:19302\\' }] };const constraints = { video: true, audio: true };// Get local video streamnavigator.mediaDevices.getUserMedia(constraints)    .then(stream => {        localStream = stream;        localVideo.srcObject = stream;        setupPeerConnection();    })    .catch(error => {        console.error(\\'Error accessing media devices.\\', error);    });function setupPeerConnection() {    peerConnection = new RTCPeerConnection(serverConfig);    // Add local stream to the peer connection    localStream.getTracks().forEach(track => peerConnection.addTrack(track, localStream));    // Handle remote stream    peerConnection.ontrack = event => {        remoteVideo.srcObject = event.streams[0];    };    // Handle ICE candidates    peerConnection.onicecandidate = event => {        if (event.candidate) {            sendSignal({ \\'ice\\': event.candidate });        }    };    // Create an offer and set local description    peerConnection.createOffer()        .then(offer => {            return peerConnection.setLocalDescription(offer);        })        .then(() => {            sendSignal({ \\'offer\\': peerConnection.localDescription });        })        .catch(error => {            console.error(\\'Error creating an offer.\\', error);        });}// Handle signals (for demo purposes, this should be replaced with a signaling server)function sendSignal(signal) {    console.log(\\'Sending signal:\\', signal);    // Here you would send the signal to the other peer (e.g., via WebSocket)}function receiveSignal(signal) {    if (signal.offer) {        peerConnection.setRemoteDescription(new RTCSessionDescription(signal.offer))            .then(() => peerConnection.createAnswer())            .then(answer => peerConnection.setLocalDescription(answer))            .then(() => sendSignal({ \\'answer\\': peerConnection.localDescription }));    } else if (signal.answer) {        peerConnection.setRemoteDescription(new RTCSessionDescription(signal.answer));    } else if (signal.ice) {        peerConnection.addIceCandidate(new RTCIceCandidate(signal.ice));    }}// Simulate receiving a signal from another peer// This would typically be handled by a signaling serversetTimeout(() => {    receiveSignal({        offer: {            type: \\'offer\\',            sdp: \\'...\\' // SDP offer from the other peer        }    });}, 1000);

コードを理解する

  1. メディア キャプチャ: navigator.mediaDevices.getUserMedia はローカル ビデオ ストリームをキャプチャします。
  2. ピア接続セットアップ: RTCPeerConnection はピア接続を管理します。
  3. オファーとアンサー: SDP オファーとアンサーは接続のネゴシエーションに使用されます。
  4. ICE 候補: ICE 候補は、ピア間の接続を確立するために使用されます。
","image":"http://www.luping.net/uploads/20240904/172541269066d7b55299c95.jpg","datePublished":"2024-11-06T08:01:45+08:00","dateModified":"2024-11-06T08:01:45+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > WebRTC の概要

WebRTC の概要

2024 年 11 月 6 日に公開
ブラウズ:179

Introduction to WebRTC

インストールとコードガイド

WebRTC (Web Real-Time Communication) は、Web ブラウザーやモバイル アプリのシンプルな API を介してリアルタイム通信を可能にするオープンソース テクノロジーです。中間サーバーを必要とせずにピア間でオーディオ、ビデオ、データを直接共有できるため、ビデオ会議、ライブ ストリーミング、ファイル共有などのアプリケーションに最適です。

このブログでは、次のトピックについて詳しく説明します:

  1. WebRTC とは何ですか?
  2. WebRTC の主な機能
  3. WebRTC のインストール
  4. 基本的な WebRTC アプリケーションの構築
  5. コードを理解する
  6. 結論

WebRTCとは何ですか?

WebRTC は、Web ブラウザ間のリアルタイムのオーディオ、ビデオ、およびデータ通信を可能にする一連の標準とプロトコルです。これには、いくつかの重要なコンポーネントが含まれています:

  • getUserMedia: ユーザーのデバイスからオーディオおよびビデオ ストリームをキャプチャします。
  • RTCPeerConnection: ピアツーピア接続を管理し、オーディオとビデオのストリーミングを処理します。
  • RTCDataChannel: ピア間のリアルタイムのデータ転送を可能にします。

WebRTC の主な機能

  1. リアルタイム通信: 遅延を最小限に抑えた低遅延通信。
  2. ブラウザの互換性: ほとんどの最新の Web ブラウザ (Chrome、Firefox、Safari、Edge) でサポートされています。
  3. プラグインは不要: 追加のプラグインやソフトウェアなしでブラウザで直接動作します。
  4. 安全: 安全な通信のために暗号化を使用します。

WebRTC のインストール

WebRTC はクライアント側のテクノロジーであり、特定のサーバーのインストールは必要ありません。ただし、HTML および JavaScript ファイルを提供するには Web サーバーが必要です。ローカル開発の場合は、単純な HTTP サーバーを使用できます。

前提条件

  • Node.js: ローカルサーバーをセットアップします。
  • 最新の Web ブラウザ: Chrome、Firefox、Safari、または Edge。

ローカルサーバーのセットアップ

  1. Node.js のインストール: Nodejs.org.

  2. から Node.js をダウンロードしてインストールします。
  3. プロジェクト ディレクトリの作成: ターミナルを開き、プロジェクトの新しいディレクトリを作成します。

    mkdir webrtc-project
    cd webrtc-project
    
  4. Node.js プロジェクトを初期化する:

    npm init -y
    
  5. HTTP サーバーのインストール:

    npm install --save http-server
    
  6. プロジェクト ファイルを作成する:

    • index.html
    • main.js

次の内容を含むindex.htmlファイルを作成します:

```html



    WebRTC Example

WebRTC Example

```

基本的な WebRTC アプリケーションの構築

簡単なピアツーピアのビデオ通話アプリケーションを作成します。この例では、2 つのブラウザ タブを使用してピア接続をシミュレートします。

コードの説明

  1. ローカル ビデオのキャプチャ: getUserMedia を使用して、ユーザーのカメラからビデオをキャプチャします。

  2. ピア接続の作成: ローカル ピアとリモート ピアの間にピア接続を確立します。

  3. オファーと回答の交換: SDP (セッション記述プロトコル) を使用して接続の詳細を交換します。

  4. ICE 候補の処理: ICE 候補を交換して接続を確立します。

次の内容を含む main.js ファイルを作成します:

const localVideo = document.getElementById('localVideo');
const remoteVideo = document.getElementById('remoteVideo');

let localStream;
let peerConnection;
const serverConfig = { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] };
const constraints = { video: true, audio: true };

// Get local video stream
navigator.mediaDevices.getUserMedia(constraints)
    .then(stream => {
        localStream = stream;
        localVideo.srcObject = stream;
        setupPeerConnection();
    })
    .catch(error => {
        console.error('Error accessing media devices.', error);
    });

function setupPeerConnection() {
    peerConnection = new RTCPeerConnection(serverConfig);

    // Add local stream to the peer connection
    localStream.getTracks().forEach(track => peerConnection.addTrack(track, localStream));

    // Handle remote stream
    peerConnection.ontrack = event => {
        remoteVideo.srcObject = event.streams[0];
    };

    // Handle ICE candidates
    peerConnection.onicecandidate = event => {
        if (event.candidate) {
            sendSignal({ 'ice': event.candidate });
        }
    };

    // Create an offer and set local description
    peerConnection.createOffer()
        .then(offer => {
            return peerConnection.setLocalDescription(offer);
        })
        .then(() => {
            sendSignal({ 'offer': peerConnection.localDescription });
        })
        .catch(error => {
            console.error('Error creating an offer.', error);
        });
}

// Handle signals (for demo purposes, this should be replaced with a signaling server)
function sendSignal(signal) {
    console.log('Sending signal:', signal);
    // Here you would send the signal to the other peer (e.g., via WebSocket)
}

function receiveSignal(signal) {
    if (signal.offer) {
        peerConnection.setRemoteDescription(new RTCSessionDescription(signal.offer))
            .then(() => peerConnection.createAnswer())
            .then(answer => peerConnection.setLocalDescription(answer))
            .then(() => sendSignal({ 'answer': peerConnection.localDescription }));
    } else if (signal.answer) {
        peerConnection.setRemoteDescription(new RTCSessionDescription(signal.answer));
    } else if (signal.ice) {
        peerConnection.addIceCandidate(new RTCIceCandidate(signal.ice));
    }
}

// Simulate receiving a signal from another peer
// This would typically be handled by a signaling server
setTimeout(() => {
    receiveSignal({
        offer: {
            type: 'offer',
            sdp: '...' // SDP offer from the other peer
        }
    });
}, 1000);

コードを理解する

  1. メディア キャプチャ: navigator.mediaDevices.getUserMedia はローカル ビデオ ストリームをキャプチャします。
  2. ピア接続セットアップ: RTCPeerConnection はピア接続を管理します。
  3. オファーとアンサー: SDP オファーとアンサーは接続のネゴシエーションに使用されます。
  4. ICE 候補: ICE 候補は、ピア間の接続を確立するために使用されます。
リリースステートメント この記事は次の場所に転載されています: https://dev.to/abhishekjaiswal_4896/introduction-to-webrtc-1ha8?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • Javascript の POST リクエストを理解する
    Javascript の POST リクエストを理解する
    function newPlayer(newForm) { fetch("http://localhost:3000/Players", { method: "POST", headers: { 'Content-Type': 'application...
    プログラミング 2024 年 11 月 6 日に公開
  • Savitzky-Golay フィルタリングを使用してノイズの多い曲線を滑らかにする方法
    Savitzky-Golay フィルタリングを使用してノイズの多い曲線を滑らかにする方法
    ノイズの多いデータの曲線の平滑化: Savitzky-Golay フィルタリングの探索データセットの分析を追求する中で、ノイズの多い曲線を平滑化するという課題が生じます。明瞭さを高め、根底にあるパターンを明らかにします。このタスクに特に効果的な方法の 1 つは、Savitzky-Golay フィルタ...
    プログラミング 2024 年 11 月 6 日に公開
  • 可変引数メソッドのオーバーロード
    可変引数メソッドのオーバーロード
    可変引数メソッドのオーバーロード 可変長の引数を取るメソッドをオーバーロードできます。 このプログラムは、可変引数メソッドをオーバーロードする 2 つの方法を示しています: 1 さまざまな varargs パラメーター タイプ: vaTest(int...) や vaTest(boolean...)...
    プログラミング 2024 年 11 月 6 日に公開
  • クラシック クラス コンポーネント内で React フックを活用するにはどうすればよいですか?
    クラシック クラス コンポーネント内で React フックを活用するにはどうすればよいですか?
    React フックとクラシック クラス コンポーネントの統合React フックはクラスベースのコンポーネント設計の代替手段を提供しますが、既存のクラスに組み込むことで徐々に採用することができます。コンポーネント。これは、高次コンポーネント (HOC) を使用して実現できます。次のクラス コンポーネン...
    プログラミング 2024 年 11 月 6 日に公開
  • Vite と React を使用して高速なシングル ページ アプリケーション (SPA) を構築する方法
    Vite と React を使用して高速なシングル ページ アプリケーション (SPA) を構築する方法
    現代の Web 開発の世界では、シングル ページ アプリケーション (SPA) が、動的で読み込みの速い Web サイトを作成するための一般的な選択肢となっています。 React は、ユーザー インターフェイスを構築するために最も広く使用されている JavaScript ライブラリの 1 つであり、...
    プログラミング 2024 年 11 月 6 日に公開
  • JavaScript での文字列連結のステップバイステップ ガイド
    JavaScript での文字列連結のステップバイステップ ガイド
    JavaScript における文字列の連結 は、2 つ以上の文字列を結合して 1 つの文字列を形成するプロセスです。このガイドでは、演算子、= 演算子、concat() メソッド、テンプレート リテラルの使用など、これを実現するためのさまざまな方法を説明します。 各メソッドはシンプルかつ効果的で...
    プログラミング 2024 年 11 月 6 日に公開
  • Web UX: ユーザーに意味のあるエラーを表示する
    Web UX: ユーザーに意味のあるエラーを表示する
    ユーザー主導でユーザーフレンドリーな Web サイトを作成することは、開発チーム全体が機能やコア ビジネスに価値を付加しないことに多くの時間を費やすことになるため、場合によっては難しい場合があります。しかし、短期的にはユーザーを助け、長期的には価値を付加することができます。納期に厳格なプロジェクト ...
    プログラミング 2024 年 11 月 6 日に公開
  • 小規模クラスのマニピュレーター
    小規模クラスのマニピュレーター
    Small Class マニピュレータの新しいメジャー リリース コードは完全にリファクタリングされ、属性操作の新しいサポートがコーディングされました これは操作の例です: $classFile = \Small\ClassManipulator\ClassManipulator::from...
    プログラミング 2024 年 11 月 6 日に公開
  • 機械学習プロジェクトにおける効果的なモデルのバージョン管理
    機械学習プロジェクトにおける効果的なモデルのバージョン管理
    機械学習 (ML) プロジェクトにおいて、最も重要なコンポーネントの 1 つはバージョン管理です。従来のソフトウェア開発とは異なり、ML プロジェクトの管理にはソース コードだけでなく、時間の経過とともに進化するデータとモデルも関係します。そのため、実験を管理し、最適なモデルを選択し、最終的に実稼働...
    プログラミング 2024 年 11 月 6 日に公開
  • PHPでキーを保持しながら列の値で連想配列をグループ化するにはどうすればよいですか?
    PHPでキーを保持しながら列の値で連想配列をグループ化するにはどうすればよいですか?
    キーを保持しながら列の値で連想配列をグループ化するそれぞれが「id」などの属性を持つエンティティを表す連想配列の配列を考えます。そして「名前」。課題は、元のキーを維持しながら、特定の列 'id' に基づいてこれらの配列をグループ化することです。これを実現するには、PHP の fore...
    プログラミング 2024 年 11 月 6 日に公開
  • Gradle で特定の推移的な依存関係を除外する方法は?
    Gradle で特定の推移的な依存関係を除外する方法は?
    Gradle での推移的な依存関係の除外Gradle では、アプリケーション プラグインを使用して jar ファイルを生成するときに、次のような推移的な依存関係が発生する可能性があります。除外したい場合があります。これを実現するには、exclude メソッドを使用できます。Exclude のデフォル...
    プログラミング 2024 年 11 月 6 日に公開
  • ミニマリスト生活の芸術
    ミニマリスト生活の芸術
    ミニマリストの暮らしとは何ですか? ミニマリスト生活とは、意図的に所有物の数や生活の中の物を減らすライフスタイルです。それは単に空間を整理整頓することではなく、生活をシンプルにし、本当に重要なことに集中し、気を散らすものを減らすことでもあります。 なぜミニマリズムを...
    プログラミング 2024 年 11 月 6 日に公開
  • Java 難読化パズル
    Java 難読化パズル
    Come play with our Java Obfuscator & try to deobfuscate this output. The price is the free activation code! Obfuscated Java code Your goal...
    プログラミング 2024 年 11 月 6 日に公開
  • 画像なしの Outlook メールで角を丸くする方法
    画像なしの Outlook メールで角を丸くする方法
    画像を使用しない Outlook での丸い角のスタイル設定CSS を使用すると、電子メール クライアントで丸い角を簡単に作成できます。ただし、CSS border-radius プロパティを使用する従来の方法は、Microsoft Outlook では機能しません。この制限は、角の丸い要素を含む電子...
    プログラミング 2024 年 11 月 6 日に公開
  • Python で等しいキーと値のペアの辞書を効率的に比較するにはどうすればよいですか?
    Python で等しいキーと値のペアの辞書を効率的に比較するにはどうすればよいですか?
    等しいキーと値のペアの辞書の比較Python では、辞書を比較してキーと値のペアが等しいかどうかを確認するのが一般的なタスクです。 1 つのアプローチは、zip メソッドと iteritems メソッドを使用してディクショナリを反復処理し、各ペアを比較することです。ただし、より優れたコードの優雅さを...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3