LiveKit - Open source, distributed video/audio rooms over WebRTC

LiveKit - Open source, distributed video/audio rooms over WebRTC

LiveKit is an open source project that provides scalable, multi-user conferencing over WebRTC. It's designed to give you everything you need to build real time video/audio capabilities in your applications.

Features

  • Horizontally scalable WebRTC Selective Forwarding Unit (SFU)
  • Modern, full-featured client SDKs for JS, iOS, Android
  • Built for production - JWT authentication and server APIs
  • Robust networking & connectivity, over UDP & TCP
  • Easy to deploy - pure Go & single binary
  • Advanced features - speaker detection, simulcasting, selective subscription, moderation APIs.

Documentation & Guides

Docs & Guides at: https://docs.livekit.io

Try it live

Head to our playground and give it a spin. Build a Zoom-like conferencing app in under 100 lines of code!

SDKs & Tools

Client SDKs:

Server SDKs:

Tools:

Installing

From source

Pre-requisites:

  • Go 1.15+ is installed
  • GOPATH/bin is in your PATH
  • protoc is installed and in PATH

Then run

git clone https://github.com/livekit/livekit-server
cd livekit-server
./bootstrap.sh
mage

Docker

LiveKit is published to Docker Hub under livekit/livekit-server

Running

Creating API keys

LiveKit utilizes JWT based access tokens for authentication to all of its APIs. Because of this, the server needs a list of valid API keys and secrets to validate the provided tokens. For more, see Access Tokens guide.

Generate API key/secret pairs with:

./bin/livekit-server generate-keys

or

docker run --rm livekit/livekit-server generate-keys

Store the generate keys in a YAML file like:

APIwLeah7g4fuLYDYAJeaKsSE: 8nTlwISkb-63DPP7OH4e.nw.J44JjicvZDiz8J59EoQ+

Starting the server

In development mode, LiveKit has no external dependencies. You can start LiveKit by passing it the keys it should use in LIVEKIT_KEYS. LiveKit could also use a config file or config environment variable LIVEKIT_CONFIG

: " ./bin/livekit-server --dev ">
LIVEKIT_KEYS=": " ./bin/livekit-server --dev

or

: " \ livekit/livekit-server \ --dev \ --node-ip= ">
docker run --rm \
  -p 7880:7880 \
  -p 7881:7881 \
  -p 7882:7882/udp \
  -e LIVEKIT_KEYS=": " \
  livekit/livekit-server \
  --dev \
  --node-ip=<machine-ip>

When running with docker, --node-ip needs to be set to your machine's local IP address.

The --dev flag turns on log verbosity to make it easier for local debugging/development

Creating a JWT token

To create a join token for clients, livekit-server provides a convenient subcommand to create a development token. This token has an expiration of a month, which is useful for development & testing, but not appropriate for production use.

./bin/livekit-server --key-file <path/to/keyfile> create-join-token --room "myroom" --identity "myidentity"

Sample client

To test your server, you can use our example web client (built with our React component)

Enter generated access token and you are connected to a room!

Deploying for production

LiveKit is deployable to any environment that supports docker, including Kubernetes and Amazon ECS.

See deployment docs at https://docs.livekit.io/guides/deploy

Contributing

We welcome your contributions to make LiveKit better! Please join us on Slack to discuss your ideas and/or submit PRs.

License

LiveKit server is licensed under Apache License v2.0.

