lksdk

package module
v2.2.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 25, 2024 License: Apache-2.0 Imports: 47 Imported by: 0

README

The LiveKit icon, the name of the repository and some sample code in the background.

LiveKit Go SDK

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.

Installation

go get github.com/livekit/server-sdk-go/v2

Note: since v1.0 release, this package requires Go 1.18+ in order to build.

Token creation

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 API

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,
	})
}

Interacting as a participant

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) {

}

Publishing tracks to Room

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.

VP8 / Opus
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.

H.264 / Opus
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.

Publish from file
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
}
Publish from io.ReadCloser implementation
// - `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.

Publish from other sources

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.

Using a pacer

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))

Receiving tracks from Room

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.

Receiving webhooks

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 SDKsReact Components · Browser · iOS/macOS · Android · Flutter · React Native · Rust · Node.js · Python · Unity (web) · Unity (beta)
Server APIsNode.js · Golang · Ruby · Java/Kotlin · Python · Rust · PHP (community)
Agents FrameworksPython · Playground
ServicesLivekit server · Egress · Ingress · SIP
ResourcesDocs · Example apps · Cloud · Self-hosting · CLI

Documentation

Index

Constants

View Source
const PROTOCOL = 12
View Source
const (
	SimulateSpeakerUpdateInterval = 5
)
View Source
const Version = "2.1.3"

Variables

View Source
var (
	ErrURLNotProvided           = errors.New("URL was not provided")
	ErrConnectionTimeout        = errors.New("could not connect after timeout")
	ErrTrackPublishTimeout      = errors.New("timed out publishing track")
	ErrCannotDetermineMime      = errors.New("cannot determine mimetype from file extension")
	ErrUnsupportedFileType      = errors.New("ReaderSampleProvider does not support this mime type")
	ErrUnsupportedSimulcastKind = errors.New("simulcast is only supported for video")
	ErrInvalidSimulcastTrack    = errors.New("simulcast track was not initiated correctly")
	ErrCannotFindTrack          = errors.New("could not find the track")
	ErrInvalidParameter         = errors.New("invalid parameter")
	ErrCannotConnectSignal      = errors.New("could not establish signal connection")
	ErrCannotDialSignal         = errors.New("could not dial signal connection")
	ErrNoPeerConnection         = errors.New("peer connection not established")
)

Functions

func FromProtoIceServers

func FromProtoIceServers(iceservers []*livekit.ICEServer) []webrtc.ICEServer

func FromProtoSessionDescription

func FromProtoSessionDescription(sd *livekit.SessionDescription) webrtc.SessionDescription

func FromProtoTrickle

func FromProtoTrickle(trickle *livekit.TrickleRequest) webrtc.ICECandidateInit

func ReaderTrackWithFrameDuration

func ReaderTrackWithFrameDuration(duration time.Duration) func(provider *ReaderSampleProvider)

func ReaderTrackWithMime

func ReaderTrackWithMime(mime string) func(provider *ReaderSampleProvider)

func ReaderTrackWithOnWriteComplete

func ReaderTrackWithOnWriteComplete(f func()) func(provider *ReaderSampleProvider)

func ReaderTrackWithRTCPHandler

func ReaderTrackWithRTCPHandler(f func(rtcp.Packet)) func(provider *ReaderSampleProvider)

func ReaderTrackWithSampleOptions

func ReaderTrackWithSampleOptions(opts ...LocalTrackOptions) func(provider *ReaderSampleProvider)

func SetLogger

func SetLogger(l protoLogger.Logger)

