Golang Pions库使用示例

Golang Pions库使用示例 大家好!

我对Golang感到非常兴奋,想测试名为Pions库的Go语言WebRTC实现。 但在使用该库的示例时遇到了一些问题,无法让它正常工作…

我已经在Stackoverflow上发布了这个问题,但至今没有人回答…

有人能帮帮我吗?或者提供一个超级简单但能正常工作的代码示例? 有没有人已经测试过这个库?

目前我无法建立数据通道的连接,由于某些原因总是失败。

任何建议都将不胜感激!谢谢。


更多关于Golang Pions库使用示例的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Pions库使用示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是使用 Pions (现在已更名为 Pion) 库在 Go 中实现 WebRTC 数据通道的简单工作示例。这个示例创建了两个对等连接(PeerConnection),建立一个数据通道,并交换一条测试消息。确保你已经通过 go get github.com/pion/webrtc/v3 安装了 Pion WebRTC 库(版本 3 或更高)。

代码示例

这个示例使用内存中的信号传输(通过 Go 通道模拟),在实际应用中,你需要通过网络(如 WebSocket)在客户端之间交换信令数据(offer、answer、ICE candidate)。代码分为两部分:一个对等端创建 offer,另一个创建 answer。

package main

import (
    "fmt"
    "log"
    "time"

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

func main() {
    // 配置 WebRTC 对等连接
    config := webrtc.Configuration{
        ICEServers: []webrtc.ICEServer{
            {
                URLs: []string{"stun:stun.l.google.com:19302"},
            },
        },
    }

    // 创建第一个对等连接(offerer)
    peerConnection1, err := webrtc.NewPeerConnection(config)
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if closeErr := peerConnection1.Close(); closeErr != nil {
            log.Fatal(closeErr)
        }
    }()

    // 创建第二个对等连接(answerer)
    peerConnection2, err := webrtc.NewPeerConnection(config)
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        if closeErr := peerConnection2.Close(); closeErr != nil {
            log.Fatal(closeErr)
        }
    }()

    // 设置对等连接 1 的数据通道处理
    peerConnection1.OnDataChannel(func(d *webrtc.DataChannel) {
        fmt.Printf("对等连接 1 收到数据通道: %s\n", d.Label())
        d.OnMessage(func(msg webrtc.DataChannelMessage) {
            fmt.Printf("对等连接 1 收到消息: %s\n", string(msg.Data))
        })
    })

    // 在对等连接 1 上创建数据通道
    dataChannel, err := peerConnection1.CreateDataChannel("test-channel", nil)
    if err != nil {
        log.Fatal(err)
    }
    dataChannel.OnOpen(func() {
        fmt.Println("数据通道打开,从对等连接 1 发送消息")
        err := dataChannel.SendText("Hello from Peer 1!")
        if err != nil {
            log.Fatal(err)
        }
    })

    // 设置对等连接 2 的数据通道处理
    peerConnection2.OnDataChannel(func(d *webrtc.DataChannel) {
        fmt.Printf("对等连接 2 收到数据通道: %s\n", d.Label())
        d.OnOpen(func() {
            fmt.Println("数据通道打开,从对等连接 2 发送消息")
            err := d.SendText("Hello from Peer 2!")
            if err != nil {
                log.Fatal(err)
            }
        })
        d.OnMessage(func(msg webrtc.DataChannelMessage) {
            fmt.Printf("对等连接 2 收到消息: %s\n", string(msg.Data))
        })
    })

    // 创建 offer 并设置本地描述
    offer, err := peerConnection1.CreateOffer(nil)
    if err != nil {
        log.Fatal(err)
    }
    err = peerConnection1.SetLocalDescription(offer)
    if err != nil {
        log.Fatal(err)
    }

    // 将 offer 传递给对等连接 2 并设置远程描述
    err = peerConnection2.SetRemoteDescription(offer)
    if err != nil {
        log.Fatal(err)
    }

    // 创建 answer 并设置本地描述
    answer, err := peerConnection2.CreateAnswer(nil)
    if err != nil {
        log.Fatal(err)
    }
    err = peerConnection2.SetLocalDescription(answer)
    if err != nil {
        log.Fatal(err)
    }

    // 将 answer 传递给对等连接 1 并设置远程描述
    err = peerConnection1.SetRemoteDescription(answer)
    if err != nil {
        log.Fatal(err)
    }

    // 收集并交换 ICE candidate(简化处理)
    peerConnection1.OnICECandidate(func(c *webrtc.ICECandidate) {
        if c == nil {
            return
        }
        err := peerConnection2.AddICECandidate(c.ToJSON())
        if err != nil {
            log.Fatal(err)
        }
    })

    peerConnection2.OnICECandidate(func(c *webrtc.ICECandidate) {
        if c == nil {
            return
        }
        err := peerConnection1.AddICECandidate(c.ToJSON())
        if err != nil {
            log.Fatal(err)
        }
    })

    // 等待连接建立和数据交换
    fmt.Println("等待数据通道通信...")
    time.Sleep(5 * time.Second) // 在实际应用中,使用更可靠的同步方式
    fmt.Println("示例完成")
}

运行说明

  1. 保存代码到文件(如 main.go)。
  2. 运行 go mod init example 初始化模块(如果尚未初始化)。
  3. 运行 go get github.com/pion/webrtc/v3 获取 Pion 库。
  4. 执行 go run main.go

预期输出

运行后,你应该看到类似以下的输出,表明数据通道已成功建立并交换了消息:

等待数据通道通信...
对等连接 2 收到数据通道: test-channel
数据通道打开,从对等连接 2 发送消息
对等连接 1 收到消息: Hello from Peer 2!
数据通道打开,从对等连接 1 发送消息
对等连接 2 收到消息: Hello from Peer 1!
示例完成

常见问题解决

  • 如果遇到 ICE candidate 错误,确保 STUN 服务器 URL 正确(示例中使用的是 Google 公共 STUN 服务器)。
  • 在真实网络中,你需要实现信令服务器来交换 SDP 和 ICE candidate(示例中通过内存直接交换)。
  • 检查防火墙或网络设置,确保允许 UDP 流量用于 WebRTC。

这个示例基于 Pion WebRTC v3 库,如果你使用旧版本,API 可能有所不同。参考 Pion 官方文档 获取更多细节。

回到顶部