Owner
LiveKit
Open source platform for real-time audio and video
LiveKit
Comments
  • Client is missing published tracks in certain conditions

    Client is missing published tracks in certain conditions

    Describe the bug @bekriebel reported this in slack. When users are joining the room at the same time from across different regions (where latency is a bigger concern), sometimes clients are reporting TrackSubscriptionFailure events with the following logs:

    could not find published track PA_8qxvzPbj3G3R TR_QKFBfQyMBW6Q
    addSubscribedMediaTrack @ RemoteParticipant.js?f400:71
    eval @ RemoteParticipant.js?f400:78
    setTimeout (async)
    addSubscribedMediaTrack @ RemoteParticipant.js?f400:77
    eval @ RemoteParticipant.js?f400:78
    setTimeout (async)
    addSubscribedMediaTrack @ RemoteParticipant.js?f400:77
    eval @ RemoteParticipant.js?f400:78
    

    According to @bekriebel, he's able to produce this if the server instance is located in a node far way from him. (Frankfurt to Seattle)

    Server

    • Version: 0.13.6

    Client

    • SDK: JS
    • Version: 0.13.6
  • Audio tracks do not support stereo sound

    Audio tracks do not support stereo sound

    Describe the bug When using LiveKit, at least with the Javascript SDK, received audio tracks are always downsampled to mono, regardless of how they are sent.

    I would like to use LiveKit for some higher-quality audio purposes. For this, I think some changes may be needed to allow the audio quality to be controlled either by server configurations, or preferably client-side.

    Server

    • Version: [1.2.0]
    • Environment: Docker image VPS hosted & local dev

    Client

    • SDK: js
    • Version: 1.3.0

    To Reproduce Steps to reproduce the behavior:

    1. two clients are connected to room
    2. One client publishes an audio track, specifying AudioCaptureOptions and TrackPublishOptions: <track>.mediaStreamTrack.getSettings()
        AudioCaptureOptions = {
            autoGainControl: false,
            echoCancellation: false,
            noiseSuppression: false,
            channelCount: 2,
          }
          
          TrackPublishOptions = {
            audioBitrate: 256_000,
          };
    
    1. 2nd client receives the track
    2. Validate on the sending side that two channels are being captured: <track>.mediaStreamTrack.getSettings()
    {
        "autoGainControl": false,
        "channelCount": 2,
        "deviceId": "web-contents-media-stream://2884:4",
        "echoCancellation": false,
        "latency": 0.042666,
        "noiseSuppression": false,
        "sampleRate": 48000,
        "sampleSize": 16
    }
    
    1. See that on the receiving side, only a single channel is received:
    {
        "channelCount": 1,
        "deviceId": "TR_Asstr5zE4jUefc",
        "latency": 0.01,
        "sampleRate": 48000,
        "sampleSize": 16
    }
    

    Expected behavior If a track is published as stereo audio, it should also be received as such.

    Screenshots N/A

    Additional context I think at least part of this is coming from the fact that the SDPFmtpLine is not specifying stereo=1 here: https://github.com/livekit/livekit/blob/1371108a46ac090d9ae24bea012650e70086ee10/pkg/rtc/mediaengine.go#L13, though there may be more changes needed, especially to support the new opus/red codec. It may also be helpful to add maxaveragebitrate=510000 to ensure the maximum bitrate can be allowed.

  • Error

    Error "Could not connect PeerConnection after timeout"

    Hi,

    Since last update I got a error for every client outside my LAN who try to connect to a room a/v of my livekit server (self-host) : "Could not connect PeerConnection after timeout". If I try inside my LAN it's ok (192.168.x.x). I have try to disable, my UFW, my fail2ban and the firewall of my Internet Box, activate the DMZ. I have make a new fresh install of livekit. I have other service (https) without any problems to connect. All service are NAT forwardings.

    Repoduce the error : Go to : https://example.livekit.io/ or https://livekit.io/connection-test LiveKit URL : https://my.hombrew.dns/ Token : Generate with "docker run --rm -v$PWD:/output livekit/generate --local"

    => Ok for me (LAN), error for client (INTERNET).

    For information : Old post for the configuration with docker "https://github.com/livekit/livekit/issues/687"

    Thanks for any help, I become mad..

    Configuration :

    cat docker-compose.yaml
    version: '3'
    
    services:
      livekit:
        image: livekit/livekit-server:latest
        command: --config /etc/livekit.yaml --node-ip xxx
        container_name: livekit
        restart: unless-stopped
        security_opt:
          - no-new-privileges:true
        ports:
          - "7881:7881"
          - "7882:7882/udp"
        networks:
          - proxy
        volumes:
          - ./livekit.yaml:/etc/livekit.yaml:ro
        labels:
          - "traefik.enable=true"
          - "traefik.http.routers.livekit.entrypoints=web,websecure"
          - "traefik.http.routers.livekit.rule=Host(`xxx.xxx.xxx`)"
          - "traefik.http.routers.livekit.service=livekit"
          - "traefik.http.routers.livekit.tls=true"
          - "traefik.http.routers.livekit.tls.domains[0].main=xxx.xxx.xxx"
          - "traefik.http.routers.livekit.tls.domains[0].sans=*-*.xxx.xxx"
          - "traefik.http.services.livekit.loadbalancer.server.port=7880"
          - "traefik.docker.network=proxy"
    
    networks:
      proxy:
        external: true
    
    cat livekit.yaml
    port: 7880
    rtc:
        udp_port: 7882
        tcp_port: 7881
        use_external_ip: false
    keys:
        XXX: XXX
    logging:
        json: false
        level: info
    
    sudo ufw status
    Status: active
    To                         Action      From
    --                         ------      ----
    XXX
    7881/tcp                   ALLOW       Anywhere
    7882/udp                   ALLOW       Anywhere
    XXX
    7881/tcp (v6)              ALLOW       Anywhere (v6)
    7882/udp (v6)              ALLOW       Anywhere (v6)
    

    NAT : Capture

    Error from https://livekit.io/connection-test
    Connecting to signal connection via WebSocket
    
    Connected to server, version 1.2.3.
    
    Establishing WebRTC connection
    
    Warning: ports need to be open on firewall in order to connect.
    
    Error: could not connect after timeout
    
    SKIPPED: Can connect via TURN
    
    Warning: No TURN servers configured.
    
    Can publish audio
    
    Error: could not connect after timeout
    
    Can publish video
    
    Error: could not connect after timeout
    
    Resuming connection after interruption
    
    Warning: could not connect after timeout
    
    Fail
    

    Log : livekit_log.txt

  • Recording support?

    Recording support?

    The server looks very promising since it's supported with mobile and web SDKs.

    However I could not see any section about recording in the documentation. Do you plan to add support for recording + processing recordings?

  • Lots and lots of race conditions

    Lots and lots of race conditions

    Describe the bug building and running the server with -race reveals a lot of race conditions going on.

    Server

    • Version: 0.15.6
    • Environment: local dev

    Client

    • SDK: flutter
    • Version: 0.5.6

    To Reproduce Steps to reproduce the behavior:

    1. build the server with -race
    2. two clients are connected to room (one can be the go server sdk)
    3. See error

    Expected behavior No race conditions should occur

    Screenshots Lots. E.g.

    ==================
    WARNING: DATA RACE
    Write at 0x00c005dda910 by goroutine 114:
    github.com/livekit/livekit-server/pkg/rtc.(*MediaTrack).ToProto()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/mediatrack.go:103 +0xa6
    github.com/livekit/livekit-server/pkg/rtc.(*UpTrackManager).ToProto()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/uptrackmanager.go:76 +0x1c1
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).ToProto()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:360 +0x698
    github.com/livekit/livekit-server/pkg/rtc.ToProtoParticipants()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/utils.go:51 +0xdd
    github.com/livekit/livekit-server/pkg/rtc.(*Room).broadcastParticipantState()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/room.go:705 +0x93
    github.com/livekit/livekit-server/pkg/rtc.(*Room).onTrackPublished()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/room.go:592 +0x84
    github.com/livekit/livekit-server/pkg/rtc.(*Room).onTrackPublished-fm()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/room.go:590 +0x6d
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).handleTrackPublished()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:1405 +0xa3
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).mediaTrackReceived()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:1393 +0x484
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).onMediaTrack()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:920 +0xce
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).onMediaTrack-fm()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:910 +0x4d
    github.com/pion/webrtc/v3.(*PeerConnection).onTrack·dwrap·70()
    /home/matthew/go/pkg/mod/github.com/pion/webrtc/[email protected]/peerconnection.go:459 +0x58
    
    Previous read at 0x00c005dda910 by goroutine 111:
    reflect.Value.Bool()
    /nix/store/j8zd71jnc6r7lhh45jwk9ywygr4w68c9-go-1.17.8/share/go/src/reflect/value.go:285 +0x51
    google.golang.org/protobuf/internal/impl.fieldInfoForScalar.func1()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/message_reflect_field.go:286 +0x28f
    google.golang.org/protobuf/internal/impl.(*messageState).Range()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/message_reflect_gen.go:48 +0x21e
    google.golang.org/protobuf/internal/order.RangeFields()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/order/range.go:50 +0x21a
    google.golang.org/protobuf/encoding/protojson.encoder.marshalMessage()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:223 +0x452
    google.golang.org/protobuf/encoding/protojson.encoder.marshalSingular()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:304 +0x6c8
    google.golang.org/protobuf/encoding/protojson.encoder.marshalValue()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:248 +0x18f
    google.golang.org/protobuf/encoding/protojson.encoder.marshalMessage.func1()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:232 +0x213
    google.golang.org/protobuf/internal/order.RangeFields()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/order/range.go:60 +0x3d9
    google.golang.org/protobuf/encoding/protojson.encoder.marshalMessage()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:223 +0x452
    google.golang.org/protobuf/encoding/protojson.MarshalOptions.marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:136 +0x1cb
    google.golang.org/protobuf/encoding/protojson.MarshalOptions.Marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:110 +0xa4
    google.golang.org/protobuf/encoding/protojson.Marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/encoding/protojson/encode.go:39 +0xa5
    github.com/livekit/protocol/webhook.(*notifier).Notify()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/webhook/notifier.go:50 +0x73
    github.com/livekit/livekit-server/pkg/telemetry.(*telemetryServiceInternal).notifyEvent.func1()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/telemetry/telemetryserviceinternalevents.go:278 +0x8f
    github.com/gammazero/workerpool.worker()
    /home/matthew/go/pkg/mod/github.com/gammazero/[email protected]/workerpool.go:243 +0x34
    github.com/gammazero/workerpool.startWorker·dwrap·6()
    /home/matthew/go/pkg/mod/github.com/gammazero/[email protected]/workerpool.go:234 +0x39
    

    In general, there seem to be a lot involving how protobuf msgs are constructed.

    ==================
    WARNING: DATA RACE
    Write at 0x00c005dda928 by goroutine 114:
    github.com/livekit/livekit-server/pkg/rtc.(*MediaTrack).ToProto()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/mediatrack.go:111 +0x217
    github.com/livekit/livekit-server/pkg/rtc.(*MediaTrackSubscriptions).AddSubscriber()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/mediatracksubscriptions.go:270 +0x153c
    github.com/livekit/livekit-server/pkg/rtc.(*MediaTrackReceiver).AddSubscriber()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/mediatrackreceiver.go:198 +0x3d4
    github.com/livekit/livekit-server/pkg/rtc.(*MediaTrack).AddSubscriber()
    <autogenerated>:1 +0x77
    github.com/livekit/livekit-server/pkg/rtc.(*UpTrackManager).AddSubscriber()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/uptrackmanager.go:127 +0x67b
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).AddSubscriber()
    <autogenerated>:1 +0xb9
    github.com/livekit/livekit-server/pkg/rtc.(*Room).onTrackPublished()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/room.go:615 +0x745
    github.com/livekit/livekit-server/pkg/rtc.(*Room).onTrackPublished-fm()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/room.go:590 +0x6d
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).handleTrackPublished()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:1405 +0xa3
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).mediaTrackReceived()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:1393 +0x484
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).onMediaTrack()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:920 +0xce
    github.com/livekit/livekit-server/pkg/rtc.(*ParticipantImpl).onMediaTrack-fm()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/rtc/participant.go:910 +0x4d
    github.com/pion/webrtc/v3.(*PeerConnection).onTrack·dwrap·70()
    /home/matthew/go/pkg/mod/github.com/pion/webrtc/[email protected]/peerconnection.go:459 +0x58
    
    Previous read at 0x00c005dda928 by goroutine 129:
    google.golang.org/protobuf/internal/impl.pointer.Elem()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/pointer_unsafe.go:119 +0x3f7
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshalAppendPointer()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/encode.go:136 +0x3a9
    google.golang.org/protobuf/internal/impl.appendMessageSliceInfo()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/codec_field.go:485 +0x20e
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshalAppendPointer()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/encode.go:139 +0x482
    google.golang.org/protobuf/internal/impl.appendMessageSliceInfo()
    /home/matthew/go/pkg/mod/google.golang.org/pro[email protected]/internal/impl/codec_field.go:485 +0x20e
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshalAppendPointer()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/encode.go:139 +0x482
    google.golang.org/protobuf/internal/impl.appendMessageInfo()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/codec_field.go:238 +0x190
    google.golang.org/protobuf/internal/impl.(*MessageInfo).initOneofFieldCoders.func4()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/codec_field.go:96 +0x105
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshalAppendPointer()
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/encode.go:107 +0xd0
    google.golang.org/protobuf/internal/impl.(*MessageInfo).marshal-fm()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/internal/impl/encode.go:100 +0xd4
    google.golang.org/protobuf/proto.MarshalOptions.marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/proto/encode.go:163 +0x3b9
    google.golang.org/protobuf/proto.Marshal()
    /home/matthew/go/pkg/mod/google.golang.org/[email protected]/proto/encode.go:79 +0x59
    github.com/livekit/livekit-server/pkg/service.(*WSSignalConnection).WriteResponse()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/service/wsprotocol.go:84 +0x105
    github.com/livekit/livekit-server/pkg/service.(*RTCService).ServeHTTP.func2()
    /home/matthew/go/pkg/mod/github.com/livekit/[email protected]/pkg/service/rtcservice.go:230 +0x4d4
    

    There's not a shortage of them.

    Data races can lead to unexpected behaviour and very hard to debug problems. These should all be solved, most likely by judiciously adding mutexes, or using atomics.

  • Data messages not sending in subscribe only mood

    Data messages not sending in subscribe only mood

    In my case I wanted user can only participants without sharing microphone or webcam. It's like subscribe only/listen only mood. But in that mood data messages aren't sending. I'm getting this error in my JS client:

    Uncaught (in promise) DOMException: An attempt was made to use an object that is not, or is no longer, usable

    Am I misunderstanding somewhere? But if that user connect with webcam then messages are sending as expected.

  • Support TURN server without TLS cert

    Support TURN server without TLS cert

    Hi, we're trying to understand why is the TLS cert required for the TURN server.

    We're considering deploying in DigitalOcean with k8s and their load balancer. The load balancer will terminate the SSL before it reaches the cluster.

    However, following the Helm chart and also the server source code, it seems like the TLS cert is necessary. Is there any way to run TURN without the cert?

  • Add support for Redis Sentinel

    Add support for Redis Sentinel

    This is a rebase of #232 from @heilerich onto the current mainline. I don't have a sentinel install available at the moment to test myself, but my client will be testing this out later in the week.

    add client sentinel configuration and client init rewire add configuration sample

  • "Could not connect PeerConnection after timeout" with Firefox and TURN

    I've seen several similar issues, but my case somewhat strange, so could you please direct me what i should check?

    In most cases when i trying to connect to livekit i get "Could not connect PeerConnection after timeout" error. But sometimes, i just randomly staring to work, and after that in continues to work for extended period of time. I mainly use FoundryVTT js client, but the https://example.livekit.io/ gives me exactly the same results.

    But! If i try to connect using https://livekit.io/connection-test, it always fully passes.

    Connecting to signal connection via WebSocket
    Connected to server, version 1.3.1.
    Establishing WebRTC connection
    SKIPPED: Can connect via TURN
    WARNING: No TURN servers configured.
    Can publish audio
    published 140 audio packets
    Can publish video
    published 967 video packets
    Resuming connection after interruption
    PASS
    

    The problem persist even with fully stopped firewall.
    Here's the server log livekit_log.txt

    What i am doing wrong?

    Clients Different with different results.

    Server

    • Version: [1.3.1]
    • Environment: VPS, CentOS 8, without docker
    • Using nginx as a reverse proxy

    Nginx Configuration:

    server {
       server_name some.real.address.onine;
    
       proxy_read_timeout 300;
       proxy_connect_timeout 300;
       proxy_send_timeout 300;
    
       location / {
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
    
            proxy_pass http://127.0.0.1:7880;
    
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection "Upgrade";
       }
    
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/some.real.address.onine/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/some.real.address.onine/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    }
    

    Livekit Configuration:

    port: 7880
    log_level: debug
    rtc:
      tcp_port: 7881
      udp_port: 7882
      #port_range_start: 50000
      #port_range_end: 60000
      use_external_ip: true
    redis:
      address: localhost:6379
    keys:
      # key value pairs
      ***:**************
    

    i tried both port ranges and single udp port. both with use_external_ip and without with no visible changes.

  • Intermittent timeout errors

    Intermittent timeout errors

    Greetings! 👋 we have got a script to monitor our livekit deployment which leverages the livekit-cli and it works in such a way that it periodically connects and create a room in our livekit cluster (v1.2.1, running on gke) and then join the room and publish a tiny audio (ogg) file as follows :

    livekit-cli create-room --url https://livekit.something.com/ --api-key XXXXX --api-secret XXXXX --name prasadtest3
    
    livekit-cli join-room --url https://livekit.something.com/ --api-key XXXXX --api-secret XXXXX --room prasadtest3 --identity publisher --publish /tmp/livekit_audio.ogg
    

    This works fine most of the time, but publishing the audio file fails sometimes with could not connect after timeout message as shown below, once it start failing, the subsequent attempts also fails and the only way to fix this is to restart the livekit deployment

    livekit-cli join-room --url https://livekit.something.com/ --api-key XXXXX --api-secret XXXXX --room prasadtest3 --identity publisher --publish /tmp/livekit_audio.ogg
    could not connect after timeout
    

    We already have debug logging enabled and below are the messages we get when it fails.

    2022-09-29T05:21:05.419Z	INFO	livekit	service/roommanager.go:254	starting RTC session	{"room": "prasadtest3", "nodeID": "ND_yKNKtfJ8", "participant": "publisher", "sdk": "GO", "sdkVersion": "0.10.5", "protocol": 8}
    2022-09-29T05:21:05.420Z	INFO	livekit	rtc/room.go:287	new participant joined	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "pID": "PA_HdEcTCqpkDDY", "participant": "publisher", "protocol": 8, "options": {"AutoSubscribe":true}}
    2022-09-29T05:21:05.421Z	DEBUG	livekit	rtc/participant.go:1190	updating participant state	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "state": "JOINED"}
    2022-09-29T05:21:05.421Z	DEBUG	livekit	rtc/room.go:236	participant state changed	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "state": "JOINED", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "oldState": "JOINING"}
    2022-09-29T05:21:05.421Z	DEBUG	livekit	rtc/participant.go:779	SetMigrateState	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "state": "MIGRATE_STATE_COMPLETE"}
    2022-09-29T05:22:05.422Z	INFO	livekit	rtc/room.go:393	closing participant for removal	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "pID": "PA_HdEcTCqpkDDY", "participant": "publisher"}
    2022-09-29T05:22:05.422Z	INFO	livekit	rtc/participant.go:640	try close participant	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "sendLeave": true, "reason": "JOIN_TIMEOUT"}
    2022-09-29T05:22:05.422Z	DEBUG	livekit	rtc/participant.go:1190	updating participant state	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "state": "DISCONNECTED"}
    2022-09-29T05:22:05.423Z	INFO	livekit	rtc/participant_signal.go:199	closing signal connection	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false}
    2022-09-29T05:22:05.424Z	INFO	livekit	service/roommanager.go:433	RTC session finishing	{"participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz"}
    2022-09-29T05:22:05.424Z	INFO	livekit	rtc/transport.go:1292	leaving events processor	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "transport": "PUBLISHER"}
    2022-09-29T05:22:05.424Z	INFO	livekit	rtc/transport.go:486	peer connection state change	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz", "participant": "publisher", "pID": "PA_HdEcTCqpkDDY", "remote": false, "transport": "PUBLISHER", "state": "closed"}
    2022-09-29T05:22:48.349Z	INFO	livekit	rtc/room.go:546	closing room	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz"}
    2022-09-29T05:22:48.350Z	INFO	livekit	service/roommanager.go:107	deleting room state	{"room": "prasadtest3"}
    2022-09-29T05:22:48.350Z	INFO	livekit	service/roommanager.go:401	room closed	{"room": "prasadtest3", "roomID": "RM_hXm4jXmyAmqz"}
    

    A restart of the the livekit deployment (kubectl rollout restart deployment livekit-livekit-server) fixes this and it works well for a couple of hours, and then the issue reoccurs 🙁

    Any help on fixing this would be much appreciated, thanks! 🙏

    Server

    • Version: v1.2.1
    • Environment: GKE
  • High activity rooms cause `

    High activity rooms cause `"error": "channel is full"` errors

    Hi,

    We had a live call with over 90 people. Things were going fine early on, but then we noticed users weren't able to publish video/audio, and suddenly some users who did publish would come through as a black screen. The error we were seeing over and over in the server looks like this:

    
    Apr 2, 2021 @ 14:27:11.777 | <14>1 2021-04-02T18:27:10.858904Z - - - - - 	/workspace/pkg/routing/redisrouter.go:311 |  
    -- | -- | --
    
      |   | Apr 2, 2021 @ 14:27:11.777 | <14>1 2021-04-02T18:27:10.858898Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker |  
    
      |   | Apr 2, 2021 @ 14:27:11.777 | <14>1 2021-04-02T18:27:10.859405Z - - - - - 2021-04-02T18:27:10.859Z	ERROR	routing/redisrouter.go:311	error processing signal message	{"error": "channel is full"} |  
    
      |   | Apr 2, 2021 @ 14:27:11.777 | <14>1 2021-04-02T18:27:10.859435Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker |  
    
      |   | Apr 2, 2021 @ 14:27:11.777 | <14>1 2021-04-02T18:27:10.859444Z - - - - - 	/workspace/pkg/routing/redisrouter.go:311 |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.854218Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.855512Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.855518Z - - - - - 	/workspace/pkg/routing/redisrouter.go:311 |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.854223Z - - - - - 	/workspace/pkg/routing/redisrouter.go:311 |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.858236Z - - - - - 	/workspace/pkg/routing/redisrouter.go:311 |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.856528Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker |  
    
      |   | Apr 2, 2021 @ 14:27:11.776 | <14>1 2021-04-02T18:27:10.858231Z - - - - - github.com/livekit/livekit-server/pkg/routing.(*RedisRouter).redisWorker
    
    

    It looks like the channel used for the socket is filling up and once that happens, the connected user doesn't receive any new events and can't publish any new events either

  • Update module github.com/livekit/psrpc to v0.2.2

    Update module github.com/livekit/psrpc to v0.2.2

    Mend Renovate

    This PR contains the following updates:

    | Package | Type | Update | Change | |---|---|---|---| | github.com/livekit/psrpc | require | patch | v0.2.1 -> v0.2.2 |


    Release Notes

    livekit/psrpc

    v0.2.2

    Compare Source


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • track_published webhook event works incorrectly

    track_published webhook event works incorrectly

    Describe the bug It is necessary to publish audio and video tracks in the system always, even if the microphone is muted at the entrance, and then, depending on the state, mute the track. Implemented subscription to the RoomEvent.LocalTrackPublished event, inside the handler - mute tracks depending on the state. Case: in state - mute microphone and video. So, the webhook receives information that the audio track is published, but the video track does not reach.

    Server

    • Version: [1.1.0]
    • Environment: local env

    Client

    • SDK: JS
    • Version: [1.4.3]

    To Reproduce Steps to reproduce the behavior:

    1. Client join the conference with audio: false, video:false state
    2. Backend recieve webhook track_published event

    Expected behavior webhook sends information about the publication of audio and video tracks

    My guess is that the message processing for the hook happens after the RoomEvent.LocalTrackPublished event is dispatched. Have to hack with settimeout to mute a track after publishing

  • Enabling camera after enabling screen sharing doesn't work on Firefox

    Enabling camera after enabling screen sharing doesn't work on Firefox

    Describe the bug Enabling camera after enabling screen sharing doesn't work on Firefox (107.0.1 (64-bit) and 108.0.1 (64-bit)). Reproducible in LiveKit's playground https://livekit.io/playground#code=60c0983cd7e07fd1179620ce

    1. Open playground in FireFox and click run
    2. Click Start Screen Share and allow screen sharing
    3. Click Start Video and allow camera
    4. Open the playground in any other browser and join the same room and click run - only screen sharing is visible

    Expected behavior Both camera and screen sharing are visible

    Additional context I was able to capture some logs from livekit-server. There are some error rows.

    2022-12-19T12:59:27.741Z	INFO	livekit	rtc/participant.go:1519	pending track added	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "track": "sid:\"TR_VSPZvNVyBAEk65\" type:VIDEO width:1791 height:1163 source:SCREEN_SHARE layers:{quality:HIGH width:1791 height:1163 bitrate:300000}", "request": "cid:\"{013a154c-52c9-4288-be6c-03cad626faf0}\" type:VIDEO width:1791 height:1163 source:SCREEN_SHARE layers:{quality:HIGH width:1791 height:1163 bitrate:300000}"}
    2022-12-19T12:59:27.741Z	DEBUG	livekit	rtc/participant.go:1524	sending track published	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "cid": "{013a154c-52c9-4288-be6c-03cad626faf0}", "trackInfo": "sid:\"TR_VSPZvNVyBAEk65\" type:VIDEO width:1791 height:1163 source:SCREEN_SHARE layers:{quality:HIGH width:1791 height:1163 bitrate:300000}"}
    2022-12-19T12:59:27.884Z	INFO	livekit	rtc/participant.go:421	received offer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:27.886Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "state": "checking"}
    2022-12-19T12:59:27.886Z	DEBUG	livekit	rtc/transport.go:445	ice gathering state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "state": "gathering"}
    2022-12-19T12:59:27.886Z	INFO	livekit	rtc/participant.go:449	sending answer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:27.887Z	DEBUG	livekit	rtc/transport.go:445	ice gathering state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "state": "complete"}
    2022-12-19T12:59:27.887Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_Update", "error": "no response sink"}
    2022-12-19T12:59:27.887Z	ERROR	livekit	rtc/room.go:875	could not send update to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "error": "no response sink"}
    2022-12-19T12:59:27.949Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "state": "connected"}
    2022-12-19T12:59:27.949Z	INFO	livekit	rtc/transport.go:486	selected ICE candidate pair	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "pair": "(local) udp4 host my.ip.0.0:57265 <-> (remote) udp4 prflx my.ip.0.0:63154 related :0"}
    2022-12-19T12:59:28.004Z	DEBUG	livekit	rtc/transport.go:492	peer connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "state": "connected"}
    2022-12-19T12:59:28.004Z	INFO	livekit	rtc/transport.go:1368	ice candidates	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER", "lc": ["udp4 host my.ip.0.0:57265", "tcp4 host my.ip.0.0:7881", "udp6 host my.ip.0.0:57957", "tcp6 host my.ip.0.0:7881"], "rc": ["candidate:0 1 UDP 2122252543 my.ip.0.0 57795 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active", "candidate:0 1 UDP 2122252543 my.ip.0.0 63154 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active", "candidate:0 2 UDP 2122252542 my.ip.0.0 58025 typ host", "candidate:3 2 TCP 2105524478 my.ip.0.0 9 typ host tcptype active"], "lc (filtered)": [], "rc (filtered)": []}
    2022-12-19T12:59:28.029Z	DEBUG	livekit	rtc/participant.go:1583	media track received	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "{e07acaab-7265-4ef5-a47d-37787784b197}", "kind": "video"}
    2022-12-19T12:59:28.030Z	DEBUG	livekit	rtc/uptrackmanager.go:307	added published track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "trackInfo": "sid:\"TR_VSPZvNVyBAEk65\" type:VIDEO width:1791 height:1163 source:SCREEN_SHARE layers:{quality:HIGH width:1791 height:1163 bitrate:300000} mime_type:\"video/VP8\""}
    2022-12-19T12:59:28.030Z	DEBUG	livekit	rtc/mediatrack.go:221	AddReceiver	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8"}
    2022-12-19T12:59:28.030Z	DEBUG	livekit	rtc/mediatrackreceiver.go:201	setup receiver	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "priority": 0, "receivers": [{"TrackReceiver":{}}]}
    2022-12-19T12:59:28.030Z	DEBUG	livekit	sfu/streamtrackermanager.go:131	StreamTrackerManager add track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	buffer/buffer.go:210	Setting feedback	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "type": "nack"}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	buffer/buffer.go:210	Setting feedback	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "type": "nack"}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	buffer/buffer.go:197	Setting feedback	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "type": "goog-remb"}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	buffer/buffer.go:198	REMB not supported, RTCP feedback will not be generated	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	buffer/buffer.go:201	Setting feedback	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "type": "transport-cc"}
    2022-12-19T12:59:28.031Z	DEBUG	livekit	sfu/streamtrackermanager.go:133	StreamTrackerManager OnStatusChanged	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "status": "active"}
    2022-12-19T12:59:28.032Z	INFO	livekit	sfu/streamtrackermanager.go:393	available layers changed - layer seen	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "added": 0, "availableLayers": [0], "exemptedLayers": []}
    2022-12-19T12:59:28.032Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_Update", "error": "no response sink"}
    2022-12-19T12:59:28.032Z	ERROR	livekit	rtc/room.go:875	could not send update to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "error": "no response sink"}
    2022-12-19T12:59:28.032Z	DEBUG	livekit	rtc/room.go:720	subscribing to new track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "publisher": "1516", "publisherID": "PA_ggjKKZiNxfnD", "trackID": "TR_VSPZvNVyBAEk65"}
    2022-12-19T12:59:28.032Z	DEBUG	livekit	rtc/uptrackmanager.go:126	subscribing participant to tracks	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "subscriber": "1517", "subscriberID": "PA_RsRViTyWgtUE", "trackIDs": ["TR_VSPZvNVyBAEk65"]}
    2022-12-19T12:59:28.032Z	DEBUG	livekit	rtc/participant.go:2011	queuing subscribe	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false}
    2022-12-19T12:59:28.033Z	DEBUG	livekit	rtc/room.go:720	subscribing to new track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "publisher": "1516", "publisherID": "PA_ggjKKZiNxfnD", "trackID": "TR_VSPZvNVyBAEk65"}
    2022-12-19T12:59:28.033Z	DEBUG	livekit	rtc/uptrackmanager.go:126	subscribing participant to tracks	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "subscriber": "1515", "subscriberID": "PA_bFVTEPfcR5g4", "trackIDs": ["TR_VSPZvNVyBAEk65"]}
    2022-12-19T12:59:28.033Z	DEBUG	livekit	rtc/participant.go:2011	queuing subscribe	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false}
    2022-12-19T12:59:28.033Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_Update", "error": "no response sink"}
    2022-12-19T12:59:28.033Z	INFO	livekit	rtc/participant.go:1192	mediaTrack published	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "kind": "video", "trackID": "TR_VSPZvNVyBAEk65", "rid": "", "SSRC": 2353365818, "mime": "video/VP8"}
    2022-12-19T12:59:28.033Z	DEBUG	livekit	rtc/participant.go:1023	sending subscription permission update	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "publisherID": "PA_ggjKKZiNxfnD", "trackID": "TR_VSPZvNVyBAEk65", "allowed": true}
    2022-12-19T12:59:28.033Z	INFO	livekit	rtc/participant.go:912	added subscribedTrack	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "publisherID": "PA_ggjKKZiNxfnD", "publisherIdentity": "1516", "trackID": "TR_VSPZvNVyBAEk65"}
    2022-12-19T12:59:28.034Z	INFO	livekit	rtc/participant.go:912	added subscribedTrack	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "publisherID": "PA_ggjKKZiNxfnD", "publisherIdentity": "1516", "trackID": "TR_VSPZvNVyBAEk65"}
    2022-12-19T12:59:28.034Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_ConnectionQuality", "error": "no response sink"}
    2022-12-19T12:59:28.034Z	DEBUG	livekit	rtc/participant.go:1023	sending subscription permission update	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "publisherID": "PA_ggjKKZiNxfnD", "trackID": "TR_VSPZvNVyBAEk65", "allowed": true}
    2022-12-19T12:59:28.034Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_SubscriptionPermissionUpdate", "error": "no response sink"}
    2022-12-19T12:59:28.034Z	ERROR	livekit	rtc/participant.go:1034	could not send subscription permission update	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "error": "no response sink"}
    2022-12-19T12:59:28.061Z	DEBUG	livekit	rtc/transport.go:527	lossy data channel open	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:28.061Z	DEBUG	livekit	rtc/transport.go:514	reliable data channel open	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:28.184Z	INFO	livekit	rtc/transport.go:1458	skipping negotiation, trying again later	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER"}
    2022-12-19T12:59:28.184Z	INFO	livekit	rtc/participant.go:1170	sending offer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "transport": "SUBSCRIBER"}
    2022-12-19T12:59:28.262Z	INFO	livekit	rtc/signalhandler.go:61	updated subscribed track settings	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "settings": "track_sids:\"TR_VSPZvNVyBAEk65\" disabled:true quality:HIGH"}
    2022-12-19T12:59:28.262Z	DEBUG	livekit	rtc/subscribedtrack.go:136	updating video layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false}
    2022-12-19T12:59:28.262Z	INFO	livekit	sfu/forwarder.go:333	setting max spatial layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "layer": 0}
    2022-12-19T12:59:28.262Z	INFO	livekit	rtc/dynacastquality.go:61	setting subscriber max quality	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "subscriberID": "PA_RsRViTyWgtUE", "quality": "HIGH"}
    2022-12-19T12:59:28.262Z	INFO	livekit	rtc/dynacastquality.go:127	notifying quality change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "maxSubscriberQuality": {"PA_RsRViTyWgtUE":2}, "maxSubscriberNodeQuality": {}, "maxSubscribedQuality": "HIGH", "force": false}
    2022-12-19T12:59:28.262Z	INFO	livekit	rtc/dynacastmanager.go:177	processing quality change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "force": false, "committedMaxSubscribedQuality": {}, "maxSubscribedQuality": {"video/VP8":2}}
    2022-12-19T12:59:28.263Z	INFO	livekit	rtc/dynacastmanager.go:228	committing quality change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "force": false, "committedMaxSubscribedQuality": {}, "maxSubscribedQuality": {"video/VP8":2}}
    2022-12-19T12:59:28.263Z	INFO	livekit	rtc/dynacastmanager.go:281	subscribedMaxQualityChange	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "subscribedCodecs": [{"codec":"video/VP8","qualities":[{"enabled":true},{"quality":1,"enabled":true},{"quality":2,"enabled":true}]}], "maxSubscribedQualities": [{"CodecMime":"video/VP8","Quality":2}]}
    2022-12-19T12:59:28.263Z	INFO	livekit	rtc/participant.go:1447	sending max subscribed quality	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "qualities": [{"codec":"vp8","qualities":[{"enabled":true},{"quality":1,"enabled":true},{"quality":2,"enabled":true}]}], "max": [{"CodecMime":"video/VP8","Quality":2}]}
    2022-12-19T12:59:28.263Z	INFO	livekit	rtc/signalhandler.go:61	updated subscribed track settings	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "settings": "track_sids:\"TR_VSPZvNVyBAEk65\" quality:HIGH"}
    2022-12-19T12:59:28.270Z	INFO	livekit	rtc/participant.go:435	received answer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "transport": "SUBSCRIBER"}
    2022-12-19T12:59:28.271Z	DEBUG	livekit	sfu/downtrack.go:304	DownTrack.Bind	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "codecs": [{"MimeType":"video/VP8","ClockRate":90000,"Channels":0,"SDPFmtpLine":"max-fs=12288;max-fr=60","RTCPFeedback":[{"Type":"nack","Parameter":""},{"Type":"nack","Parameter":"pli"},{"Type":"ccm","Parameter":"fir"},{"Type":"goog-remb","Parameter":""},{"Type":"transport-cc","Parameter":""}],"PayloadType":120}], "matchCodec": {"MimeType":"video/VP8","ClockRate":90000,"Channels":0,"SDPFmtpLine":"","RTCPFeedback":[{"Type":"goog-remb","Parameter":""},{"Type":"ccm","Parameter":"fir"},{"Type":"nack","Parameter":""},{"Type":"nack","Parameter":"pli"}],"PayloadType":96}, "ssrc": 3615986145}
    2022-12-19T12:59:28.271Z	DEBUG	livekit	sfu/downtrack.go:330	downtrack bound	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false}
    2022-12-19T12:59:28.271Z	INFO	livekit	sfu/forwarder.go:1276	stream allocation: optimal	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "allocation": "VideoAllocation{state: AWAITING_MEASUREMENT, change: RESUMING, bw: 0, del: 0, avail: [0], exempt: [], rates: [[0 0 0 0] [0 0 0 0] [0 0 0 0]], target: VideoLayer{s: 0, t: 3}, dist: 0}"}
    2022-12-19T12:59:28.272Z	DEBUG	livekit	sfu/streamallocator.go:981	streamed tracks changed	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "transport": "SUBSCRIBER", "trackID": "TR_VSPZvNVyBAEk65", "state": "active"}
    2022-12-19T12:59:28.272Z	DEBUG	livekit	sfu/downtrack.go:433	sending PLI for layer lock	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "generation": 1, "layer": 0}
    2022-12-19T12:59:28.272Z	DEBUG	livekit	buffer/buffer.go:339	send pli	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "ssrc": 2353365818, "force": false}
    2022-12-19T12:59:28.362Z	DEBUG	livekit	rtc/subscribedtrack.go:136	updating video layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false}
    2022-12-19T12:59:28.363Z	INFO	livekit	rtc/signalhandler.go:61	updated subscribed track settings	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "settings": "track_sids:\"TR_VSPZvNVyBAEk65\" width:914 height:639"}
    2022-12-19T12:59:28.464Z	DEBUG	livekit	rtc/subscribedtrack.go:136	updating video layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false}
    2022-12-19T12:59:28.472Z	DEBUG	livekit	sfu/downtrack.go:433	sending PLI for layer lock	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "generation": 1, "layer": 0}
    2022-12-19T12:59:28.672Z	DEBUG	livekit	sfu/downtrack.go:433	sending PLI for layer lock	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "generation": 1, "layer": 0}
    2022-12-19T12:59:28.872Z	DEBUG	livekit	sfu/downtrack.go:433	sending PLI for layer lock	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "generation": 1, "layer": 0}
    2022-12-19T12:59:28.872Z	DEBUG	livekit	buffer/buffer.go:339	send pli	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "ssrc": 2353365818, "force": false}
    2022-12-19T12:59:29.072Z	DEBUG	livekit	sfu/downtrack.go:433	sending PLI for layer lock	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "generation": 1, "layer": 0}
    2022-12-19T12:59:29.202Z	INFO	livekit	sfu/forwarder.go:1466	locking to target layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "current": "VideoLayer{s: -1, t: -1}", "target": "VideoLayer{s: 0, t: 3}"}
    2022-12-19T12:59:29.202Z	INFO	livekit	rtc/dynacastquality.go:61	setting subscriber max quality	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "subscriberID": "PA_RsRViTyWgtUE", "quality": "HIGH"}
    2022-12-19T12:59:29.202Z	DEBUG	livekit	sfu/downtrack.go:535	forwarding key frame	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "layer": 0}
    2022-12-19T12:59:30.382Z	DEBUG	livekit	sfu/downtrack.go:535	forwarding key frame	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "layer": 0}
    2022-12-19T12:59:31.292Z	DEBUG	livekit	buffer/fps.go:159	frame rate calculated	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/vp8", "layer": 0, "rate": [5.8694057,0,0,0]}
    2022-12-19T12:59:31.292Z	DEBUG	livekit	rtc/subscribedtrack.go:136	updating video layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false}
    2022-12-19T12:59:31.292Z	DEBUG	livekit	rtc/subscribedtrack.go:136	updating video layer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false}
    2022-12-19T12:59:32.032Z	INFO	livekit	sfu/forwarder.go:1276	stream allocation: optimal	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1517", "pID": "PA_RsRViTyWgtUE", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "allocation": "VideoAllocation{state: OPTIMAL, change: NONE, bw: 620071, del: 620071, avail: [0], exempt: [], rates: [[620071 0 0 0] [0 0 0 0] [0 0 0 0]], target: VideoLayer{s: 0, t: 0}, dist: 0}"}
    2022-12-19T12:59:38.031Z	INFO	livekit	rtc/dynacastquality.go:127	notifying quality change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "maxSubscriberQuality": {"PA_RsRViTyWgtUE":2}, "maxSubscriberNodeQuality": {}, "maxSubscribedQuality": "HIGH", "force": true}
    2022-12-19T12:59:38.031Z	INFO	livekit	rtc/dynacastmanager.go:177	processing quality change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "force": false, "committedMaxSubscribedQuality": {"video/VP8":2}, "maxSubscribedQuality": {"video/VP8":2}}
    2022-12-19T12:59:39.967Z	DEBUG	livekit	rtc/signalhandler.go:24	add track request	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "{2ee04a7b-c411-49d7-b0a9-8a44bf433397}"}
    2022-12-19T12:59:39.968Z	INFO	livekit	rtc/participant.go:1519	pending track added	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VCLoF87h6RJT5i", "track": "sid:\"TR_VCLoF87h6RJT5i\" type:VIDEO width:1280 height:720 source:CAMERA layers:{width:320 height:180 bitrate:120000} layers:{quality:MEDIUM width:640 height:360 bitrate:300000} layers:{quality:HIGH width:1280 height:720 bitrate:1700000}", "request": "cid:\"{2ee04a7b-c411-49d7-b0a9-8a44bf433397}\" type:VIDEO width:1280 height:720 source:CAMERA layers:{width:320 height:180 bitrate:120000} layers:{quality:MEDIUM width:640 height:360 bitrate:300000} layers:{quality:HIGH width:1280 height:720 bitrate:1700000}"}
    2022-12-19T12:59:39.968Z	DEBUG	livekit	rtc/participant.go:1524	sending track published	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "cid": "{2ee04a7b-c411-49d7-b0a9-8a44bf433397}", "trackInfo": "sid:\"TR_VCLoF87h6RJT5i\" type:VIDEO width:1280 height:720 source:CAMERA layers:{width:320 height:180 bitrate:120000} layers:{quality:MEDIUM width:640 height:360 bitrate:300000} layers:{quality:HIGH width:1280 height:720 bitrate:1700000}"}
    2022-12-19T12:59:40.102Z	INFO	livekit	rtc/participant.go:421	received offer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:40.104Z	INFO	livekit	rtc/participant.go:449	sending answer	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:40.167Z	ERROR	livekit.pc	logger/logadapter.go:108	Incoming unhandled RTP ssrc(541364175), OnTrack will not be fired. stream id RTP Extensions required for Simulcast	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:40.172Z	ERROR	livekit.pc	logger/logadapter.go:108	Incoming unhandled RTP ssrc(2367973597), OnTrack will not be fired. stream id RTP Extensions required for Simulcast	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:40.718Z	ERROR	livekit.pc	logger/logadapter.go:108	Incoming unhandled RTP ssrc(1544465069), OnTrack will not be fired. stream id RTP Extensions required for Simulcast	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:45.094Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER", "state": "failed"}
    2022-12-19T12:59:45.094Z	DEBUG	livekit	rtc/transport.go:492	peer connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER", "state": "failed"}
    2022-12-19T12:59:45.094Z	INFO	livekit	rtc/transport.go:505	peer connection failed	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER"}
    2022-12-19T12:59:45.094Z	INFO	livekit	rtc/transport.go:1368	ice candidates	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER", "lc": ["udp4 host my.ip.0.0:56457", "tcp4 host my.ip.0.0:7881", "udp6 host my.ip.0.0:51114", "tcp6 host my.ip.0.0:7881"], "rc": [], "lc (filtered)": [], "rc (filtered)": []}
    2022-12-19T12:59:46.370Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER", "state": "failed"}
    2022-12-19T12:59:46.370Z	DEBUG	livekit	rtc/transport.go:492	peer connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER", "state": "failed"}
    2022-12-19T12:59:46.370Z	INFO	livekit	rtc/transport.go:505	peer connection failed	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T12:59:46.370Z	INFO	livekit	rtc/transportmanager.go:547	prefer TCP transport on both peer connections	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false}
    2022-12-19T12:59:46.370Z	INFO	livekit	rtc/transportmanager.go:461	setting ICE config	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "iceConfig": {"PreferSub":1,"PreferPub":1}}
    2022-12-19T12:59:46.370Z	INFO	livekit	rtc/transport.go:1368	ice candidates	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER", "lc": ["tcp4 host my.ip.0.0:7881", "udp4 host my.ip.0.0:54563", "udp6 host my.ip.0.0:52133", "tcp6 host my.ip.0.0:7881"], "rc": ["candidate:0 1 UDP 2122252543 my.ip.0.0 63182 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active", "candidate:0 1 UDP 2122252543 my.ip.0.0 62658 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active", "candidate:0 2 UDP 2122252542 my.ip.0.0 65263 typ host", "candidate:3 2 TCP 2105524478 my.ip.0.0 9 typ host tcptype active", "", "candidate:0 1 UDP 2122252543 my.ip.0.0 58779 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active", "candidate:0 1 UDP 2122252543 my.ip.0.0 54237 typ host", "candidate:3 1 TCP 2105524479 my.ip.0.0 9 typ host tcptype active"], "lc (filtered)": [], "rc (filtered)": []}
    2022-12-19T13:00:01.371Z	INFO	livekit	rtc/participant.go:1300	closing disconnected participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false}
    2022-12-19T13:00:01.371Z	INFO	livekit	rtc/participant.go:572	participant closing	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "sendLeave": true, "reason": "PEER_CONNECTION_DISCONNECTED"}
    2022-12-19T13:00:01.371Z	WARN	livekit	rtc/participant_signal.go:184	could not send message to participant	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "message": "*livekit.SignalResponse_Leave", "error": "no response sink"}
    2022-12-19T13:00:01.372Z	DEBUG	livekit	rtc/participant.go:1151	updating participant state	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "state": "DISCONNECTED"}
    2022-12-19T13:00:01.372Z	INFO	livekit	rtc/participant.go:1868	exiting publisher RTCP worker	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false}
    2022-12-19T13:00:01.372Z	DEBUG	livekit	rtc/room.go:246	participant state changed	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "state": "DISCONNECTED", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "oldState": "ACTIVE"}
    2022-12-19T13:00:01.373Z	INFO	livekit	rtc/room.go:403	closing participant for removal	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "pID": "PA_bFVTEPfcR5g4", "participant": "1515"}
    2022-12-19T13:00:01.373Z	INFO	livekit	sfu/downtrack.go:692	close down track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "flushBlankFrame": true}
    2022-12-19T13:00:01.373Z	INFO	livekit	sfu/downtrack.go:729	rtp stats	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "direction": "downstream", "stats": ""}
    2022-12-19T13:00:01.373Z	INFO	livekit	rtc/dynacastquality.go:61	setting subscriber max quality	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VSPZvNVyBAEk65", "relayed": false, "mime": "video/VP8", "subscriberID": "PA_bFVTEPfcR5g4", "quality": "OFF"}
    2022-12-19T13:00:01.374Z	DEBUG	livekit	rtc/transport.go:1214	leaving events processor	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER"}
    2022-12-19T13:00:01.374Z	DEBUG	livekit	rtc/mediatracksubscriptions.go:407	removing PeerConnection track	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "publisher": "1516", "publisherID": "PA_ggjKKZiNxfnD", "kind": "VIDEO"}
    2022-12-19T13:00:01.374Z	INFO	livekit	rtc/participant.go:959	removed subscribedTrack	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "publisherID": "PA_ggjKKZiNxfnD", "publisherIdentity": "1516", "trackID": "TR_VSPZvNVyBAEk65", "kind": "video"}
    2022-12-19T13:00:01.374Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER", "state": "closed"}
    2022-12-19T13:00:01.374Z	DEBUG	livekit	rtc/transport.go:492	peer connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "PUBLISHER", "state": "closed"}
    2022-12-19T13:00:01.374Z	DEBUG	livekit	rtc/transport.go:1214	leaving events processor	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER"}
    2022-12-19T13:00:01.375Z	DEBUG	livekit	rtc/transport.go:492	peer connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER", "state": "closed"}
    2022-12-19T13:00:01.375Z	DEBUG	livekit	rtc/transport.go:479	ice connection state change	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1515", "pID": "PA_bFVTEPfcR5g4", "remote": false, "transport": "SUBSCRIBER", "state": "closed"}
    2022-12-19T13:00:01.397Z	INFO	livekit	service/roommanager.go:453	RTC session finishing	{"participant": "1515", "pID": "PA_bFVTEPfcR5g4", "room": "521501298", "roomID": "RM_P8HE9e7LhR8X"}
    2022-12-19T13:00:11.208Z	ERROR	livekit	supervisor/participant_supervisor.go:165	supervisor error on publication	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VCLoF87h6RJT5i", "error": "publish time out"}
    2022-12-19T13:00:11.209Z	INFO	livekit	rtc/participant.go:1993	publication failed	{"room": "521501298", "roomID": "RM_P8HE9e7LhR8X", "participant": "1516", "pID": "PA_ggjKKZiNxfnD", "remote": false, "trackID": "TR_VCLoF87h6RJT5i"}
    
  • Address not associated with the desired network interface. Could not connect PeerConnection after timeout.

    Address not associated with the desired network interface. Could not connect PeerConnection after timeout.

    One of participants is able to connect to a room, start sharing his tracks but then immediately the connection breaks. The issue was first observed on Firefox but is also confirmed on Chrome. Rarely, if participant doesn't try to connect for some time, he'll be able to connect once, but after refreshing browser's window, the issue occurs again.

    Server

    • Version: [1.2.3, 1.3, custom docker image from latest LiveKit main branch]
    • Environment: [Docker]
    port: 7880
    rtc:
        tcp_port: 7881
        port_range_start: 50000
        port_range_end: 60000
        use_external_ip: true
        
        # https://github.com/livekit/livekit/issues/1216#issuecomment-1345151953
        ips:
            excludes:
            - 10.0.0.0/8
            - 172.16.0.0/12
            - 192.168.0.0/16
    
    redis:
        address: localhost:6379
        username: ""
        password: ""
        db: 0
    turn:
        enabled: true
        domain: livekit-turns.mycompany.com
        cert_file: ""
        key_file: ""
        tls_port: 5349
        udp_port: 443
        external_tls: true
    

    Client

    • SDK: [js]
    • Version: [1.5.0]

    To Reproduce

    1. Participant connects to a room,
    2. Participant publishes his camera track,
    3. Participant can only see himself, other participants can see him,
    4. Participant sees error in the browser's console Could not connect PeerConnection after timeout.
    5. Participant sees error in webrtc internal just after connecting Address not associated with the desired network interface. Then connection breaks.
    image

    Server/browser logs, webrtc internals attached in the following file

    Issue attachments.zip

  • Integrate pull request preview environments

    Integrate pull request preview environments

    I would like to support LiveKit by implementing Uffizzi preview environments. Disclaimer: I work on Uffizzi.

    Uffizzi is a Open Source full stack previews engine and our platform is available completely free for LiveKit (and all open source projects). This will provide maintainers with preview environments of every PR in the cloud, which enables faster iterations and reduces time to merge. You can see the open source repos which are currently using Uffizzi over here

    Uffizzi is purpose-built for the task of previewing PRs and it integrates with your workflow to deploy preview environments in the background without any manual steps for maintainers or contributors.

    We can go ahead and create an Initial PoC for you right away if you think there is value in this proposal.

    TODO:

    • [ ] Intial PoC

    cc @waveywaves

A simple library to extract video and audio frames from media containers (based on libav).
A simple library to extract video and audio frames from media containers (based on libav).

Reisen A simple library to extract video and audio frames from media containers (based on libav, i.e. ffmpeg). Dependencies The library requires libav

Jan 2, 2023
Synthetic media is a realistic transformation of audio and video using artificial intelligence.

Synthetic media is a realistic transformation of audio and video using artificial intelligence.

Nov 20, 2021
Go-video-preview-ffmpeg-wrapper - A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews.

Go-video-preview-ffmpeg-wrapper A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews. Getting Started u

Jan 5, 2022
Take control over your live stream video by running it yourself. Streaming + chat out of the box.
Take control over your live stream video by running it yourself.  Streaming + chat out of the box.

Take control over your content and stream it yourself. Explore the docs » View Demo · Use Our Server for Testing · FAQ · Report Bug Table of Contents

Jan 1, 2023
rtsp to webrtc proxy with websocket signaling, currently limited to single h264 stream per endpoint

rtp-to-webrtc rtp-to-webrtc demonstrates how to consume a RTP stream video UDP, and then send to a WebRTC client. With this example we have pre-made G

Aug 6, 2022
Personal video streaming server.

tube This is a Golang project to build a self hosted "tube"-style video player for watching your own video collection over HTTP or hosting your own ch

Jan 5, 2023
Short video direct link acquisition 短视频直连获取工具
Short video direct link acquisition 短视频直连获取工具

Glink 短视频去水印一键解析应用 Short video direct link acquisition 短视频直连获取工具 Glink是一款基于go语言开发的短视频解析应用,前端使用vue+argon主题,后端使用go-fiber框架,支持web在线模式、客户端模式。

Dec 7, 2022
Quik.do is a video conferencing tool.
Quik.do is a video conferencing tool.

Quik.do is a video conferencing tool.

Jan 3, 2023
live video streaming server in golang
live video streaming server in golang

中文 Simple and efficient live broadcast server: Very simple to install and use; Pure Golang, high performance, and cross-platform; Supports commonly us

Jan 4, 2023
Go4vl is Go library for working with the Video for Linux API (V4L2) natively, without any C bindings.

go4vl A Go library for working with the Video for Linux user API (V4L2). Gov4l hides all the complexities of working with V4L2 and exposes idiomatic G

Dec 23, 2022
Project to get Youtube video descriptions and search those videos as required

FamPayProject Project to get Youtube video descriptions and search those videos as required Prerequisities Postgres DB for persisting data Youtube Dat

Nov 5, 2021
Video converter with golang

Requirements Debian-like system (ubuntu, mint, etc...) with apt package manager Golang >1.15 Command tool make (use sudo apt install make -y to instal

Sep 10, 2022
golang function that download a video from youtube, and convert it to a mp3 file using ffmpeg

echedwnmp3 echedwnmp3 is a function that download a video from youtube, and convert it to a mp3 file using ffmpeg example package main import(echedwn

Dec 7, 2021
lmmp3 is a little golang library that download a video from youtube, and convert it to a mp3 file using ffmpeg

lmmp3 lmmp3 is a function that download a video from youtube, and convert it to a mp3 file using ffmpeg You need to have installed ffmpeg in your syst

Aug 12, 2022
ffcommander - An easy frontend to FFmpeg and Imagemagick to automatically process video and manipulate subtitles.

% FFCOMMANDER(1) ffcommander 2.39 % Mikael Hartzell (C) 2018 % 2021 Name ffcommander - An easy frontend to FFmpeg and Imagemagick to automatically pro

May 9, 2022
A go program that relies on back-end ffmpeg to process video-related content

Video Compress A go program that relies on back-end ffmpeg to process video-related content Installation v-go You can download the corresponding v-go

Dec 22, 2021
👾 Annie is a fast, simple and clean video downloader built with Go.
 👾 Annie is a fast, simple and clean video downloader built with Go.

?? Annie is a fast, simple and clean video downloader built with Go. Installation Prerequisites Install via go install Homebrew (macOS only) Arch Linu

Jun 1, 2022
SlideXtract - A tool to help extract slides from a video file.

SlideXtract A tool to help extract slides from a video file. Slides are output in the out folder. Features I didn't find any other piece of code that

Jul 3, 2022
📽 MovieGo - Video Editing in Golang

?? MovieGo - Video Editing in Golang MovieGo is a Golang library for video editing. The library is designed for fast processing of routine tasks relat

Dec 26, 2022