SetLogger overrides default logger. To use a [logr](https://github.com/go-logr/logr) compatible logger, pass in SetLogger(logger.LogRLogger(logRLogger))

func ToHttpURL

func ToHttpURL(url string) string

func ToProtoSessionDescription

func ToProtoSessionDescription(sd webrtc.SessionDescription) *livekit.SessionDescription

func ToProtoTrickle

func ToProtoTrickle(candidateInit webrtc.ICECandidateInit, target livekit.SignalTarget) *livekit.TrickleRequest

func ToWebsocketURL

func ToWebsocketURL(url string) string

Types

type AudioSampleProvider

type AudioSampleProvider interface {
	SampleProvider
	CurrentAudioLevel() uint8
}

type BaseSampleProvider

type BaseSampleProvider struct {
}

BaseSampleProvider provides empty implementations for OnBind and OnUnbind

func (*BaseSampleProvider) Close

func (p *BaseSampleProvider) Close() error

func (*BaseSampleProvider) OnBind

func (p *BaseSampleProvider) OnBind() error

func (*BaseSampleProvider) OnUnbind

func (p *BaseSampleProvider) OnUnbind() error

type ConnectInfo

type ConnectInfo struct {
	APIKey              string
	APISecret           string
	RoomName            string
	ParticipantName     string
	ParticipantIdentity string
	ParticipantKind     ParticipantKind
	ParticipantMetadata string
}

type ConnectOption

type ConnectOption func(*connectParams)

func WithAutoSubscribe

func WithAutoSubscribe(val bool) ConnectOption

func WithICETransportPolicy

func WithICETransportPolicy(iceTransportPolicy webrtc.ICETransportPolicy) ConnectOption

func WithInterceptors

func WithInterceptors(interceptors []interceptor.Factory) ConnectOption

func WithPacer

func WithPacer(pacer pacer.Factory) ConnectOption

WithPacer enables the use of a pacer on this connection A pacer helps to smooth out video packet rate to avoid overwhelming downstream. Learn more at: https://chromium.googlesource.com/external/webrtc/+/master/modules/pacing/g3doc/index.md

func WithRetransmitBufferSize

func WithRetransmitBufferSize(val uint16) ConnectOption

Retransmit buffer size to reponse to nack request, must be one of: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768

type ConnectionState

type ConnectionState string
const (
	ConnectionStateConnected    ConnectionState = "connected"
	ConnectionStateReconnecting ConnectionState = "reconnecting"
	ConnectionStateDisconnected ConnectionState = "disconnected"
)

type DataPacket

type DataPacket interface {
	ToProto() *livekit.DataPacket
}

type DataPublishOption

type DataPublishOption func(*dataPublishOptions)

func WithDataPublishDestination

func WithDataPublishDestination(identities []string) DataPublishOption

func WithDataPublishReliable

func WithDataPublishReliable(reliable bool) DataPublishOption

func WithDataPublishTopic

func WithDataPublishTopic(topic string) DataPublishOption

type DataReceiveParams

type DataReceiveParams struct {
	Sender         *RemoteParticipant
	SenderIdentity string
	Topic          string // Deprecated: Use UserDataPacket.Topic
}

type DisconnectionReason

type DisconnectionReason string
const (
	LeaveRequested DisconnectionReason = "leave requested by room"
	Failed         DisconnectionReason = "connection to room failed"
)

type EgressClient

type EgressClient struct {
	// contains filtered or unexported fields
}

func NewEgressClient

func NewEgressClient(url string, apiKey string, secretKey string, opts ...twirp.ClientOption) *EgressClient

func (*EgressClient) ListEgress

func (*EgressClient) StartParticipantEgress

func (c *EgressClient) StartParticipantEgress(ctx context.Context, req *livekit.ParticipantEgressRequest) (*livekit.EgressInfo, error)

func (*EgressClient) StartRoomCompositeEgress

func (c *EgressClient) StartRoomCompositeEgress(ctx context.Context, req *livekit.RoomCompositeEgressRequest) (*livekit.EgressInfo, error)

func (*EgressClient) StartTrackCompositeEgress

func (c *EgressClient) StartTrackCompositeEgress(ctx context.Context, req *livekit.TrackCompositeEgressRequest) (*livekit.EgressInfo, error)

func (*EgressClient) StartTrackEgress

func (c *EgressClient) StartTrackEgress(ctx context.Context, req *livekit.TrackEgressRequest) (*livekit.EgressInfo, error)

func (*EgressClient) StartWebEgress

func (c *EgressClient) StartWebEgress(ctx context.Context, req *livekit.WebEgressRequest) (*livekit.EgressInfo, error)

func (*EgressClient) StopEgress

func (*EgressClient) UpdateLayout

func (*EgressClient) UpdateStream

type IngressClient

type IngressClient struct {
	// contains filtered or unexported fields
}

func NewIngressClient

func NewIngressClient(url string, apiKey string, secretKey string, opts ...twirp.ClientOption) *IngressClient

func (*IngressClient) CreateIngress

func (*IngressClient) DeleteIngress

func (*IngressClient) ListIngress

func (*IngressClient) UpdateIngress

type LocalParticipant

type LocalParticipant struct {
	// contains filtered or unexported fields
}

func (*LocalParticipant) AudioLevel

func (p *LocalParticipant) AudioLevel() float32

func (*LocalParticipant) GetPublisherPeerConnection

func (p *LocalParticipant) GetPublisherPeerConnection() *webrtc.PeerConnection

GetPublisherPeerConnection is a power-user API that gives access to the underlying publisher peer connection local tracks are published to server via this PeerConnection

func (*LocalParticipant) GetSubscriberPeerConnection

func (p *LocalParticipant) GetSubscriberPeerConnection() *webrtc.PeerConnection

GetSubscriberPeerConnection is a power-user API that gives access to the underlying subscriber peer connection subscribed tracks are received using this PeerConnection

func (*LocalParticipant) GetTrackPublication

func (p *LocalParticipant) GetTrackPublication(source livekit.TrackSource) TrackPublication

func (*LocalParticipant) Identity

func (p *LocalParticipant) Identity() string

func (*LocalParticipant) IsCameraEnabled

func (p *LocalParticipant) IsCameraEnabled() bool

func (*LocalParticipant) IsMicrophoneEnabled

func (p *LocalParticipant) IsMicrophoneEnabled() bool

func (*LocalParticipant) IsScreenShareAudioEnabled

func (p *LocalParticipant) IsScreenShareAudioEnabled() bool

func (*LocalParticipant) IsScreenShareEnabled

func (p *LocalParticipant) IsScreenShareEnabled() bool

func (*LocalParticipant) IsSpeaking

func (p *LocalParticipant) IsSpeaking() bool

func (*LocalParticipant) Kind

func (p *LocalParticipant) Kind() ParticipantKind

func (*LocalParticipant) Metadata

func (p *LocalParticipant) Metadata() string

func (*LocalParticipant) Name

func (p *LocalParticipant) Name() string

func (*LocalParticipant) Permissions

func (p *LocalParticipant) Permissions() *livekit.ParticipantPermission

func (*LocalParticipant) PublishData deprecated

func (p *LocalParticipant) PublishData(payload []byte, opts ...DataPublishOption) error

PublishData sends custom user data via WebRTC data channel.

By default, the message can be received by all participants in a room, see WithDataPublishDestination for choosing specific participants.

Messages are sent via a LOSSY channel by default, see WithDataPublishReliable for sending reliable data.

Deprecated: Use PublishDataPacket with UserData instead.

func (*LocalParticipant) PublishDataPacket

func (p *LocalParticipant) PublishDataPacket(pck DataPacket, opts ...DataPublishOption) error

PublishDataPacket sends a packet via a WebRTC data channel. UserData can be used for sending custom user data.

By default, the message can be received by all participants in a room, see WithDataPublishDestination for choosing specific participants.

Messages are sent via UDP and offer no delivery guarantees, see WithDataPublishReliable for sending data reliably (with retries).

func (*LocalParticipant) PublishSimulcastTrack

func (p *LocalParticipant) PublishSimulcastTrack(tracks []*LocalTrack, opts *TrackPublicationOptions) (*LocalTrackPublication, error)

PublishSimulcastTrack publishes up to three layers to the server

func (*LocalParticipant) PublishTrack

func (p *LocalParticipant) PublishTrack(track webrtc.TrackLocal, opts *TrackPublicationOptions) (*LocalTrackPublication, error)

func (*LocalParticipant) SID

func (p *LocalParticipant) SID() string

func (*LocalParticipant) SetMetadata

func (p *LocalParticipant) SetMetadata(metadata string)

SetMetadata sets the metadata of the current participant. updates will be performed only if the participant has canUpdateOwnMetadata grant

func (*LocalParticipant) SetName

func (p *LocalParticipant) SetName(name string)

SetName sets the name of the current participant. updates will be performed only if the participant has canUpdateOwnMetadata grant

func (*LocalParticipant) TrackPublications

func (p *LocalParticipant) TrackPublications() []TrackPublication

func (*LocalParticipant) UnpublishTrack

func (p *LocalParticipant) UnpublishTrack(sid string) error

type LocalSampleTrack

type LocalSampleTrack = LocalTrack

type LocalSampleTrackOptions

type LocalSampleTrackOptions = LocalTrackOptions

type LocalTrack

type LocalTrack struct {
	// contains filtered or unexported fields
}

LocalTrack is a local track that simplifies writing samples. It handles timing and publishing of things, so as long as a SampleProvider is provided, the class takes care of publishing tracks at the right frequency This extends webrtc.TrackLocalStaticSample, and adds the ability to write RTP extensions

func NewLocalFileTrack

func NewLocalFileTrack(file string, options ...ReaderSampleProviderOption) (*LocalTrack, error)

NewLocalFileTrack creates an *os.File reader for NewLocalReaderTrack

func NewLocalReaderTrack

func NewLocalReaderTrack(in io.ReadCloser, mime string, options ...ReaderSampleProviderOption) (*LocalTrack, error)

NewLocalReaderTrack uses io.ReadCloser interface to adapt to various ingress types - mime: has to be one of webrtc.MimeType... (e.g. webrtc.MimeTypeOpus)

func NewLocalSampleTrack

func NewLocalSampleTrack(c webrtc.RTPCodecCapability, opts ...LocalTrackOptions) (*LocalTrack, error)

func NewLocalTrack

func NewLocalTrack(c webrtc.RTPCodecCapability, opts ...LocalTrackOptions) (*LocalTrack, error)

func (*LocalTrack) Bind

func (s *LocalTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters, error)

Bind is an interface for TrackLocal, not for external consumption

func (*LocalTrack) Close

func (s *LocalTrack) Close() error

func (*LocalTrack) Codec

func (s *LocalTrack) Codec() webrtc.RTPCodecCapability

Codec gets the Codec of the track

func (*LocalTrack) ID

func (s *LocalTrack) ID() string

ID is the unique identifier for this Track. This should be unique for the stream, but doesn't have to globally unique. A common example would be 'audio' or 'video' and StreamID would be 'desktop' or 'webcam'

func (*LocalTrack) IsBound

func (s *LocalTrack) IsBound() bool

func (*LocalTrack) Kind

func (s *LocalTrack) Kind() webrtc.RTPCodecType

Kind controls if this TrackLocal is audio or video

func (*LocalTrack) OnBind

func (s *LocalTrack) OnBind(f func())

OnBind sets a callback to be called when the track has been negotiated for publishing and bound to a peer connection

func (*LocalTrack) OnUnbind

func (s *LocalTrack) OnUnbind(f func())

OnUnbind sets a callback to be called after the track is removed from a peer connection

func (*LocalTrack) RID

func (s *LocalTrack) RID() string

RID is the RTP stream identifier.

func (*LocalTrack) SSRC

func (s *LocalTrack) SSRC() webrtc.SSRC

func (*LocalTrack) SetTransceiver

func (s *LocalTrack) SetTransceiver(transceiver *webrtc.RTPTransceiver)

func (*LocalTrack) StartWrite

func (s *LocalTrack) StartWrite(provider SampleProvider, onComplete func()) error

func (*LocalTrack) StreamID

func (s *LocalTrack) StreamID() string

StreamID is the group this track belongs too. This must be unique

func (*LocalTrack) Unbind

func (s *LocalTrack) Unbind(t webrtc.TrackLocalContext) error

Unbind is an interface for TrackLocal, not for external consumption

func (*LocalTrack) WriteRTP

func (s *LocalTrack) WriteRTP(p *rtp.Packet, opts *SampleWriteOptions) error

func (*LocalTrack) WriteSample

func (s *LocalTrack) WriteSample(sample media.Sample, opts *SampleWriteOptions) error

type LocalTrackOptions

type LocalTrackOptions func(s *LocalTrack)

func WithRTCPHandler

func WithRTCPHandler(cb func(rtcp.Packet)) LocalTrackOptions

func WithSimulcast

func WithSimulcast(simulcastID string, layer *livekit.VideoLayer) LocalTrackOptions

WithSimulcast marks the current track for simulcasting. In order to use simulcast, simulcastID must be identical across all layers

type LocalTrackPublication

type LocalTrackPublication struct {
	// contains filtered or unexported fields
}

func NewLocalTrackPublication

func NewLocalTrackPublication(kind TrackKind, track Track, opts TrackPublicationOptions, client *SignalClient) *LocalTrackPublication

func (*LocalTrackPublication) CloseTrack

func (p *LocalTrackPublication) CloseTrack()

func (*LocalTrackPublication) GetSimulcastTrack

func (p *LocalTrackPublication) GetSimulcastTrack(quality livekit.VideoQuality) *LocalTrack

func (*LocalTrackPublication) IsMuted

func (p *LocalTrackPublication) IsMuted() bool

func (*LocalTrackPublication) IsSubscribed

func (p *LocalTrackPublication) IsSubscribed() bool

func (*LocalTrackPublication) Kind

func (p *LocalTrackPublication) Kind() TrackKind

func (*LocalTrackPublication) MimeType

func (p *LocalTrackPublication) MimeType() string

func (*LocalTrackPublication) Name

func (p *LocalTrackPublication) Name() string

func (*LocalTrackPublication) PublicationOptions

func (p *LocalTrackPublication) PublicationOptions() TrackPublicationOptions

func (*LocalTrackPublication) SID

func (p *LocalTrackPublication) SID() string

func (*LocalTrackPublication) SetMuted

func (p *LocalTrackPublication) SetMuted(muted bool)

func (*LocalTrackPublication) Source

func (p *LocalTrackPublication) Source() livekit.TrackSource

func (*LocalTrackPublication) Track

func (p *LocalTrackPublication) Track() Track

func (*LocalTrackPublication) TrackInfo

func (p *LocalTrackPublication) TrackInfo() *livekit.TrackInfo

func (*LocalTrackPublication) TrackLocal

func (p *LocalTrackPublication) TrackLocal() webrtc.TrackLocal

type LocalTrackWithClose

type LocalTrackWithClose interface {
	webrtc.TrackLocal
	Close() error
}

type NullSampleProvider

type NullSampleProvider struct {
	BaseSampleProvider
	BytesPerSample uint32
	SampleDuration time.Duration
}

NullSampleProvider is a media provider that provides null packets, it could meet a certain bitrate, if desired

func NewNullSampleProvider

func NewNullSampleProvider(bitrate uint32) *NullSampleProvider

func (*NullSampleProvider) NextSample

func (p *NullSampleProvider) NextSample(ctx context.Context) (media.Sample, error)

type PCTransport

type PCTransport struct {
	OnOffer func(description webrtc.SessionDescription)
	// contains filtered or unexported fields
}

PCTransport is a wrapper around PeerConnection, with some helper methods

func NewPCTransport

func NewPCTransport(params PCTransportParams) (*PCTransport, error)

func (*PCTransport) AddICECandidate

func (t *PCTransport) AddICECandidate(candidate webrtc.ICECandidateInit) error

func (*PCTransport) Close

func (t *PCTransport) Close() error

func (*PCTransport) GetSelectedCandidatePair

func (t *PCTransport) GetSelectedCandidatePair() (*webrtc.ICECandidatePair, error)

func (*PCTransport) IsConnected

func (t *PCTransport) IsConnected() bool

func (*PCTransport) Negotiate

func (t *PCTransport) Negotiate()

func (*PCTransport) OnRemoteDescriptionSettled

func (t *PCTransport) OnRemoteDescriptionSettled(f func() error)

func (*PCTransport) PeerConnection

func (t *PCTransport) PeerConnection() *webrtc.PeerConnection

func (*PCTransport) SetRTT

func (t *PCTransport) SetRTT(rtt uint32)

func (*PCTransport) SetRemoteDescription

func (t *PCTransport) SetRemoteDescription(sd webrtc.SessionDescription) error

type PCTransportParams

type PCTransportParams struct {
	Configuration webrtc.Configuration

	RetransmitBufferSize uint16
	Pacer                pacer.Factory
	Interceptors         []interceptor.Factory
	OnRTTUpdate          func(rtt uint32)
	IsSender             bool
}

type PLIWriter

type PLIWriter func(webrtc.SSRC)

type Participant

type Participant interface {
	SID() string
	Identity() string
	Name() string
	Kind() ParticipantKind
	IsSpeaking() bool
	AudioLevel() float32
	TrackPublications() []TrackPublication
	IsCameraEnabled() bool
	IsMicrophoneEnabled() bool
	IsScreenShareEnabled() bool
	IsScreenShareAudioEnabled() bool
	Metadata() string
	GetTrackPublication(source livekit.TrackSource) TrackPublication
	Permissions() *livekit.ParticipantPermission
	// contains filtered or unexported methods
}

type ParticipantCallback

type ParticipantCallback struct {
	// for all participants
	OnTrackMuted               func(pub TrackPublication, p Participant)
	OnTrackUnmuted             func(pub TrackPublication, p Participant)
	OnMetadataChanged          func(oldMetadata string, p Participant)
	OnIsSpeakingChanged        func(p Participant)
	OnConnectionQualityChanged func(update *livekit.ConnectionQualityInfo, p Participant)

	// for remote participants
	OnTrackSubscribed         func(track *webrtc.TrackRemote, publication *RemoteTrackPublication, rp *RemoteParticipant)
	OnTrackUnsubscribed       func(track *webrtc.TrackRemote, publication *RemoteTrackPublication, rp *RemoteParticipant)
	OnTrackSubscriptionFailed func(sid string, rp *RemoteParticipant)
	OnTrackPublished          func(publication *RemoteTrackPublication, rp *RemoteParticipant)
	OnTrackUnpublished        func(publication *RemoteTrackPublication, rp *RemoteParticipant)
	OnDataReceived            func(data []byte, params DataReceiveParams) // Deprecated: Use OnDataPacket instead
	OnDataPacket              func(data DataPacket, params DataReceiveParams)
}

func NewParticipantCallback

func NewParticipantCallback() *ParticipantCallback

func (*ParticipantCallback) Merge

func (cb *ParticipantCallback) Merge(other *ParticipantCallback)

type ParticipantKind

type ParticipantKind int

type PubCallback

type PubCallback func(pub TrackPublication, participant *RemoteParticipant)

type RTCEngine

type RTCEngine struct {
	JoinTimeout time.Duration

	// callbacks
	OnDisconnected      func(reason DisconnectionReason)
	OnMediaTrack        func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver)
	OnParticipantUpdate func([]*livekit.ParticipantInfo)
	OnSpeakersChanged   func([]*livekit.SpeakerInfo)
	OnDataReceived      func(userPacket *livekit.UserPacket) // Deprecated: Use OnDataPacket instead
	OnDataPacket        func(identity string, dataPacket DataPacket)
	OnConnectionQuality func([]*livekit.ConnectionQualityInfo)
	OnRoomUpdate        func(room *livekit.Room)
	OnRestarting        func()
	OnRestarted         func(*livekit.JoinResponse)
	OnResuming          func()
	OnResumed           func()
	// contains filtered or unexported fields
}

