Skip to main content
Paid plans only Video stream with a Live red indicator indicating that the call is being live streamed Daily live streaming lets you broadcast a real-time, multi-participant video call to the streaming platform of your choice. Live streaming sends RTMP streams, real-time data like call participants’ video and audio, to a specific location over the internet where interested people can tune into the broadcast. Webinars, conference panels, classes, concerts, all-hands meetings, and many other live events are all good candidates for live streaming.
Receive a $15 credit for freeNew accounts have a $15 credit automatically applied when you add a credit card. See our pricing page for details.

Key terms

Encoder — software (or hardware) that compresses the stream. Daily is the encoder. Transcoder — software that ingests the RTMP stream and transcodes it into an HLS stream. Examples: YouTube Live, Mux, AWS IVS. HLS streamHTTP Live Streaming, an HTTP-based adaptive bitrate streaming protocol.

Daily live streaming

Daily manages audio, video, and screen share streams for calls of up to 100,000 participants. (Read our interactive live streaming guide for more information.) Daily live streaming encodes the collective call stream to a transcoder of your choice, and provides options to customize the stream layout. No external dependencies or multimedia streaming libraries are required. By default, Daily live streaming outputs video at 1920x1080, 30 fps encoded as H.264 at 5 Mbps. The currently set maximum is 3840x2160 (4K UHD), but please reach out if you have other requirements. Daily live streaming outputs audio encoded as AAC at 96 Kbps. Contact us if you have additional needs. All live streams must occur over an SFU network connection. There are two parts to using Daily live streaming: setting up prerequisite accounts and values, and using those values in an application to create a Daily live stream.

Prerequisites

  1. Pay-as-you-go Daily account — add a credit card in the dashboard.
  2. A Daily room — create via the dashboard or REST API.
  3. An owner or streaming admin meeting token — only meeting owners or streaming admins can start a live stream:
curl --request POST \
     --url https://api.daily.co/v1/meeting-tokens \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"room_name": "DAILY_ROOM_NAME", "is_owner": true}}'
Or, for a streaming admin only:
curl --request POST \
     --url https://api.daily.co/v1/meeting-tokens \
     --header 'Authorization: Bearer DAILY_API_KEY' \
     --header 'Content-Type: application/json' \
     --data '{"properties": {"room_name": "DAILY_ROOM_NAME", "permissions": {"canAdmin": ["streaming"]}}}'
  1. A transcoding provider account — popular options: Amazon IVS, Mux, YouTube Live, Cloudflare Stream.
  2. An rtmpUrl — combine your transcoder’s ingest URL and stream key.

RTMP URL templates by provider

ProviderTemplate rtmpUrl
Amazon IVSrtmp(s)://DOMAIN.global-contribute.live-video.net:443/app/STREAM_KEY
Muxrtmp(s)://global-live.mux.com:443/app/STREAM_KEY
YouTube Livertmp://DOMAIN.rtmp.youtube.com/live2/STREAM_KEY
LivePeerrtmp://mdw-rtmp.livepeer.com/live/STREAM_KEY
Azurertmps://DOMAIN.channel.media.azure.net:2935/live/DOMAIN/foo (Azure doesn’t provide a stream key — use an arbitrary value like foo)
Cloudflarertmps://live.cloudflare.com:443/live/STREAM_KEY
Generic template: rtmp(s)://DOMAIN/BASE_INGEST_URL/STREAM_KEY

How to create a Daily live streaming app

1. Initialize a Daily call:
// Daily Prebuilt
call = await window.Daily.createFrame(document.getElementById('callframe'), {
  iframeStyle: { /* ... */ },
});

// Custom call object
call = await window.Daily.createCallObject();
2. Join with an owner or streaming admin token:
await call.join({ url: 'DAILY_ROOM_URL', token: 'DAILY_MEETING_TOKEN' });
3. Start the live stream:
call.startLiveStreaming({ rtmpUrl: 'RTMP_URL' });
4. Stop the live stream:
call.stopLiveStreaming();

Listening for live streaming events

call.on('live-streaming-started', (e) => console.log('live stream started', e));

Live streaming layout options

Pass layout configuration to startLiveStreaming() or updateLiveStreaming():
await call.startLiveStreaming({
  width: 1280,
  height: 720,
  layout: { preset: 'default', max_cam_streams: 5 },
});
await call.updateLiveStreaming({
  layout: { preset: 'single-participant', session_id: 'abcd123...' },
});
  • height, width — controls output resolution (set once via startLiveStreaming()).
  • backgroundColor — formatted as #rrggbb or #aarrggbb.This can only be set once via `startLiveStreaming().
  • layout: an object specifying the way participants’ videos are laid out in the stream.
    • preset: The layout preset to use. Options (see below for examples):
      • "default" — grid layout; supports max_cam_streams (default 20, max 20).
      • "single-participant" — stream only a single participant’s audio and video. The selected participant’s session ID must be specified via a session_id key.
      • "active-participant" — This layout focuses on the current speaker, and places up to 9 other cameras to the right in a single column vertical grid in the order in which they last spoke.
      • "portrait" — mobile-friendly; "vertical" (default) or "inset" variant.
        • "vertical": up to two participants are shown in a vertical layout. Participants with the is_owner flag are shown lower in the grid.
        • "inset": one participant’s video takes up the entire screen and the other is inset in a smaller rectangle. Participants’ videos are scaled and cropped to fit the entire available space. Participants with the is_owner flag are shown full screen.
      • "custom" — full custom layout via VCS, with composition_params and optional session_assets. A full list of available parameters is available in the reference docs. You can also test available options with the VCS Simulator.
Example "default" layout: Grid of nine participants on a video call Example screenshare "default" layout: A screenshare takes up the main video call screen with participant videos to the right vertically Example "single-participant" layout: One participant video screen takes up the entire video call Example "active-participant" layout: One participant video screen takes up the majority of space on a call with two others to the right in a small vertical bar Example "portrait" layout with "vertical" variant: Two participant screens on a mobile vertical video call Example "portrait" layout with "inset" variant: Two participant screens on a mobile vertical video call Example "custom" layout with a text overlay: Text overlay and dominant video layout example

Multiple live streaming instances

Daily supports multiple live streaming and recording instances per room — useful for generating independent layouts for different audiences (e.g. portrait for mobile, landscape for desktop). Pass a unique instanceId to startLiveStreaming() or startRecording() to start independent instances. Each is independently controllable via updateLiveStreaming()/updateRecording() and stopLiveStreaming()/stopRecording(), and all events include an instanceId to distinguish them. For full details, see the multi-instance guide. The number of allowed instances per room is controlled by the max_streaming_instances_per_room domain property. Contact us to configure this.