Use this SDK to manage LiveKit rooms and create access tokens from your Go backend.
[!NOTE]
Version 2 of the SDK contains a small set of breaking changes. Read the migration guide for a detailed overview of what has changed.
go get github.com/livekit/server-sdk-go/v2
Note: since v1.0 release, this package requires Go 1.18+ in order to build.
import (
"time"
lksdk "github.com/livekit/server-sdk-go/v2"
"github.com/livekit/protocol/auth"
)
func getJoinToken(apiKey, apiSecret, room, identity string) (string, error) {
at := auth.NewAccessToken(apiKey, apiSecret)
grant := &auth.VideoGrant{
RoomJoin: true,
Room: room,
}
at.AddGrant(grant).
SetIdentity(identity).
SetValidFor(time.Hour)
return at.ToJWT()
}
RoomService gives you complete control over rooms and participants within them. It includes selective track subscriptions as well as moderation capabilities.
import (
lksdk "github.com/livekit/server-sdk-go/v2"
livekit "github.com/livekit/protocol/livekit"
)
func main() {
hostURL := "host-url" // ex: https://project-123456.livekit.cloud
apiKey := "api-key"
apiSecret := "api-secret"
roomName := "myroom"
identity := "participantIdentity"
roomClient := lksdk.NewRoomServiceClient(hostURL, apiKey, apiSecret)
// create a new room
room, _ := roomClient.CreateRoom(context.Background(), &livekit.CreateRoomRequest{
Name: roomName,
})
// list rooms
res, _ := roomClient.ListRooms(context.Background(), &livekit.ListRoomsRequest{})
// terminate a room and cause participants to leave
roomClient.DeleteRoom(context.Background(), &livekit.DeleteRoomRequest{
Room: roomId,
})
// list participants in a room
res, _ := roomClient.ListParticipants(context.Background(), &livekit.ListParticipantsRequest{
Room: roomName,
})
// disconnect a participant from room
roomClient.RemoveParticipant(context.Background(), &livekit.RoomParticipantIdentity{
Room: roomName,
Identity: identity,
})
// mute/unmute participant's tracks
roomClient.MutePublishedTrack(context.Background(), &livekit.MuteRoomTrackRequest{
Room: roomName,
Identity: identity,
TrackSid: "track_sid",
Muted: true,
})
}
The Real-time SDK gives you access programmatic access as a client enabling you to publish and record audio/video/data to the room.
import (
lksdk "github.com/livekit/server-sdk-go/v2"
)
func main() {
hostURL := "host-url" // ex: https://project-123456.livekit.cloud
apiKey := "api-key"
apiSecret := "api-secret"
roomName := "myroom"
identity := "botuser"
roomCB := &lksdk.RoomCallback{
ParticipantCallback: lksdk.ParticipantCallback{
OnTrackSubscribed: trackSubscribed,
},
}
room, err := lksdk.ConnectToRoom(hostURL, lksdk.ConnectInfo{
APIKey: apiKey,
APISecret: apiSecret,
RoomName: roomName,
ParticipantIdentity: identity,
}, roomCB)
if err != nil {
panic(err)
}
...
room.Disconnect()
}
func trackSubscribed(track *webrtc.TrackRemote, publication *lksdk.RemoteTrackPublication, rp *lksdk.RemoteParticipant) {
}
With the Go SDK, you can publish existing files encoded in H.264, VP8, and Opus to the room.
First, you will need to encode media into the right format.
ffmpeg -i <input.mp4> \
-c:v libvpx -keyint_min 120 -qmax 50 -maxrate 2M -b:v 1M <output.ivf> \
-c:a libopus -page_duration 20000 -vn <output.ogg>
The above encodes VP8 at average 1Mbps / max 2Mbps with a minimum keyframe interval of 120.
ffmpeg -i <input.mp4> \
-c:v libx264 -bsf:v h264_mp4toannexb -b:v 2M -profile baseline -pix_fmt yuv420p \
-x264-params keyint=120 -max_delay 0 -bf 0 <output.h264> \
-c:a libopus -page_duration 20000 -vn <output.ogg>
The above encodes H264 with CBS of 2Mbps with a minimum keyframe interval of 120.
file := "video.ivf"
videoWidth := 1920
videoHeight := 1080
track, err := lksdk.NewLocalFileTrack(file,
// control FPS to ensure synchronization
lksdk.ReaderTrackWithFrameDuration(33 * time.Millisecond),
lksdk.ReaderTrackWithOnWriteComplete(func() { fmt.Println("track finished") }),
)
if err != nil {
return err
}
if _, err = room.LocalParticipant.PublishTrack(track, &lksdk.TrackPublicationOptions{
Name: file,
VideoWidth: videoWidth,
VideoHeight: videoHeight,
}); err != nil {
return err
}
// - `in` implements io.ReadCloser, such as buffer or file
// - `mime` has to be one of webrtc.MimeType...
track, err := lksdk.NewLocalReaderTrack(in, mime,
lksdk.ReaderTrackWithFrameDuration(33 * time.Millisecond),
lksdk.ReaderTrackWithOnWriteComplete(func() { fmt.Println("track finished") }),
)
if err != nil {
return err
}
if _, err = room.LocalParticipant.PublishTrack(track, &lksdk.TrackPublicationOptions{}); err != nil {
return err
}
For a full working example, refer to filesender. This example sends all audio/video files in the current directory.
In order to publish from non-file sources, you will have to implement your own SampleProvider
, that could provide frames of data with a NextSample
method.
The SDK takes care of sending the samples to the room.
With video publishing, keyframes can be an order of magnitude larger than delta frames. This size difference can cause a significant increase in bitrate when a keyframe is transmitted, leading to a surge in packet flow. Such spikes might result in packet loss at the forwarding layer. To maintain a consistent packet flow, you can enable the use of a pacer.
import "github.com/livekit/mediatransportutil/pkg/pacer"
// Control total output bitrate to 10Mbps with 1s max latency
pf := pacer.NewPacerFactory(
pacer.LeakyBucketPacer,
pacer.WithBitrate(10000000),
pacer.WithMaxLatency(time.Second),
)
room, err := lksdk.ConnectToRoom(hostURL, lksdk.ConnectInfo{
APIKey: apiKey,
APISecret: apiSecret,
RoomName: roomName,
ParticipantIdentity: identity,
}, &lksdk.RoomCallback{
ParticipantCallback: lksdk.ParticipantCallback{
OnTrackSubscribed: onTrackSubscribed,
},
}, lksdk.WithPacer(pf))
With the Go SDK, you can accept media from the room.
For a full working example, refer to filesaver. This example saves the audio/video in the LiveKit room to the local disk.
The Go SDK helps you to verify and decode webhook callbacks to ensure their authenticity. See webhooks guide for configuration.
import (
"github.com/livekit/protocol/auth"
"github.com/livekit/protocol/livekit"
"github.com/livekit/protocol/webhook"
)
var authProvider = auth.NewSimpleKeyProvider(
apiKey, apiSecret,
)
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
// event is a livekit.WebhookEvent{} object
event, err := webhook.ReceiveWebhookEvent(r, authProvider)
if err != nil {
// could not validate, handle error
return
}
// consume WebhookEvent
}
LiveKit Ecosystem | |
---|---|
Real-time SDKs | React Components · JavaScript · iOS/macOS · Android · Flutter · React Native · Rust · Python · Unity (web) · Unity (beta) |
Server APIs | Node.js · Golang · Ruby · Java/Kotlin · Python · Rust · PHP (community) |
Agents Frameworks | Python · Playground |
Services | Livekit server · Egress · Ingress · SIP |
Resources | Docs · Example apps · Cloud · Self-hosting · CLI |