func NewRTCEngine

func NewRTCEngine() *RTCEngine

func (*RTCEngine) Close

func (e *RTCEngine) Close()

func (*RTCEngine) GetDataChannel

func (e *RTCEngine) GetDataChannel(kind livekit.DataPacket_Kind) *webrtc.DataChannel

func (*RTCEngine) GetDataChannelSub

func (e *RTCEngine) GetDataChannelSub(kind livekit.DataPacket_Kind) *webrtc.DataChannel

func (*RTCEngine) IsConnected

func (e *RTCEngine) IsConnected() bool

func (*RTCEngine) Join

func (e *RTCEngine) Join(url string, token string, params *connectParams) (*livekit.JoinResponse, error)

func (*RTCEngine) Publisher

func (e *RTCEngine) Publisher() (*PCTransport, bool)

func (*RTCEngine) Subscriber

func (e *RTCEngine) Subscriber() (*PCTransport, bool)

func (*RTCEngine) TrackPublishedChan

func (e *RTCEngine) TrackPublishedChan() <-chan *livekit.TrackPublishedResponse

type ReaderSampleProvider

type ReaderSampleProvider struct {
	// Configuration
	Mime            string
	FrameDuration   time.Duration
	OnWriteComplete func()
	AudioLevel      uint8
	// contains filtered or unexported fields
}

