ホームページ  >  記事  >  バックエンド開発  >  Golang 開発: WebRTC ベースのビデオ通話アプリケーションの実装

Golang 開発: WebRTC ベースのビデオ通話アプリケーションの実装

PHPz
PHPzオリジナル
2023-09-20 15:22:501929ブラウズ

Golang 開発: WebRTC ベースのビデオ通話アプリケーションの実装

Golang 開発: WebRTC に基づくビデオ通話アプリケーションの実装

要約:
WebRTC (Web Real-Time Communication) は、リアルタイムのオープン スタンダードです。オーディオおよびビデオ通信テクノロジを使用して、オーディオおよびビデオ通話、会議、リアルタイム ライブ ブロードキャストなどのアプリケーションを構築できます。この記事では、Golang を使用して WebRTC ベースのビデオ通話アプリケーションを開発する方法を紹介し、読者が関連テクノロジーをより深く理解し習得できるように、いくつかの具体的なコード例を示します。

1. 背景
WebRTC は、さまざまな Web ブラウザーやオペレーティング システムで使用できる、オープンなリアルタイム オーディオおよびビデオ通信標準です。 WebRTC を通じて、ブラウザ間でのリアルタイムの音声通話とビデオ通話を実現できます。 WebRTC は、そのオープン性と互換性により、オーディオおよびビデオ通信アプリケーションを構築するためのテクノロジとして推奨されています。

2. 環境の準備
開発を開始する前に、Go 言語の開発環境と WebRTC 関連のライブラリをインストールする必要があります。

1. Golang 開発環境をインストールします:

  • 公式 Web サイト https://golang.org/dl/ にアクセスし、オペレーティング システムに適した Golang バージョンをダウンロードしてインストールします。

2. WebRTC ライブラリをインストールします:

  • WebRTC の Golang 実装は Pion によって開発および保守されており、直接使用できる Golang ライブラリが提供されています。 。次のコマンドを使用して、Pion ライブラリをインストールします:

    go get github.com/pion/webrtc/v3

3. ビデオ通話アプリケーションを作成する
次は、Golang を使用してビデオ通話アプリケーションを作成する方法を示す簡単な例です。そしてWebRTCライブラリ。

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
    "github.com/pion/webrtc/v3"
)

var (
    upgrader = websocket.Upgrader{}
    peers    = map[*websocket.Conn]*webrtc.PeerConnection{}
)

func main() {
    http.HandleFunc("/offer", handleOffer)
    http.HandleFunc("/answer", handleAnswer)
    http.HandleFunc("/ws", handleWebSocket)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleOffer(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    pc, err := webrtc.NewPeerConnection(webrtc.Configuration{})
    if err != nil {
        log.Println(err)
        return
    }

    pc.OnICECandidate(func(candidate *webrtc.ICECandidate) {
        if candidate != nil {
            jsonCandidate, _ := json.Marshal(candidate.ToJSON())
            conn.WriteMessage(websocket.TextMessage, jsonCandidate)
        }
    })

    pc.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {
        go func() {
            for {
                _, _, _ = track.ReadRTP()
            }
        }()
    })

    pc.AddTransceiver(webrtc.RTPCodecTypeVideo)

    peers[conn] = pc

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            delete(peers, conn)
            return
        }
        pc.AddICECandidate(webrtc.ICECandidateInit{
            Candidate: string(message),
        })
    }
}

// handleAnswer 处理answer请求
func handleAnswer(w http.ResponseWriter, r *http.Request) {
    var answer struct {
        Candidate string `json:"candidate"`
    }
    err := json.NewDecoder(r.Body).Decode(&answer)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    pc := peers[conn]
    pc.AddICECandidate(webrtc.ICECandidateInit{
        Candidate: answer.Candidate,
    })
}

// handleWebSocket 处理WebSocket连接请求
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    pc, err := webrtc.NewPeerConnection(webrtc.Configuration{})
    if err != nil {
        log.Println(err)
        return
    }

    pc.OnICECandidate(func(candidate *webrtc.ICECandidate) {
        if candidate != nil {
            jsonCandidate, _ := json.Marshal(candidate.ToJSON())
            conn.WriteMessage(websocket.TextMessage, jsonCandidate)
        }
    })

    pc.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {
        go func() {
            for {
                _, _, _ = track.ReadRTP()
            }
        }()
    })

    offer, err := pc.CreateOffer(nil)
    if err != nil {
        log.Println(err)
        return
    }

    err = pc.SetLocalDescription(offer)
    if err != nil {
        log.Println(err)
        return
    }

    conn.WriteJSON(offer)

    peers[conn] = pc
}

上記のコードでは、Golang の net/http パッケージを使用して、単純な HTTP サーバーを作成しました。サーバーでは、websocket.Upgrader を使用して WebSocket 接続リクエストを処理し、github.com/pion/webrtc/v3 ライブラリを使用して WebRTC 関連の操作を処理します。 peers は、接続とピア接続インスタンスを保持するために使用されるマップです。

4. コンパイルと実行
1. プロジェクトのルート ディレクトリで go mod init コマンドを実行して、go モジュールを初期化します。

2. 次のコマンドを実行して、コードをコンパイルして実行します:

go build -o video-call-app
./video-call-app

5. 概要
上記のサンプル コードを通じて、Golang および WebRTC ライブラリを使用して、 WebRTCベースのビデオ通話アプリ。読者は必要に応じて二次開発や機能拡張を行うことができます。この記事が、Golang 開発で WebRTC ベースの音声通話およびビデオ通話アプリケーションを実装する初心者や開発者に少しでも役立つことを願っています。

参考資料:

  • Pion 公式ドキュメント: https://pkg.go.dev/github.com/pion/webrtc/v3
  • WebRTC 公式ドキュメント:https://webrtc.org/

以上がGolang 開発: WebRTC ベースのビデオ通話アプリケーションの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。