什么是livekit?
livekit是一个开源的webrtc项目,基于pion实现了SFU架构的go程序。
它主要有以下几个特性:
- 可以水平扩展的sfu架构。
- 有完整的sdk程序接口供开发人员使用。
- 基于JWT进行身份验证,可与大部分系统进行权限集成。
- 内置Turn可给予tcp与udp进行数据传输通信。
- 一个单独的二进制文件,非常容易进行部署。
- 实时扬声器检测
- 联播、选择性订阅和其他自动带宽管理优化
- 用于流导出的通用出口和记录系统
- 元数据、审查和数据消息 API
怎么去使用?
提示:以下所有安装均在docker中进行,由于webrtc限制必须使用安全链接(https)但localhost可作为调试使用,因此以下安装环境在本地进行。
安装livekit
docker 安装请参考官方网站
第一步:生成配置文件
docker run --rm -v$PWD:/output livekit/generate --local (会在当前目录生成livekit.yaml)该文件用于配置livekit-server相关表现。
第二步:通过配置文件运行 livekit
docker run -d -p 7880:7880 -p 7881:7881 -p 7882:7882/udp -v $PWD/livekit.yaml:/livekit.yaml livekit/livekit-server --config /livekit.yaml --node-ip=127.0.0.1
第三步:验证是否成功
livekit自带了一个事例程序供本地调试使用 测试地址
默认情况下在第二步
时候会生成这个token,但是为了更好的理解livekit,我们使用它提供的服务端sdk进行token生成,由于livekit是由go开发而来,所以这里我使用go-sdk进行token生成。
提示:livekit创建房间有两种,第一个用户直接加入默认创建房间,也可以使用sdk先创建房间在加入,以下使用加入房间默认创建的方式。
- 代码如下
func main() {
//用于连接livekit服务器的认证密钥,livekit.yaml中获取
apiKey := "APISejyM9X7wYzw"
apiSecret := "HjY2MvB2yGSCues28GnuhjGN4c02JtSiREL8btGwclQ"
canPublish := true
canSubscribe := true
//生成认证实体
grant := auth.NewAccessToken(apiKey, apiSecret).AddGrant(&auth.VideoGrant{
RoomJoin: true,
Room: "测试房间",
CanPublish: &canPublish,
CanSubscribe: &canSubscribe,
})
//设置实体对象
jwt, err := grant.SetIdentity("张三").SetValidFor(time.Hour).ToJWT()
if err != nil {
}
fmt.Println(jwt)
}
将生成的token填入测试程序如出现如下画面则livekit启动成功。
通过go-sdk作为会议发布者可以将(文件、流)作为数据传递到房间中。
//将文件作为发布者发布到房间
host := "ws://localhost:7880"
apiKey := "APISejyM9X7wYzw"
apiSecret := "HjY2MvB2yGSCues28GnuhjGN4c02JtSiREL8btGwclQ"
roomName := "测试房间"
identity := "0012"
name := "王五"
roomCB := &lksdk.RoomCallback{
ParticipantCallback: lksdk.ParticipantCallback{
OnTrackSubscribed: trackSubscribed,
},
}
room, err := lksdk.ConnectToRoom(host, lksdk.ConnectInfo{
APIKey: apiKey,
APISecret: apiSecret,
RoomName: roomName,
ParticipantIdentity: identity,
ParticipantName: name,
}, roomCB)
if err != nil {
fmt.Println("012", err.Error())
}
file := "demo1.h264"
videoWidth := 960
videoHeight := 720
videoTrack, err2 := lksdk.NewLocalFileTrack(
file,
lksdk.ReaderTrackWithOnWriteComplete(func() {
fmt.Println("track finished")
}),
)
audioTrack, _ := lksdk.NewLocalFileTrack("output.ogg")
if err2 != nil {
fmt.Println("123", err2.Error())
}
_, err1 := room.LocalParticipant.PublishTrack(videoTrack, &lksdk.TrackPublicationOptions{
Name: file,
VideoWidth: videoWidth,
VideoHeight: videoHeight,
})
room.LocalParticipant.PublishTrack(audioTrack, &lksdk.TrackPublicationOptions{
Name: file,
})
if err1 != nil {
fmt.Println("456", err1.Error())
}
//这里必须阻塞一下,否则无法将数据推送出去
select {}
}
func trackSubscribed(track *webrtc.TrackRemote, publication *lksdk.RemoteTrackPublication, rp *lksdk.RemoteParticipant) {
fmt.Println(track.ID())
}
注意: 需要通过阻塞使流能持续推送到流媒体服务器
成功如下图:
通过livekit-cli客户端程序模拟会议参与者进行会议测试
第一步:docker pull livekit-cli 镜像
第二步执行以下命令
docker run -d livekit/livekit-cli load-test --url ws://172.17.0.3:7880 --api-key APISejyM9X7wYzw --api-secret HjY2MvB2yGSCues28GnuhjGN4c02JtSiREL8btGwclQ -room 测试房间 --video-publishers 50
注意:--url 参数来自流媒体服务容器的内网ip