ReaderSampleProvider provides samples by reading from an io.ReadCloser implementation

func (*ReaderSampleProvider) Close

func (p *ReaderSampleProvider) Close() error

func (*ReaderSampleProvider) CurrentAudioLevel

func (p *ReaderSampleProvider) CurrentAudioLevel() uint8

func (*ReaderSampleProvider) NextSample

func (p *ReaderSampleProvider) NextSample(ctx context.Context) (media.Sample, error)

func (*ReaderSampleProvider) OnBind

func (p *ReaderSampleProvider) OnBind() error

func (*ReaderSampleProvider) OnUnbind

func (p *ReaderSampleProvider) OnUnbind() error

type ReaderSampleProviderOption

type ReaderSampleProviderOption func(*ReaderSampleProvider)

type RemoteParticipant

type RemoteParticipant struct {
	// contains filtered or unexported fields
}

func (*RemoteParticipant) AudioLevel

func (p *RemoteParticipant) AudioLevel() float32

func (*RemoteParticipant) GetTrackPublication

func (p *RemoteParticipant) GetTrackPublication(source livekit.TrackSource) TrackPublication

func (*RemoteParticipant) Identity

func (p *RemoteParticipant) Identity() string

func (*RemoteParticipant) IsCameraEnabled

func (p *RemoteParticipant) IsCameraEnabled() bool

