https://livekit.io logo
Join Slack
Powered by
# egress
  • e

    eager-kite-60809

    12/21/2025, 4:24 PM
    Hey, noticed that
    await api.LiveKitAPI().start_room_composite_egress(req)
    would fail silently when called in livekit agent when credentials are misconfigured. Is this expected? Shouldnt it throw an unauthorised error? Anyone also encountering the same? I was following this guide from https://docs.livekit.io/deploy/observability/data/#record-audio-or-video Code:
    from livekit import api
    file_outputs = [
    api.EncodedFileOutput(
    file_type=api.EncodedFileType.OGG,
    filepath=filepath,
    azure=api.AzureBlobUpload(
    account_name=account_name,
    account_key=account_key,
    container_name=container_name,
    ),
    )
    ]
    req = api.RoomCompositeEgressRequest(room_name=ctx.room.name, audio_only=True, file_outputs=file_outputs, audio_mixing="DUAL_CHANNEL_AGENT")
    lkapi = api.LiveKitAPI()
    try:
    await lkapi.egress.start_room_composite_egress(req)
    except Exception as e:
    print(e)
  • a

    abundant-magician-17307

    12/22/2025, 2:01 AM
    I deployed the egress v1.9 version on a domestic Kirin v10 ARM machine and successfully started the egress service. However, when recording MP4 files, an error message 'chrome failed to start' was reported. Below, I will provide the error log. In contrast, it is normal for me to deploy on Euler ARM machines
    c
    • 2
    • 2
  • a

    ambitious-london-8261

    12/22/2025, 6:28 AM
    Hello, When I make outbound call from my agent and when customer answer call my asterisk server sending me 200 OK. But after this my agent does not start speaking. With another provider same flow is working. Before I was initiating another call to my agent when customer answers my call. But thsi cause 2 rooms generation for same call and I do not want to create 2 channels for 1 call. How I can handle 200 OK event to start talking my agent?
    c
    • 2
    • 1
  • m

    miniature-soccer-13249

    12/22/2025, 8:03 AM
    Whenever i am recording calls on my server using livekit. Nodebox and c3_pool services run on my system and server cpu utilisation doesn’t go down. Any idea how to prevent this? Ports used: 7880,7881,443,3306,6379,80,53,
  • g

    glamorous-garden-97700

    12/23/2025, 4:24 PM
    Hi LiveKit team 👋 I’m stuck with an issue related to room composite recording (egress) and could use some guidance. Problem: I’m recording a room using RoomCompositeEgress. Recordings are successfully uploaded to Cloudflare R2 (S3-compatible) When screen share or camera is ON, the recording looks fine • But when no screen share or camera is active, the recorded video shows a black screen What I’m expecting instead is: • A default participant tile / placeholder UI (similar to what the LiveKit UI shows when users are audio-only) Current behavior: • Live room UI works fine • Recording shows black frames until someone shares screen or turns on camera What I want: • Always show a grid / participant tile layout even when users are audio-only • Avoid black screen in the recording Current egress implementation:
    Copy code
    export async function startRoomRecording(roomName: string): Promise<void> {
      const egressClient = getEgressClient();
      const filepath = `${roomName}.mp4`;
      const fileOutput = new EncodedFileOutput({
        filepath,
        output: {
          case: "s3",
          value: new S3Upload({
            endpoint: R2_ENDPOINT,
            accessKey: R2_KEY_ID,
            secret: R2_KEY_SECRET,
            region: R2_REGION,
            bucket: R2_BUCKET,
            forcePathStyle: true,
          }),
        },
      });
      await egressClient.startRoomCompositeEgress(roomName, fileOutput, {
        layout: "grid",
      });
    }
    Questions: 1. Is the black screen expected behavior when no video tracks are published? 2. Is there a way to force a default tile / placeholder in recordings? 3. Do we need a custom layout or video track injection for this use case? Everything else in our recording flow works perfectly — this is the only blocker. Thanks in advance 🙏
    c
    • 2
    • 3
  • c

    colossal-bear-85704

    12/25/2025, 4:54 PM
    Hi LiveKit Team, I’m building an interview platform where I need to record candidates answering specific questions one by one. I would love a second pair of eyes on my architecture and configuration, as I am hitting severe stability issues in production that I didn't see during local testing. The Setup I am running a "Single Box" self-hosted setup. LiveKit Server + Egress + Redis are all running on the same machine via Docker Compose ( followed this guy's tutorial for the setup ) • Hardware: 8 vCPUs / 16 GB RAM. • Workflow: a. Candidate connects. b. For each question, I trigger Stop then Start of 2 Egresses via API. This is to ensure ti have separability between recordings that is align to when the question is displayed 1. I run two separate Egresses simultaneously for each question: ▪︎ 1x
    ParticipantEgress
    for Camera + Audio (MP4). ▪︎ 1x
    ParticipantEgress
    for Screen Share (Images/Screenshots). The Issues In production, I am seeing significant degradation: 1. Random A/V Desync: i don't know the reason and it happens randomly sometimes even with a fast connection. Logs show tracks being ignored due to delays sometimes reaching >1.5 seconds and even more. Sync is rarely recovered. 2. Data Loss: Videos sometimes start with black frames or have no audio at all. I played around with Egress params but it seems it created other problems ( like sometimes audio keep going off for few seconds and come back, Cf. the
    egress.yaml
    config i put at the end of the message ) Below are my configurations. I would really appreciate a feedback in the setup and especially if am doing some trivial mistakes that i can correct immediatly. > Python Code Snippet for the Egresses ( excluding the stop and start logic )
    Copy code
    # 1. Camera + Audio Egress
    camera_audio_output = EncodedFileOutput(
        filepath=camera_storage_path,
        file_type=EncodedFileType.MP4,
        disable_manifest=True,
    )
    camera_audio_request = ParticipantEgressRequest(
        room_name=room_name,
        identity=participant_identity,
        screen_share=False,  # Camera + audio only
        file_outputs=[camera_audio_output],
        preset=EncodingOptionsPreset.H264_720P_30
    )
    
    # 2. Screen Egress (only if question requires screen recording)
    screen_output = ImageOutput(
        capture_interval=int(1 / settings.ocr_extraction_fps),
        filename_prefix=screen_storage_prefix  # e.g. "frame_000000.jpg", "frame_000001.jpg", etc.
    )
    screen_request = ParticipantEgressRequest(
        room_name=room_name,
        identity=participant_identity,
        screen_share=True,  # Record screen share
        image_outputs=[screen_output]
    )
    > React Frontend snippet that publishes the streams at the beginning of the interviews
    Copy code
    const publishPromises: Promise<void>[] = [];
          const userMediaStreamName = 'user-camera-mic';
          
          // Prepare camera + audio with synchronized stream (same stream name for A/V sync)
          if (preGrantedStreams.cameraStream) {
            const videoTrack = preGrantedStreams.cameraStream.getVideoTracks()[0];
            const audioTrack = preGrantedStreams.cameraStream.getAudioTracks()[0];
            
            if (videoTrack && audioTrack) {
              // Publish both camera and microphone simultaneously for better synchronization
              // Using the same stream name ensures they are placed in the same MediaStream
              publishPromises.push(
                room.localParticipant.publishTrack(videoTrack, {
                  name: 'camera',
                  source: Track.Source.Camera,
                  stream: userMediaStreamName,
                }).then(() => {
                  console.log('[handleStartInterview] ✓ Camera video track published');
                })
              );
              publishPromises.push(
                room.localParticipant.publishTrack(audioTrack, {
                  name: 'microphone',
                  source: Track.Source.Microphone,
                  stream: userMediaStreamName,
                }).then(() => {
                  console.log('[handleStartInterview] ✓ Microphone audio track published');
                })
              );
            } else if (videoTrack) {
              publishPromises.push(
                room.localParticipant.publishTrack(videoTrack, {
                  name: 'camera',
                  source: Track.Source.Camera,
                  stream: userMediaStreamName,
                }).then(() => {
                  console.log('[handleStartInterview] ✓ Camera video track published');
                })
              );
            }
          }
    
          // Prepare screen share
          if (preGrantedStreams.screenStream) {
            const screenTrack = preGrantedStreams.screenStream.getVideoTracks()[0];
            
            if (screenTrack) {
              publishPromises.push(
                room.localParticipant.publishTrack(screenTrack, {
                  name: 'screen_share',
                  source: Track.Source.ScreenShare,
                  simulcast: false, // Disable simulcast for faster egress start
                }).then(() => {
                  console.log('[handleStartInterview] ✓ Screen share track published (single quality layer)');
                })
              );
            }
          }
    
          // Publish all tracks simultaneously for better synchronization
          await Promise.all(publishPromises);
    
          // Mark as started
          setIsInterviewStarted(true);
          setSetupComplete(true);
          showNotification('Interview started successfully!', 'success');
    > My Current Egress Configuration ( I am quite aware that i might set some params too high ).
    Copy code
    redis:
        address: <REDIS_ADDR>
    
    storage:
        gcp:
            bucket: <GCS_BUKCKET>
    
    cpu_cost:
      participant_cpu_cost: 1
    
    latency:
      rtcp_sender_report_rebase_enabled: true 
      rtp_max_drift_adjustment: 3s
      jitter_buffer_latency: 3s
    > And last my docker compose for running the live-kit services
    Copy code
    services:
      caddy:
        image: livekit/caddyl4
        command: run --config /etc/caddy.yaml --adapter yaml
        restart: unless-stopped
        network_mode: "host"
        volumes:
          - ./caddy.yaml:/etc/caddy.yaml
          - ./caddy_data:/data
      livekit:
        image: livekit/livekit-server:latest
        command: --config /etc/livekit.yaml
        restart: unless-stopped
        network_mode: "host"
        volumes:
          - ./livekit.yaml:/etc/livekit.yaml
      redis:
        image: redis:7-alpine
        command: redis-server /etc/redis.conf
        restart: unless-stopped
        network_mode: "host"
        volumes:
          - ./redis.conf:/etc/redis.conf
      egress:
        image: livekit/egress:latest
        restart: unless-stopped
        environment:
          - EGRESS_CONFIG_FILE=/etc/egress.yaml
        network_mode: "host"
        volumes:
          - ./egress.yaml:/etc/egress.yaml
        cap_add:
          - CAP_SYS_ADMIN
    c
    • 2
    • 5
  • c

    cuddly-cartoon-47334

    12/27/2025, 10:58 PM
    Do you alwasy have to stop egress? Lately I have been getting this error: Failed to stop egress: TwirpError(code=failed_precondition, message=egress with status EGRESS_COMPLETE cannot be stopped, status=412) but I need the filename that stop_egress outputted. How can I do this?
    c
    • 2
    • 2
  • f

    fancy-florist-18763

    02/12/2026, 8:09 PM
    Hi Team, I am using Egress to record and send the the recording on s3. I receive all egress webhooks for example participant_left and track_unpublished except egress_updated and egress_ended. On the livekit cloud --> Egress tab, I can see instance for subscriber uploaded mp4 to s3. Can someone help?
    c
    l
    • 3
    • 9
  • s

    strong-hydrogen-34992

    02/13/2026, 4:14 PM
    Hi team, I am self hosting livekit. The egress service abruptly stops sometimes after logging that it's connecting to redis. The livekit server cancels the recording after 10s since it doesn't get any response from egress service.
    Copy code
    2026-02-13T07:05:59.764Z	INFO	egress	pipeline/watch.go:115	pipeline received EOS	{"nodeID": "NE_JGn2CW6uEUET", "handlerID": "EGH_DCTYA66WgMtY", "clusterID": "", "egressID": "EG_qfzmKVSQR9wb"}
    2026-02-13T07:06:00.127Z	INFO	egress	info/io.go:269	egress_complete	{"nodeID": "NE_JGn2CW6uEUET", "clusterID": "", "egressID": "EG_qfzmKVSQR9wb", "requestType": "room_composite", "outputType": "file", "error": "", "code": 0, "details": "End reason: Source closed"}
    2026-02-13T07:24:38.141Z	INFO	egress	server/server_rpc.go:59	request received	{"nodeID": "NE_JGn2CW6uEUET", "clusterID": "", "egressID": "EG_dz3JMaE3cvex"}
    2026-02-13T07:24:38.141Z	INFO	egress	server/server_rpc.go:69	request validated	{"nodeID": "NE_JGn2CW6uEUET", "clusterID": "", "egressID": "EG_dz3JMaE3cvex", "requestType": "room_composite", "sourceType": "EGRESS_SOURCE_TYPE_WEB", "outputType": "file", "room": "study_698dc93713cf9c6e82b1a8e3_participant_698dcb4d13cf9c6e82b1a8e6_e0d60f", "request": {"RoomComposite":{"room_name":"study_698dc93713cf9c6e82b1a8e3_participant_698dcb4d13cf9c6e82b1a8e6_e0d60f","layout":"grid-dark","Output":null,"Options":null,"file_outputs":[{"file_type":1,"filepath":"study_698dc93713cf9c6e82b1a8e3_participant_698dcb4d13cf9c6e82b1a8e6_e0d60f/media","Output":{"Azure":{"account_name":"{account_name}","account_key":"{account_key}","container_name":"interview"}}}]}}}
    2026-02-13T07:24:38.156Z	INFO	egress	redis/redis.go:144	connecting to redis	{"nodeID": "NE_JGn2CW6uEUET", "handlerID": "EGH_iSDJGyGmoBXM", "clusterID": "", "egressID": "EG_dz3JMaE3cvex", "simple": true, "addr": "localhost:6379"}
    I am running egress, livekit and redis on a single machine. Attached is my init script for all the docker containers.
    init.sh
    c
    • 2
    • 3
  • l

    lively-winter-88668

    02/16/2026, 10:32 AM
    👇 Please forgive the repeated posts, Slack does not have a good mechanism for persisting a message like this:👇
    Hi everyone, please be aware that we have a new community forum at community.livekit.io and the plan is to move support for this channel into that new forum. I understand such a move will not happen overnight, but LiveKit staff will start to prioritise the new forum when answering community support questions. Please see full details at https://livekit-users.slack.com/archives/C01KZ61HZRR/p1770299394024089, which is also the best place to ask questions and raise concerns.
  • b

    broad-teacher-94403

    02/16/2026, 5:59 PM
    Hi, Any ideas how to deploy on-prem egress server with gcp bucket that has workload identity? Does egress server need a GPU? My requests are going to egress but they are getting aborted and not pushed to the bucket
    f
    e
    • 3
    • 7
  • b

    bland-cpu-63716

    02/17/2026, 7:30 AM
    hi i am using livekit in my app Below is the functionality of app Host having n number of user I want to record call on user side on user side i want recording of host and the logged in user not all user below is my code i am using 2.15.0 sdk version on nodejs
    Copy code
    onst startRecording = async (req, res) => { console.log("========== START RECORDING API CALLED =========="); console.log("Request Body:", req.body); console.log("Auth Type:", req.authType); console.log("User ID:", req.userId); console.log("Host ID:", req.hostId); console.log("Login ID:", req.login_id); try { const role = req.authType; console.log("Role Detected:", role); console.log("Fetching AWS Config..."); const config = await getAWSConfig(); console.log("AWS Config Loaded:", { livekitHost: config.livekitHost, apiKey: config.livekitApiKey ? "Present" : "Missing", bucket: config.bucket, region: config.region, }); console.log("Creating Egress Client..."); const egressClient = new EgressClient( config.livekitHost.replace("wss://", "https://"), config.livekitApiKey, config.livekitSecret ); console.log("Egress Client Created Successfully"); let hostId; let participantsToRecord = []; console.log("Checking Role Logic..."); if (role === 4) { console.log("Role is HOST (4)"); hostId = req.userId?.toString(); participantsToRecord = [host_${hostId}]; console.log("Host Participants:", participantsToRecord); } else if (role === 6) { console.log("Role is USER (6)"); hostId = req.hostId?.toString(); const userIdentity = req.login_id; const hostIdentity = "roothost"; participantsToRecord = [hostIdentity, userIdentity]; console.log("User Participants:", participantsToRecord); } else { console.log("Unauthorized Role:", role); return res.status(403).json({ success: false, message: "Recording not allowed for this role", }); } const roomName = call_${hostId}; console.log("Room Name:", roomName); console.log("Checking if recording already exists..."); console.log("Active Recordings Store:", activeRecordings.host); // Make sure the per-host store exists activeRecordings.host[hostId] = activeRecordings.host[hostId] || {}; // Now check per-user if (activeRecordings.host[hostId][req.userId?.toString()]) { console.log("Recording already running for user:", req.userId); return res.status(400).json({ success: false, message: "Recording already running for this user", }); } let filePath; if (role === 4) { filePath = recordings/host/${hostId}/${uuidv4()}.mp4; console.log("Host Recording Path:", filePath); } else { const userId = req.userId.toString(); filePath = recordings/user/${hostId}/${userId}_${uuidv4()}.mp4; console.log("User Recording Path:", filePath); } console.log("Preparing S3 File Output..."); const fileOutput = new DirectFileOutput({ filepath: filePath, // filepath: recordings/composite_${uuidv4()}.ogg, output: { case: "s3", value: new S3Upload({ accessKey: config.accessKey, secret: config.secret, bucket: config.bucket, region: config.region, }), }, }); console.log("Starting Room Composite Egress..."); console.log("Egress Options:", { layout: "grid", audioOnly: false, participants: participantsToRecord, }); const requestedUsers = [req.login_id,"roothost"]; // ["101", "204"] const audioTrackIds = []; const roomService = await getRoomService(); const participants = await roomService.listParticipants(roomName); for (const p of participants) { if (!requestedUsers.includes(p.identity)) continue; for (const pub of p.tracks) { console.log(pub,"pub") // MICROPHONE audio track // if (pub.source === 1 && pub.sid && !pub.muted) { audioTrackIds.push(pub.sid); // } } } console.log("Collected Audio Track IDs:", audioTrackIds); const egressRequest = { roomName, // include roomName here audioTrackIds, // array of strings file: fileOutput, // S3 or local output layout: "grid" // optional for video }; // const egress = await egressClient.startRoomCompositeEgress( // roomName, // fileOutput, // { // layout: "grid", // audioOnly: true, // audioTrackSelector: { // participants: requestedUsers // participant identities, NOT track SIDs // } // } // ); const egress = await egressClient.startTrackCompositeEgress(roomName, { audioTrackIds: [audioTrackIds], // only this user's track file: fileOutput }); console.log("Track composite egress started:", egress.egressId); // Ensure egressId exists before storing if (!egress?.egressId) { // wait for egress to be fully initialized if SDK provides an event await new Promise((resolve, reject) => { egressClient.once('egress_started', (event) => { if (event.egressId) { resolve(event.egressId); } else { reject(new Error("Egress started but egressId not found")); } }); // Optional: add timeout to reject after 10s setTimeout(() => reject(new Error("Egress start timed out")), 10000); }).then((id) => { egress.egressId = id; }); } console.log("✅ TRACK EGRESS STARTED:", egress.egressId); console.log("✅ EGRESS STARTED SUCCESSFULLY"); console.log("Egress ID:", egress.egressId); // activeRecordings.host[hostId] = egress.egressId; // Store egressId per host AND per user activeRecordings.host[hostId] = activeRecordings.host[hostId] || {}; activeRecordings.host[hostId][req.userId.toString()] = egress.egressId; console.log("Active Recording Updated:", activeRecordings.host); console.log("========== START RECORDING SUCCESS =========="); return res.json({ success: true, message: "Recording started", egressId: egress.egressId, filePath, }); } catch (error) { console.error("========== START RECORDING ERROR =========="); console.error("Error Message:", error.message); console.error("Stack:", error.stack); return res.status(500).json({ success: false, message: error.message, }); } };
    • 1
    • 1
  • g

    gorgeous-elephant-19666

    02/17/2026, 6:59 PM
    We continue to have corrupt Composite output from the LiveKit cloud roughly 5% of the time. • "egress_id":"EG_ArtFvLdWJ6un" • the ogg and webm files are all good, just the final composite is bad • the composite is configured as 4k resolution HLS in 6 second chunks • we have multiple cameras and a screen share coming in and the screen share can be 1080p or higher 1. Can you check what the issue is - is it on your end with your server not handling that much IO/CPU 2. Can you provide us with a gstreamer or ffmpeg python script that will create a composite from the json files? We can't get the audio to sync properly with the video and it's overly complex to stitch it all together, especially if the screenshare files have their own video. This has been an ongoing issue we have reported a few times and we'lre looking for a workflow to solve it. Thank you!
    🙏 1
    c
    • 2
    • 1
  • l

    lively-winter-88668

    02/18/2026, 2:19 PM
    👇 Please forgive the repeated reposts, but Slack is terrible about keeping messages like this in context:👇
    Hi everyone, please be aware that we have a new community forum at community.livekit.io and the plan is to move support for this channel into that new forum. I understand such a move will not happen overnight, but LiveKit staff will start to prioritise the new forum when answering community support questions. Please see full details at https://livekit-users.slack.com/archives/C01KZ61HZRR/p1770299394024089, which is also the best place to ask questions and raise concerns.
  • m

    melodic-kangaroo-88838

    02/18/2026, 6:34 PM
    Hey everyone, recently we’ve been facing an issue with LiveKit peer-to-peer voice calls. On our web platform ( NextJS + NodeJS), while people are recording their conversations via individual egress, we’ve noticed some noise appearing as brief plucking or crackling sounds—similar to a momentary loose microphone cable / Audio click / mic drag —lasting less than 1 second per occurrence but repeating multiple times within a session. I tried turning off autoGainControl: false and dtx: false as potential fixes, but we lost audio volume as a result and the issue remained persistent. Do you have any suggestions on what we can try to fix this issue? Here’s our LiveKit configuration: • sampleRate: 48k • autoGainControl: true • echoCancellation: true • noiseSuppression: true • dtx: false (it was true earlier; we’re doing some iterative testing to fix the issue) • adaptiveStream: true • dynacast: false This issue was much less frequent earlier, but starting from early February 2026, it has been occurring in almost every session. We’ve tried changing the configuration by turning off DTX and autoGainControl, but the issue still persists. Is there anything specific we should check into?
    p
    • 2
    • 2
  • e

    eager-pager-29628

    02/20/2026, 10:00 AM
    Hello everyone, I had a problem with a video Egress with ID: EG_VHBoPD4bT9Cv. I got that error: End reason: StopEgress API pipeline frozen Do you know any solution? I need that video for a final client 😞 Thanks!!
    c
    • 2
    • 1
  • l

    lively-winter-88668

    02/20/2026, 10:22 AM
    alert This channel is being sunset on 27th February 2026: alert
    Hi everyone, please be aware that we have a new community forum at community.livekit.io and the plan is to move support for this channel into that new forum. Please see full details here. The Slack community will remain, but we will do housekeeping of the technical channels after that date.
  • m

    most-agency-42791

    03/22/2026, 12:41 PM
    Hello 👋 webhooks doesnt work for me? When did the issue start? (include timezone) Started recently Webhook test events and real events are not firing. ⸻ Error messages (if any) No explicit error messages. ⸻ ⸻ How can we reproduce the issue? 1. Configure webhook endpoint 2. Trigger a test event → webhook doesnt fire 3. Trigger a real event (actual workflow/action) → webhook does NOT fire ❌ ⸻ Additional Notes • Endpoint is publicly accessible • No logs received for real events • No retries observed
    ✅ 1
    t
    r
    • 3
    • 3
  • b

    brainy-stone-78705

    03/23/2026, 2:39 PM
    I am trying to record egresss for participant recordings. no matter what i try, there is always drift between audio and video on the livekit side for the participant recording.i am using the giiven instruction but there is always a drift. any fixes or suggestions? it is impacting our prod pdocasting capabilities
    ✅ 1
    t
    • 2
    • 1
  • b

    busy-fish-13948

    03/23/2026, 6:10 PM
    Does EGRESS_ENDED get fired when the file is finished uploading (it's there when I perform a GET) ?
    ✅ 1
    t
    • 2
    • 1
  • l

    lively-terabyte-73999

    03/27/2026, 6:06 AM
    Hi @refined-appointment-81829, For 3 sessions, in the audio OGG track stored by track composite egress, the agent audio in missing for few turns towards the tail end of the call.(not throughout the entire call). The individual participant track has all the turns for their respective participants. What could have caused this. Any suggestions would be helpful.
    ✅ 1
    t
    • 2
    • 1
  • a

    able-printer-77739

    04/01/2026, 10:35 PM
    I get a transcript for a session after it's recorded by passing the mp4 to assembly AI. however, it's very hard to map the precise timestamps in the recording with the timestamps that my agent knows, so I lose specificity on who is speaking when and at exactly what moment. what is the best fix for this? i need word and utterance level timestamp specificity for the recording, which isn't exactly when my agent thinks things are happening. Please advise!
    ✅ 1
    t
    • 2
    • 1
  • r

    rapid-forest-54057

    04/10/2026, 5:31 PM
    We're running a LiveKit agent + end user session with egress recording to S3. The S3 audio is crystal clear for both tracks, but session analytics tell a different story — the end user's audio fades out, which caused our agent to interrupt them repeatedly. To be clear: the agent's audio is fine throughout. It's only the end user's track that behaves strangely, and only in analytics — the egress recording sounds great, so we know the audio is arriving cleanly on our end. What's causing the discrepancy between the egress recording and the session analytics? Has anyone run into this before?
    ✅ 1
    t
    • 2
    • 1
  • b

    billions-king-25562

    04/11/2026, 7:57 PM
    Failed to stop egress: TwirpError(code=failed_precondition, message=egress with status EGRESS_ABORTED cannot be stopped, status=412) {'TwirpError(code=failed_precondition, message=egress with status EGRESS_ABORTED cannot be stopped, status=412)'}" Does the state EGRESS_ABORTED discards the recorded file ?
    ✅ 1
    t
    • 2
    • 1
  • f

    fierce-vase-70658

    04/16/2026, 8:12 AM
    We're using LiveKit Egress for recording interview sessions. We're seeing an issue where the recorded video is consistently longer than the actual session duration — a 5-minute session produces a ~6-minute video, with the last ~1 minute being a blank/black screen. Expected: Recording duration matches the session duration. Actual: Recording has an extra ~1 minute of blank screen appended at the end. Questions: 1. Is this a known behavior with Egress? Does the recording continue for some buffer period after the room/track ends? 2. Is there a configuration to stop recording immediately when the last participant leaves or the track ends? 3. Or is this something we need to handle on our end (e.g., explicitly calling StopEgress at the right time)? Any pointers would be helpful.
    ✅ 1
    t
    • 2
    • 1
  • a

    alert-ghost-21188

    04/20/2026, 5:48 AM
    Hey - we're trying to align individual participant tracks to the composite recording from Room Composite Egress and want to stop estimating it via audio cross-correlation. Can you tell me if any of these are accessible: 1. Per-track RTP timestamps (first-packet + clock rate) 2. RTCP Sender Report NTP↔️RTP mappings per track 3. A composite mix manifest (which track started at which composite sample) Anything in EgressInfo or the webhooks we might've missed also works. Thanks!
    ✅ 1
    t
    • 2
    • 1
  • e

    early-ability-54324

    04/20/2026, 6:21 AM
    Is there anyone who self-hosts the egress server while using livekit cloud for the rest components of the livekit server to avoid egress limit?
    ✅ 1
    t
    • 2
    • 1
  • b

    breezy-toddler-90951

    05/09/2026, 4:30 PM
    Hi, is anyone else experiencing issues with automatically egress completed? I’ve faced this issue continuously several days.
    ✅ 1
    t
    • 2
    • 1
  • p

    polite-oil-10264

    05/11/2026, 5:12 PM
    Hello , I’m using a self-hosted LiveKit setup with the egress service for diffusion. I’m streaming via RTMP, but there is always a big delay between the live stream and the room.
    ✅ 1
    t
    • 2
    • 1
  • l

    lively-winter-88668

    05/27/2026, 8:43 AM
    archived the channel