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

Overview

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.

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
    bug 
    opened by davidzhao 31
  • 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.

    opened by bekriebel 24
  • 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

    opened by CaosFR 21
  • 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?

    enhancement 
    opened by postacik 21
  • 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/[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.

    enhancement good first issue 
    opened by msackman 15
  • 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.

    opened by jibon57 15
  • 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?

    opened by alvinthen 15
  • 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

    opened by bekriebel 13
  • "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.

    opened by constant-null 12
  • 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
    opened by prasadkris 12
  • 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

    opened by atbe 12
  • 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.

    opened by renovate[bot] 0
  • 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

    opened by hiddein 0
  • 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"}
    
    opened by burzomir 2
  • 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

    opened by burzomir 11
  • 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

    opened by jpthurman 0
Releases(v1.3.2)
  • v1.3.2(Dec 16, 2022)

    Bugfix release. We recommend upgrading to this release. It includes a backwards-compatible internal protocol change. In a future release, the old protocol will be deprecated.

    Added

    • help-verbose subcommand to print out all flags #1171 #1180
    • Support for Redis cluster #1181
    • Allow loopback candidates to be used via config option #1185
    • Support for high bitrate audio #1188
    • Ability to detect publication errors and force reconnect #1214
    • API secrets are validated upon startup to ensure sufficient security #1217

    Fixed

    • Correctly suppress verbose pion logs #1163
    • Fixed memory leak on long running room/participants #1169
    • Force full reconnect when there is no previous answer #1168
    • Fixed potential SSRC collision between participants #1173
    • Prevent RTX buffer and forwarding path colliding #1174
    • Do not set forceRelay when unset #1184
    • Prevent subscription after participant close #1182
    • Fixed lost RTCP packets when incorrect buffer factory was used #1195
    • Fixed handling of high bitrate while adding Opus RED #1196
    • Fixes a rare timing issue leading to connection failure #1208
    • Fixed incorrect handling of | in participant identity #1220 #1223
    • Fixed regression causing Firefox to not connect over TURN #1226

    Changed

    • CreateRoom API to allocate the room on RTC node #1155 #1157
    • Check forwarder started when seeding #1191
    • Do not forward media until peer connection is connected #1194
    • Log sampler to reduce log spam #1222
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.3.2_linux_amd64.tar.gz(8.01 MB)
    livekit_1.3.2_linux_arm64.tar.gz(7.37 MB)
    livekit_1.3.2_linux_armv7.tar.gz(7.52 MB)
    livekit_1.3.2_windows_amd64.zip(7.92 MB)
    livekit_1.3.2_windows_arm64.zip(7.29 MB)
    livekit_1.3.2_windows_armv7.zip(7.50 MB)
  • v1.3.0(Nov 8, 2022)

    Changelog

    Added

    • Ingress Service support #1125
    • Support for web egress #1126
    • Ability to set all configuration params via command line flags #1112
    • Server-side RED encoding for supported clients #1137
    • Opus RED active loss recovery #1139
    • Experimental: fallback to TCP when UDP is unstable #1119
    • Populate memory load in node stats #1121

    Fixed

    • Fixed dynacast pausing a layer due to clients (FF) not publishing layer 0 #1117
    • Room.activeRecording updated correctly after users rejoin #1132
    • Don't collect external candidate IP when it's filtered out #1135
    • Install script to use uname without assuming /usr/bin #1138

    Changed

    • Allocate packetMeta up front to reduce number of allocations #1108
    • Do not log duplicate packet error. #1116
    • Consolidate getMemoryStats #1122
    • Seed snapshots to avoid saving/restoring in downtrack #1128
    • Remove Dependency Descriptor extension when AV1 is not preferred #1129
    • Always send participant updates prior to negotiation #1147
    • Set track level codec settings for all pending tracks #1148
    • Use Redis universal client to support clustered redis #1149
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.3.0_linux_amd64.tar.gz(7.91 MB)
    livekit_1.3.0_linux_arm64.tar.gz(7.28 MB)
    livekit_1.3.0_linux_armv7.tar.gz(7.43 MB)
    livekit_1.3.0_windows_amd64.zip(7.82 MB)
    livekit_1.3.0_windows_arm64.zip(7.20 MB)
    livekit_1.3.0_windows_armv7.zip(7.41 MB)
  • v1.2.5(Oct 20, 2022)

    Improved handling of multiple interfaces/IPs. Also adding the ability to manage stereo and RED support at a track level.

    Added

    • Ability to filter IP addresses from being used #1052
    • Allow TCP fallback on multiple connection failures #1077
    • Added support for track level stereo and RED setting #1086

    Fixed

    • Fixed stream allocator with SVC codecs #1053
    • Fixed UDPMux connectivity issues when machine has multiple interfaces #1081
    • Ensure sender reports are in sync after transceiver is re-used #1080
    • Fixed simulcast codec blocking track closure #1082
    • Prevents multiple transport fallback in the same session #1090

    Changed

    • Config validation has been enabled. Server will not start if there are invalid config values #1051
    • Improves NACK stats to count as a miss only if i t's not EOF #1061
    • Store track MIME type during publishing #1065
    • Minor cleanup of media track & friends module #1067
    • Split out shared media transport code into livekit/mediatransportutil #1071
    • Cleaned up logging, improved consistency of debug vs info #1073
    • Reduced memory usage with sequencer #1100
    • Improved IP address mapping, handling of multiple IPs #1094
    • Service API requests are logged #1091
    • Default HTTP handler responds with 404 for unknown paths #1088
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.2.5_linux_amd64.tar.gz(7.85 MB)
    livekit_1.2.5_linux_arm64.tar.gz(7.22 MB)
    livekit_1.2.5_linux_armv7.tar.gz(7.37 MB)
    livekit_1.2.5_windows_amd64.zip(7.77 MB)
    livekit_1.2.5_windows_arm64.zip(7.15 MB)
    livekit_1.2.5_windows_armv7.zip(7.36 MB)
  • v1.2.3(Sep 27, 2022)

    Several stability improvements / edge case handling along with stereo Opus support

    Added

    • Supervisor framework to improve edge case & error handling #1005 #1006 #1010 #1017
    • Support for stereo Opus tracks #1013
    • Allow CORS responses to be cached to allow faster initial connection #1027

    Fixed

    • Fixed SSRC mix-up for simulcasted tracks during session resume #1014
    • Fixed screen corruption for non-simulcasted tracks, caused by probing packets #1020
    • Fixed Handling of Simple NALU keyframes for H.264 #1016
    • Fixed TCPMux & UDPMux mixup when multiple host candidates are offered #1036

    Changed

    • Webhook requests are now using Content-Type application/webhook+json to avoid eager JSON parsing #1025
    • Don't automatically add STUN servers when explicit Node IP has been set #1023
    • Automatic TCP and TURN/TLS fallback is now enabled by default #1033

    Removed

    • Fully removed references to VP9. LiveKit is focused on AV1. #1004
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.2.3_linux_amd64.tar.gz(7.83 MB)
    livekit_1.2.3_linux_arm64.tar.gz(7.20 MB)
    livekit_1.2.3_linux_armv7.tar.gz(7.35 MB)
    livekit_1.2.3_windows_amd64.zip(7.74 MB)
    livekit_1.2.3_windows_arm64.zip(7.13 MB)
    livekit_1.2.3_windows_armv7.zip(7.34 MB)
  • v1.2.1(Sep 13, 2022)

    v1.2.1 is a bugfix release

    Added

    • Accepts existing participant ID on reconnection attempts #988

    Fixed

    • Fixed ICE restart during candidate gathering #963
    • Ensure TrackInfoAvailable is fired after information is known to be ready #967
    • Fixed layer handling when publisher pauses layer 0 (FireFox is has a tendency to pause lowest layer) #984
    • Fixed inaccurate participant count due to storing stale data #992

    Changed

    • Protect against looking up dimensions for invalid spatial layer #977
    • Improvements around migration handling #979 #981 #982 #995
    • Consistent mapping between VideoQuality, rid, and video layers #986
    • Only enable TCP/TURN fallback for supported clients #997
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.2.1_linux_amd64.tar.gz(7.80 MB)
    livekit_1.2.1_linux_arm64.tar.gz(7.17 MB)
    livekit_1.2.1_linux_armv7.tar.gz(7.32 MB)
    livekit_1.2.1_windows_amd64.zip(7.72 MB)
    livekit_1.2.1_windows_arm64.zip(7.10 MB)
    livekit_1.2.1_windows_armv7.zip(7.31 MB)
  • v1.2.0(Aug 27, 2022)

    We are excited to introduce two major quality improvement efforts in this release!

    First, we've added support for Opus RED. This brings a major step up to audio quality over lossy networks. Even with 50% packet loss, audio still comes out clear and free of robotic artifacts.

    The other major feature is the ability to automatically switch to TCP or TURN/TLS when UDP connection is failing. Certain routers/firewalls would initially let through UDP packets, but then either rate limit or block them from continuing. We can detect these scenarios and switch to TCP for that participant. To enable this, set rtc.allow_tcp_fallback: true in config.

    Added

    • Support for NACK with audio tracks #829
    • Allow binding HTTP server to specific address, binds to localhost in dev mode #831
    • Packet stats from TC (#832)
    • Automatic connectivity fallback to TCP & TURN (#872 #873 #874 #901 #950)
    • Support for client-side ping/pong messages (#871)
    • Support for setCodecPreferences for clients that don't implement it (#916)
    • Opus/RED support: redundant audio transmission is enabled by default (#938 #940)

    Fixed

    • Fixed timing issue in DownTrack.Bind/Close (#833)
    • Fixed TCPMux potentially blocking operations (#840)
    • Fixed ICE restart while still in ICE gathering (#895)
    • Fixed Websocket connection hanging if node isn't available to accept connection (#923)
    • Fixed ICE restart/resume in single node mode (#930)
    • Fixed client disconnected in certain conditions after ICE restart (#932)

    Changed

    • Move to synchronously handle subscriber dynacast status (#834)
    • Retransmit DD extension in case packets were missed (#837)
    • Clean up stats workers (#836)
    • Use TimedVersion for subscription permission updates (#839)
    • Cleaned up logging (#843 #865 #910 #921)
    • track_published event now includes the participant's ID and identity (#846)
    • Improve synchronization of track publishing/unpublish path (#857)
    • Don't re-use transceiver when pending negotiation (#862)
    • Dynacast and media loss proxy refactor (#894 #902)
    • PCTransport refactor (#907 #944)
    • Improve accuracy of connection quality score (#912 #913)
    • Docker image now builds with Go v1.19
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.2.0_linux_amd64.tar.gz(7.78 MB)
    livekit_1.2.0_linux_arm64.tar.gz(7.16 MB)
    livekit_1.2.0_linux_armv7.tar.gz(7.31 MB)
    livekit_1.2.0_windows_amd64.zip(7.70 MB)
    livekit_1.2.0_windows_arm64.zip(7.09 MB)
    livekit_1.2.0_windows_armv7.zip(7.30 MB)
  • v1.1.2(Jul 11, 2022)

    Added

    • Returns reason when server disconnects a client (#801 #806)
    • Allow livekit-server to start without keys configuration (#788)
    • Added recovery from negotiation failures (#807)

    Fixed

    • Fixed synchronization issues with Dynacast (#779 #802)
    • Fixed panic due to timing in Pion's ICE agent (#780)
    • ICELite is disabled by default, improving connectivity behind NAT (#784)
    • Fixed EgressService UpdateLayout (#782)
    • Fixed synchronization bugs with selective subscriptions & permissions (#796 #797 #805 #813 #814 #816)
    • Correctly recover from ICE Restart during an negotiation attempt (#798)

    Changed

    • Improved Transceiver re-use to avoid renegotiation (#785)
    • Close room if recorder is the only participant left (#787)
    • Improved connection quality score stability & computation (#793 #795)
    • Set layer state to stopped when paused (#818)

    Removed

    • Removed deprecated RecordingService - Egress should be used instead (#811)
    Source code(tar.gz)
    Source code(zip)
    checksums.txt(591 bytes)
    livekit_1.1.2_linux_amd64.tar.gz(7.36 MB)
    livekit_1.1.2_linux_arm64.tar.gz(6.81 MB)
    livekit_1.1.2_linux_armv7.tar.gz(6.92 MB)
    livekit_1.1.2_windows_amd64.zip(7.35 MB)
    livekit_1.1.2_windows_arm64.zip(6.80 MB)
    livekit_1.1.2_windows_armv7.zip(6.97 MB)
  • v1.1.0(Jun 22, 2022)

    [1.1.0] - 2022-06-21

    Added

    • Add support for Redis Sentinel (#707)
    • Track participant join total + rate in node stats (#741)
    • Protocol 8 - fast connection support (#747)
    • Simulate switch candidate for network connectivity with poor UDP performance (#754)
    • Allow server to disable codec for certain devices (#755)
    • Support for on-demand multi-codec publishing (#762)

    Fixed

    • Fixed unclean DownTrack close when removed before bound. (#736)
    • Do not munge VP8 header in place - fixes video corruption (#763)

    Changed

    • Reintroduce audio-level quantization to dampen small changes (#732)
    • Allow overshooting maximum when there are no bandwidth constraints. (#739)
    • Improvements to upcoming multi-codec simulcast (#740)
    • Send layer dimensions when max subscribed layers change (#746)
    • Use stable TrackID after unpublishing & republishing (#751)
    • Update egress RPC handler (#759)
    • Improved connection quality metrics (#766 #767 #770 #771 #773 #774 #775)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(May 28, 2022)

    [1.0.2] - 2022-05-27

    What's changed

    • Fixed edge cases where streams were not allocated (#701)
    • Fixed panic caused by concurrent modifications to stats worker map (#702 #704)
    • Batched subscriber updates to reduce noise in large rooms (#703 #729)
    • Fixed potential data race conditions (#706 #709 #711 #713 #715 #716 #717 #724 #727)
    • /debug/pprof endpoint when running in development mode (#708)
    • When audio tracks are muted, send blank frames to induce silence (#710)
    • Fixed stream allocator not upgrading streams after downgrading (#719)
    • Fixed repeated AddSubscriber potentially ignored (#723)
    • Fixed ListEgress API sometimes returning not found (#722)
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(May 18, 2022)

    1.0 Release!

    Read more about the release on our blog

    What's new

    • Improved stats around NACKs (#664)
    • Internal structures in preparation for AV1 SVC support (#669)

    What's changed

    • Supports participant identity in permissions API (#633)
    • Fixed concurrent access of stats worker map (#666 #670)
    • Do not count padding packets in stream tracker (#667)
    • Fixed TWCC panic under heavy packet loss (#668)
    • Change state to JOINED before sending JoinResponse (#674)
    • Improved frequency of stats update (#673)
    • Send active speaker update during initial subscription (#676)
    • Updated DTLS library to incorporate security fixes (#678)
    • Improved list-nodes command (#681)
    • Improved screen-share handling in StreamTracker (#683)
    • Inject silence opus packets when muted (#682)
    Source code(tar.gz)
    Source code(zip)
  • v0.15.7(May 3, 2022)

    Features

    • Supports IPv6 networks by default #571
    • NodeSelector to support sort options #599 (thanks @bekriebel)
    • Supports adaptiveStream flag - starts stream in a paused state for adaptive stream capable clients #623 #631

    Changes

    • Disallow identity that is an empty string #580
    • Returns Participant.region to clients for multi-region deployments #585
    • TrackIDs indicates the type and source of track #586
    • Reduce contention during session starts #614
    • Improved docker connectivity with using srflx candidates #624
    • Exposes Participant.isPublisher to indicate publisher vs subscriber #643
    • Reduced memory usage of internal stats accounting #645
    • Callback improvements #655 #652 #651

    Bugfixes

    • Improved available layer tracking #575
    • Avoid locking in callback #588
    • Prevent negative timestamp difference #595
    • Avoid locking when flushing DownTrack #594
    • Fixes server locking up sometimes with TCP connections #606
    • Fixed dynacast settings lost after ICE restart #620
    • Increase sizes of message queues to ensure delivery reliability #638 #641
    • Fixed connections silently disconnecting due to aggressive nomination #642 #644
    • Fixed memory leaks in MessageChannel #646
    • Correctly determine number of CPUs in a non-linux environment #653
    • Fixed node-ip parameter being ignored, leading to connectivity issues in local env #661
    Source code(tar.gz)
    Source code(zip)
  • v0.15.6(Mar 29, 2022)

    Features

    • Enable the ability to filter out certain network interfaces to avoid duplicate candidates #502
    • Support for Redis TLS connections #482 (thanks @alexbeattie42)
    • Client configuration system for detecting device specific issues/limitations #452
    • Supports TrackPublished and TrackUnpublished webhooks, along with other webhooks improvements #535
    • Unpublish tracks automatically when publish permissions are revoked for a participant #545
    • Support for upcoming Egress service

    Changes

    • Quality improvements to congestion controller: more stable stream allocations #532 #544 #549 #551 #557
    • Congestion controller now defaults to not pausing video by default #554
    • Passes serverRegion back when a participant is joining #479
    • Improved handling of simulcasted screenshares #503
    • Speaker events are now only emitted for audio level changes on microphone tracks #553 (thanks @sibis)
    • Dynacast now throttles downgrade events to reduce unnecessary changes #556 #558
    • Enable size limits to room & participant metadata #566

    Bugfixes

    • Fixed potential race condition when creating RTC room #485 (thanks @b20132367)
    • Fixed panic when writing to closed RTCP channel #495
    • Fixed RTCP worker stopped due to nil packets #504
    • Prevent StreamTracker from declaring base layer video to be stopped incorrectly #530
    • Fixed connection stall when non-primary peer connection becomes disconnected #537 #548
    • Fixed timestamp jump upon layer switch #543
    • Fixed deadlocks within Pion mux with 3.1.27 #555
    • Compatibility with Go 1.18
    • Fixed connectivity with Firefox when no tracks are subscribed #565
    • Always re-issue token to prevent client disconnecting before refresh interval #569
    Source code(tar.gz)
    Source code(zip)
  • v0.15.5(Mar 2, 2022)

    Changes in 0.15.5

    • Improved default speaker detection sensitivity #427
    • Improved handling of network congestion #429 #433
    • Use padding to probe instead of higher layers #434
    • Throttle retransmissions to prevent RTX storm #440
    • Include NACK ratio in congestion detection #443
    • Fixed stream update sending incorrect publisher ID #432
    • Fixed issue where screensharing would pause with Chrome 97+ #437
    • Fixed allocation retry in TURN #445
    • Avoid deadlocks in room close #451
    • Close websocket instead of hang on connection failure #458
    • Disable default node limits #472
    Source code(tar.gz)
    Source code(zip)
  • v0.15.4(Feb 9, 2022)

    Bring your own TURN servers #409

    You can now use any custom TURN server with LiveKit, including third-party TURN services. By setting rtc.turn_servers in the config, LiveKit will configure all connected clients to use specified TURN servers.

    Bugfixes and improvements

    • Fixed deadlock causing underlying buffer to become full #413
    • Disabled SRTP replay protection to improve Firefox compatibility #394
    • Improve connection reliability over links with longer latency #405
    • Lower DTLS retransmission interval to improve initial connection speed #414
    • Disable use of ICELite by default #397 #408
    • Smoother dynamic broadcast transition #389
    • Thread safety with map traversal #388
    • Use a single buffered channel for RTCP messages #418
    • Use message versions to better prevent race #399
    • Simplification/improvement of sfu.Buffer #398 #402
    • Improved context with logging #391 #416
    Source code(tar.gz)
    Source code(zip)
  • v0.15.3(Jan 29, 2022)

    Ability to disable room auto-creation #361

    In some cases, you may want to prevent rooms from being created automatically. (i.e. a streamer ended a session, so viewers should not be able to join)

    It's possible to disable auto-creation behavior from configuration.

    Automatic token refresh #365

    For long running sessions, the session may still be running after the client's connection token had expired. livekit-server will now automatically send clients refreshed tokens so clients will always have valid tokens to reconnect with.

    RoomService returns only after operation is complete #362

    Previously, RoomService would return a response before the operation is actually completed. This would lead to synchronization challenge from clients. In v0.15.3, RoomService behaves like you would expect: operation is completed before it returns.

    Other Changes

    • Use ICE-Lite to let clients take controlling role #322
    • Code refactoring for improved re-use
    • Simulate scenarios to allow client tests #330
    • Prevent multiple resume notifications for track changes #334
    • Enable CORS for RoomService #335
    • Integrated logging with Pion (#341)
    • Fixed missing tracks during long latency links #346
    • Fixed race condition when the room is closing when another participant is joining at the same time #370
    • Improved transceiver-reuse, avoid sending potentially un-decodable frames to clients #382
    • Honor auto-subscribe for participants who's given subscribe permissions after joining #381
    Source code(tar.gz)
    Source code(zip)
  • v0.15.2(Jan 6, 2022)

    Changes in 0.15.2

    Dynacast

    Ability to dynamically publish only layers that are being subscribed, significantly improving resource consumption on publishing clients. #295

    Scoped speaker updates

    Speaker updates will only be sent to subscribers. Other participants in the room will not receive updates. #280 #301

    List rooms by name(s)

    The ability to list rooms that match a particular set of inputs #290

    Webhook event uuid and timestamp

    Webhook callbacks will now include an unique ID as well as timestamp of the event. This enables idempotent processing of events on the listener side: #291

    Track MIME type

    TrackInfo now includes a MIME type field that identifies the codec used (i.e. video/h264 or video/vp8) #292

    Participant name

    Ability to attach a participant name in addition to identity. This should be set inside of the JWT token #293

    Configurable congestion control

    The ability to disable congestion control #305. This option could be set in configuration.

    Bugfixes

    • Close RTCP channel after published tracks are fully closed #286
    • Fix rare deadlock when waiting on a participant that stopped publishing #288
    • Handle IP resolution failure instead of silently failing #289
    • Fixed recording service requests for specific URL 7b0db1f3446c7bfa13ed7080d5a5b7435ad58110
    Source code(tar.gz)
    Source code(zip)
  • v0.15.1(Dec 22, 2021)

    Downstream congestion control

    We are introducing a significant improvement to the core SFU. It now monitors each subscriber's connection for congestion, and when detected, it controls bandwidth consumption for that subscriber by switching to lower simulcast layers at reduced bitrates. In case congestion gets worse, it'll prioritize audio and pause certain video tracks.

    The addition of this feature enables LiveKit to work within highly congested networks while delivering an acceptable user experience.

    Publisher-only mode

    When a participant connects without subscribe permission, server will use the publisher PeerConnection as the default #198

    Improved connection quality updates

    Connection quality updates now supports audio-only participants, with a MOS-style scoring.

    Other changes

    • bugfix: participant is always present when webhook is triggered #200
    • Room.numParticipant will reflect number of participants in a room #199
    • configurable limit for max number of tracks before a node marks itself unavailable #197
    • bugfix: send correct simulcast information in TrackInfo #218
    • docker image uses Go 1.17 #223
    • support for updated recorder protocol (to match livekit-recorder v0.3.12)
    • support for custom simulcast layers #238
    • cleaned up logging to include context #252
    • external TURN/TLS termination #168
    • improve video quality in simulcast layer selection #283
    Source code(tar.gz)
    Source code(zip)
  • v0.14.2(Nov 19, 2021)

    Bugfix release

    Lots of bugs squished and packed with improvements in the core SFU.

    • Improved health checks to avoid sending traffic to dead nodes #177 #183
    • Fixed compatibility with arm64 #178
    • For transceiver re-use, fixed retained frames from previous track #179
    • Fixed edge cases with forwarding incorrect picture id #180
    • Fixed deadlocks when multiple (>20) participants join at the exact same time #189 90f3c43dc583f5dbd244842bd3df6143e74deac7
    • Fixed connection quality updates not utilizing publisher loss stats #186
    • Fixed Room API breakage #190
    • Improved audio level indicator with Opus DTX #159
    • Supports both H.264 and VP8 by default, including mixing tracks from the same participant #128
    Source code(tar.gz)
    Source code(zip)
  • v0.14.0(Nov 5, 2021)

    Connection Quality Updates

    v0.14 introduces detection for connection quality that's performed on the server side. The SFU will gather various metrics such as packet loss, publish and subscribe success rates to determine the quality of the participant's connections. #167

    By performing this check on the server side, all LiveKit clients will receive quality information with minimal effort.

    Connection quality information is sent to the participant itself, as well as any other participants it's subscribed to.

    JS SDK v0.14.0 supports this feature, with Android, iOS, and Flutter to follow suit next week.

    Source code(tar.gz)
    Source code(zip)
  • v0.13.7(Nov 1, 2021)

    What's Changed

    • Fixes missing tracks when >3 participants join at the same time #163 (thanks to @bekriebel for reporting & verifying)

    Full Changelog: https://github.com/livekit/livekit-server/compare/v0.13.5...v0.13.7

    Source code(tar.gz)
    Source code(zip)
  • v0.13.5(Oct 20, 2021)

    Bugfix release

    • Update to pion v3.1.5, fixed handling of mixing simulcast/non-simulcast tracks 43079866a289bd8ca52cc26225958363e74ee711
    • Improve bandwidth estimation by sending abs-send-time #149
    • Correctly forward Track.Source #150
    Source code(tar.gz)
    Source code(zip)
  • v0.13.4(Oct 15, 2021)

  • v0.13.3(Oct 14, 2021)

    Region aware routing

    Introducing region-aware routing. When configured, LiveKit could route traffic to nodes that are closer to the end user. See multi region support #135 #141 (thanks @bekriebel)

    Recording revamp

    We've revamped our recording capabilities so that it's close to a GA release. Notable changes include RTMP simulcast support, and moving the pipelines to GStreamer from FFmpeg. Requires livekit-recorder v0.3.1 or higher #137

    Opus DTX support

    Opus DTX is enabled by default in this version, significantly reducing audio bandwidth utilization.

    Other change & bugfixes

    • Added routing metrics to be exposed via Prometheus #139
    • Enable Opus FEC with publisher in the room when subscribers are experiencing high loss #142
    • Transceiver re-use: with clients supporting protocol 4, livekit will re-use existing transceivers to avoid it ballooning. #145
    • Support for Source attribute in TrackInfo #146
    Source code(tar.gz)
    Source code(zip)
  • v0.13.1(Oct 5, 2021)

    • Fixed NACK handling when simulcast is enabled 797d2607c45e6986a74ef23c98ab26183687aa6a
    • Fixed client rejoining in single-node mode cdb04248fb0af7c167d7c168142597d5d831d524
    • Upgraded to Pion v3.1.1
    • Room Metadata support #126
    Source code(tar.gz)
    Source code(zip)
  • v0.13.0(Sep 22, 2021)

    Features

    Protocol 3

    support for protocol 3, where subscriber connection becomes the primary one. This speeds up session establishment for participants that aren't publishing.

    Graceful termination

    When running in multi-node, server will now terminate gracefully, allowing remaining rooms on the node to drain. #116

    Other changes

    • Fixed mute/unmute on simulcasted tracks with less than 3 layers #114
    • Support incremental speaker updates #120
    • Webhooks for when recording is finished #125
    Source code(tar.gz)
    Source code(zip)
  • v0.12.5(Sep 6, 2021)

    Changes since v0.12.0

    • option to disable server-initiated mute/unmute (supported with JS SDK) #107
    • fixed mute/unmute loop when JS client changes mute states quickly #107
    • support for load aware node selection #94
    • support for sendData room API #88
    • windows development support #101
    • fixed panic when simulcasting low res video #102
    • recorder to use message bus #108
    • various interface updates #97 #103 #104 #105 #106
    Source code(tar.gz)
    Source code(zip)
  • v0.12.0(Aug 10, 2021)

    Feature release v0.12.0

    Webhooks

    LiveKit can now notify your server when room events take place. See webhooks docs for configuration and details. The following server SDK versions include support for receiving webhooks:

    • server-sdk-go v0.6.0
    • server-sdk-js v0.5.1

    Recording support

    We've also included support for our upcoming recording feature. When released, it'll work with v0.12 and above.

    Source code(tar.gz)
    Source code(zip)
  • v0.11.4(Aug 1, 2021)

    Bugfix release

    Changes

    • Default TLS port updated to match rfc5766 #68
    • STUN servers are sent to clients automatically #69
    • Preparing for recording mode #70
    • Fixed external IP discovery #72
    • Fixed case where subscriber could be placed on an unavailable layer upon joining b8e1cbe4f57ebbae6676d3c744f0ae0e3eb64965
    Source code(tar.gz)
    Source code(zip)
  • v0.11.1(Jul 23, 2021)

    Bugfixes

    • Fixed force_tcp flag, correctly suppress UDP candidates when enabled #62
    • Fixed participant actions with Room API in single node configuration #67
    • Fixed participants kicked out of the room sometimes when adaptive simulcast is used (f3a17a151f8641fe00851c2d047776f72d67677e)

    Improvements

    Huge shoutout to @hn8 for the contributions!

    • TURN/UDP support for improved connectivity #61
    • Updated logger, consistent field names #57 #60
    • Ability to have invisible participants (preparing for recorder) #65
    Source code(tar.gz)
    Source code(zip)
Owner
LiveKit
Open source platform for real-time audio and video
LiveKit
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

NightGhost 77 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.

null 1 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

Robert van Alphen 0 Jan 5, 2022
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

Owncast 6.8k 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

Game On 5 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

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

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

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

Quik.do is a video conferencing tool.

Bora Tanrıkulu 143 Jan 3, 2023
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

浩麟 8.6k 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

Vladimir Vivien 143 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

null 0 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

Anaxita 2 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

pai 4 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

pai 8 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

Mikael Hartzell 2 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

JokerHeyra 0 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. Installation Prerequisites Install via go install Homebrew (macOS only) Arch Linu

Rohan 1 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

Soumitra Shewale 2 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

Student B. 140 Dec 26, 2022