func (*RemoteParticipant) IsMicrophoneEnabled

func (p *RemoteParticipant) IsMicrophoneEnabled() bool

func (*RemoteParticipant) IsScreenShareAudioEnabled

func (p *RemoteParticipant) IsScreenShareAudioEnabled() bool

func (*RemoteParticipant) IsScreenShareEnabled

func (p *RemoteParticipant) IsScreenShareEnabled() bool

func (*RemoteParticipant) IsSpeaking

func (p *RemoteParticipant) IsSpeaking() bool

func (*RemoteParticipant) Kind

func (p *RemoteParticipant) Kind() ParticipantKind

func (*RemoteParticipant) Metadata

func (p *RemoteParticipant) Metadata() string

func (*RemoteParticipant) Name

func (p *RemoteParticipant) Name() string

func (*RemoteParticipant) Permissions

func (p *RemoteParticipant) Permissions() *livekit.ParticipantPermission

func (*RemoteParticipant) SID

func (p *RemoteParticipant) SID() string

func (*RemoteParticipant) TrackPublications

func (p *RemoteParticipant) TrackPublications() []TrackPublication

func (*RemoteParticipant) WritePLI

func (p *RemoteParticipant) WritePLI(ssrc webrtc.SSRC)

type RemoteTrackPublication

type RemoteTrackPublication struct {
	// contains filtered or unexported fields
}

func (*RemoteTrackPublication) IsEnabled

func (p *RemoteTrackPublication) IsEnabled() bool

func (*RemoteTrackPublication) IsMuted

func (p *RemoteTrackPublication) IsMuted() bool

func (*RemoteTrackPublication) IsSubscribed

func (p *RemoteTrackPublication) IsSubscribed() bool

func (*RemoteTrackPublication) Kind

func (p *RemoteTrackPublication) Kind() TrackKind

func (*RemoteTrackPublication) MimeType

func (p *RemoteTrackPublication) MimeType() string

func (*RemoteTrackPublication) Name

func (p *RemoteTrackPublication) Name() string

func (*RemoteTrackPublication) OnRTCP

func (p *RemoteTrackPublication) OnRTCP(cb func(rtcp.Packet))

func (*RemoteTrackPublication) Receiver

func (p *RemoteTrackPublication) Receiver() *webrtc.RTPReceiver

func (*RemoteTrackPublication) SID

func (p *RemoteTrackPublication) SID() string

func (*RemoteTrackPublication) SetEnabled

func (p *RemoteTrackPublication) SetEnabled(enabled bool)

func (*RemoteTrackPublication) SetSubscribed

func (p *RemoteTrackPublication) SetSubscribed(subscribed bool) error

func (*RemoteTrackPublication) SetVideoDimensions

func (p *RemoteTrackPublication) SetVideoDimensions(width uint32, height uint32)

func (*RemoteTrackPublication) SetVideoQuality

func (p *RemoteTrackPublication) SetVideoQuality(quality livekit.VideoQuality) error

func (*RemoteTrackPublication) Source

func (p *RemoteTrackPublication) Source() livekit.TrackSource

func (*RemoteTrackPublication) Track

func (p *RemoteTrackPublication) Track() Track

func (*RemoteTrackPublication) TrackInfo

func (p *RemoteTrackPublication) TrackInfo() *livekit.TrackInfo

func (*RemoteTrackPublication) TrackRemote

func (p *RemoteTrackPublication) TrackRemote() *webrtc.TrackRemote

type Room

type Room struct {
	LocalParticipant *LocalParticipant
	// contains filtered or unexported fields
}

func ConnectToRoom

func ConnectToRoom(url string, info ConnectInfo, callback *RoomCallback, opts ...ConnectOption) (*Room, error)

ConnectToRoom creates and joins the room

func ConnectToRoomWithToken

func ConnectToRoomWithToken(url, token string, callback *RoomCallback, opts ...ConnectOption) (*Room, error)

ConnectToRoomWithToken creates and joins the room

func NewRoom

func NewRoom(callback *RoomCallback) *Room

NewRoom can be used to update callbacks before calling Join

func (*Room) ActiveSpeakers

func (r *Room) ActiveSpeakers() []Participant

func (*Room) ConnectionState

func (r *Room) ConnectionState() ConnectionState

func (*Room) Disconnect

func (r *Room) Disconnect()

func (*Room) GetParticipantByIdentity

func (r *Room) GetParticipantByIdentity(identity string) *RemoteParticipant

func (*Room) GetParticipantBySID

func (r *Room) GetParticipantBySID(sid string) *RemoteParticipant

func (*Room) GetRemoteParticipants

func (r *Room) GetRemoteParticipants() []*RemoteParticipant

func (*Room) Join

func (r *Room) Join(url string, info ConnectInfo, opts ...ConnectOption) error

Join - joins the room as with default permissions

func (*Room) JoinWithToken

func (r *Room) JoinWithToken(url, token string, opts ...ConnectOption) error

JoinWithToken - customize participant options by generating your own token

func (*Room) Metadata

func (r *Room) Metadata() string

func (*Room) Name

func (r *Room) Name() string

func (*Room) SID

func (r *Room) SID() string

func (*Room) ServerInfo

func (r *Room) ServerInfo() *livekit.ServerInfo

func (*Room) Simulate

func (r *Room) Simulate(scenario SimulateScenario)

type RoomCallback

type RoomCallback struct {
	OnDisconnected            func()
	OnDisconnectedWithReason  func(reason DisconnectionReason)
	OnParticipantConnected    func(*RemoteParticipant)
	OnParticipantDisconnected func(*RemoteParticipant)
	OnActiveSpeakersChanged   func([]Participant)
	OnRoomMetadataChanged     func(metadata string)
	OnReconnecting            func()
	OnReconnected             func()

	// participant events are sent to the room as well
	ParticipantCallback
}

func NewRoomCallback

func NewRoomCallback() *RoomCallback

func (*RoomCallback) Merge

func (cb *RoomCallback) Merge(other *RoomCallback)

type RoomServiceClient

type RoomServiceClient struct {
	// contains filtered or unexported fields
}

func NewRoomServiceClient

func NewRoomServiceClient(url string, apiKey string, secretKey string, opts ...twirp.ClientOption) *RoomServiceClient

func (*RoomServiceClient) CreateRoom

func (*RoomServiceClient) CreateToken

func (c *RoomServiceClient) CreateToken() *auth.AccessToken

func (*RoomServiceClient) DeleteRoom

func (*RoomServiceClient) GetParticipant

func (*RoomServiceClient) ListParticipants

func (*RoomServiceClient) ListRooms

func (*RoomServiceClient) MutePublishedTrack

func (*RoomServiceClient) RemoveParticipant

func (*RoomServiceClient) SendData

func (*RoomServiceClient) UpdateParticipant

func (*RoomServiceClient) UpdateRoomMetadata

func (c *RoomServiceClient) UpdateRoomMetadata(ctx context.Context, req *livekit.UpdateRoomMetadataRequest) (*livekit.Room, error)

type SIPClient

type SIPClient struct {
	// contains filtered or unexported fields
}

func NewSIPClient

func NewSIPClient(url string, apiKey string, secretKey string, opts ...twirp.ClientOption) *SIPClient

NewSIPClient creates a LiveKit SIP client.

func (*SIPClient) CreateSIPDispatchRule

CreateSIPDispatchRule creates SIP Dispatch Rules.

func (*SIPClient) CreateSIPInboundTrunk

CreateSIPInboundTrunk creates a new SIP Trunk for accepting inbound calls to LiveKit.

func (*SIPClient) CreateSIPOutboundTrunk

CreateSIPOutboundTrunk creates a new SIP Trunk for making outbound calls from LiveKit.

func (*SIPClient) CreateSIPParticipant

CreateSIPParticipant creates SIP Participant by making an outbound call.

func (*SIPClient) CreateSIPTrunk deprecated

CreateSIPTrunk creates a new SIP Trunk.

Deprecated: Use CreateSIPInboundTrunk or CreateSIPOutboundTrunk

func (*SIPClient) DeleteSIPDispatchRule

DeleteSIPDispatchRule deletes SIP Dispatch Rule given an ID.

func (*SIPClient) DeleteSIPTrunk

DeleteSIPTrunk deletes SIP Trunk given an ID.

func (*SIPClient) ListSIPDispatchRule

ListSIPDispatchRule lists SIP Dispatch Rules.

func (*SIPClient) ListSIPInboundTrunk

ListSIPInboundTrunk lists SIP Trunks accepting inbound calls.

func (*SIPClient) ListSIPOutboundTrunk

ListSIPOutboundTrunk lists SIP Trunks for making outbound calls.

func (*SIPClient) ListSIPTrunk deprecated

ListSIPTrunk lists SIP Trunks.

Deprecated: Use ListSIPInboundTrunk or ListSIPOutboundTrunk

type SampleProvider

type SampleProvider interface {
	NextSample(context.Context) (media.Sample, error)
	OnBind() error
	OnUnbind() error
	Close() error
}

type SampleWriteOptions

type SampleWriteOptions struct {
	AudioLevel *uint8
}

type SignalClient

type SignalClient struct {
	OnClose                 func()
	OnAnswer                func(sd webrtc.SessionDescription)
	OnOffer                 func(sd webrtc.SessionDescription)
	OnTrickle               func(init webrtc.ICECandidateInit, target livekit.SignalTarget)
	OnParticipantUpdate     func([]*livekit.ParticipantInfo)
	OnLocalTrackPublished   func(response *livekit.TrackPublishedResponse)
	OnSpeakersChanged       func([]*livekit.SpeakerInfo)
	OnConnectionQuality     func([]*livekit.ConnectionQualityInfo)
	OnRoomUpdate            func(room *livekit.Room)
	OnTrackRemoteMuted      func(request *livekit.MuteTrackRequest)
	OnLocalTrackUnpublished func(response *livekit.TrackUnpublishedResponse)
	OnTokenRefresh          func(refreshToken string)
	OnLeave                 func(*livekit.LeaveRequest)
	// contains filtered or unexported fields
}

func NewSignalClient

func NewSignalClient() *SignalClient

func (*SignalClient) Close

func (c *SignalClient) Close()

func (*SignalClient) IsStarted

func (c *SignalClient) IsStarted() bool

func (*SignalClient) Join

func (c *SignalClient) Join(urlPrefix string, token string, params connectParams) (*livekit.JoinResponse, error)

func (*SignalClient) Reconnect

func (c *SignalClient) Reconnect(urlPrefix string, token string, params connectParams) (*livekit.ReconnectResponse, error)

Reconnect starts a new WebSocket connection to the server, passing in reconnect=1 when successful, it'll return a ReconnectResponse; older versions of the server will not send back a ReconnectResponse

func (*SignalClient) SendAnswer

func (c *SignalClient) SendAnswer(sd webrtc.SessionDescription) error

func (*SignalClient) SendICECandidate

func (c *SignalClient) SendICECandidate(candidate webrtc.ICECandidateInit, target livekit.SignalTarget) error

func (*SignalClient) SendLeave

func (c *SignalClient) SendLeave() error

func (*SignalClient) SendMuteTrack

func (c *SignalClient) SendMuteTrack(sid string, muted bool) error

func (*SignalClient) SendOffer

func (c *SignalClient) SendOffer(sd webrtc.SessionDescription) error

func (*SignalClient) SendRequest

func (c *SignalClient) SendRequest(req *livekit.SignalRequest) error

func (*SignalClient) SendSyncState

func (c *SignalClient) SendSyncState(state *livekit.SyncState) error

func (*SignalClient) SendUpdateParticipantMetadata

func (c *SignalClient) SendUpdateParticipantMetadata(metadata *livekit.UpdateParticipantMetadata) error

func (*SignalClient) SendUpdateTrackSettings

func (c *SignalClient) SendUpdateTrackSettings(settings *livekit.UpdateTrackSettings) error

func (*SignalClient) Start

func (c *SignalClient) Start()

type SimulateScenario

type SimulateScenario int
const (
	SimulateSignalReconnect SimulateScenario = iota
	SimulateForceTCP
	SimulateForceTLS
	SimulateSpeakerUpdate
	SimulateMigration
	SimulateServerLeave
	SimulateNodeFailure
)

type SimulcastTrack

type SimulcastTrack struct {
	// contains filtered or unexported fields
}

func NewSimulcastTrack

func NewSimulcastTrack(trackLocal webrtc.TrackLocal, videoLayer *livekit.VideoLayer) *SimulcastTrack

func (*SimulcastTrack) Quality

func (t *SimulcastTrack) Quality() livekit.VideoQuality

func (*SimulcastTrack) TrackLocal

func (t *SimulcastTrack) TrackLocal() webrtc.TrackLocal

func (*SimulcastTrack) VideoLayer

func (t *SimulcastTrack) VideoLayer() *livekit.VideoLayer

type Track

type Track interface {
	ID() string
}

type TrackKind

type TrackKind string
const (
	TrackKindVideo TrackKind = "video"
	TrackKindAudio TrackKind = "audio"
)

func KindFromRTPType

func KindFromRTPType(rt webrtc.RTPCodecType) TrackKind

func (TrackKind) ProtoType

func (k TrackKind) ProtoType() livekit.TrackType

func (TrackKind) RTPType

func (k TrackKind) RTPType() webrtc.RTPCodecType

func (TrackKind) String

func (k TrackKind) String() string

type TrackPubCallback

type TrackPubCallback func(track Track, pub TrackPublication, participant *RemoteParticipant)

type TrackPublication

type TrackPublication interface {
	Name() string
	SID() string
	Source() livekit.TrackSource
	Kind() TrackKind
	MimeType() string
	IsMuted() bool
	IsSubscribed() bool
	TrackInfo() *livekit.TrackInfo
	// Track is either a webrtc.TrackLocal or webrtc.TrackRemote
	Track() Track
	// contains filtered or unexported methods
}

type TrackPublicationOptions

type TrackPublicationOptions struct {
	Name   string
	Source livekit.TrackSource
	// Set dimensions for video
	VideoWidth  int
	VideoHeight int
	// Opus only
	DisableDTX bool
	Stereo     bool
	// which stream the track belongs to, used to group tracks together.
	// if not specified, server will infer it from track source to bundle camera/microphone, screenshare/audio together
	Stream string
}

type UserDataPacket

type UserDataPacket struct {
	Payload []byte
	Topic   string // optional
}

UserDataPacket is a custom user data that can be sent via WebRTC on a custom topic.

func UserData

func UserData(data []byte) *UserDataPacket

UserData is a custom user data that can be sent via WebRTC.

func (*UserDataPacket) ToProto

func (p *UserDataPacket) ToProto() *livekit.DataPacket

ToProto implements DataPacket.

Directories

Path Synopsis
examples
pkg
samplebuilder
Package samplebuilder builds media frames from RTP packets.
Package samplebuilder builds media frames from RTP packets.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL