<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ant Media</title>
    <description>The latest articles on DEV Community by Ant Media (antmedia_io).</description>
    <link>https://dev.to/antmedia_io</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12353%2Fff41ebd4-99ef-4209-9229-890e22a41d37.png</url>
      <title>DEV Community: Ant Media</title>
      <link>https://dev.to/antmedia_io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/antmedia_io"/>
    <language>en</language>
    <item>
      <title>How to run MoQ in AWS for sub-second live streaming at scale</title>
      <dc:creator>Amar Thodupunoori</dc:creator>
      <pubDate>Fri, 30 Oct 2026 08:12:36 +0000</pubDate>
      <link>https://dev.to/antmedia_io/how-to-run-moq-in-aws-for-sub-second-live-streaming-at-scale-5hbl</link>
      <guid>https://dev.to/antmedia_io/how-to-run-moq-in-aws-for-sub-second-live-streaming-at-scale-5hbl</guid>
      <description>&lt;p&gt;For years you had to pick one. Real-time latency, or an audience of any size. Media over QUIC gives you both, and you can have it running on an AWS instance this afternoon — publisher, relay and player included.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MoQ exists
&lt;/h2&gt;

&lt;p&gt;Until now you picked one of two compromises. WebRTC gave you sub-second latency but no CDN — every viewer is a peer connection, and scaling means an SFU and a lot of servers. LL-HLS gave you CDN scale but four seconds or more of delay, which kills anything interactive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MoQ removes the choice&lt;/strong&gt;. It runs on QUIC, so a delayed frame does not block the ones behind it, and it uses WebTransport so it works straight from the browser with no plugin. The result is sub-second latency with a pub/sub delivery model a CDN can actually cache. Cloudflare already runs MoQ at their edge in alpha, so the CDN half is not theoretical.&lt;/p&gt;

&lt;p&gt;MoQ compared with WebRTC and LL-HLS across latency, architecture and browser support.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Dimension   MoQ WebRTC  LL-HLS
Latency Sub-second, configurable    0.2–0.5s  4+ seconds
Architecture    Pub/sub + CDN relay SFU CDN / origin
CDN cacheable   Yes No  Yes
Transport   UDP / QUIC / WebTransport   UDP / DTLS-SRTP HTTP
Browser support Chrome, Edge, Safari 26.4+  All major browsers  All major browsers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source: &lt;a href="https://antmedia.io/webrtc-vs-moq-media-over-quic-ant-media-server/" rel="noopener noreferrer"&gt;WebRTC vs MoQ — two protocols, one platform&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running it on AWS
&lt;/h2&gt;

&lt;p&gt;By the end of this you will be publishing from a browser and watching it back less than a second later. There is nothing to compile, and the server issues its own domain and certificate — you do not need to own either. Playback works in Chrome, Edge and Brave, or Safari 26.4 and above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Launch the instance&lt;/strong&gt;&lt;br&gt;
Subscribe on AWS Marketplace and launch. A c5.xlarge is plenty to start. The AMI arrives with Ant Media Server 3.0.3 already running and every port it needs already open.&lt;/p&gt;

&lt;p&gt;Launch the AMI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Add port 4443 to the security group&lt;/strong&gt;&lt;br&gt;
One rule to add, on both TCP and UDP. That is where the MoQ relay listens. Everything else the server needs is already open on the AMI.&lt;/p&gt;

&lt;p&gt;Add the UDP rule as well as TCP. With only TCP the pages load normally and the browser then silently never reaches the relay — it is the most common first-run failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Turn on SSL from the web panel&lt;/strong&gt;&lt;br&gt;
MoQ uses WebTransport, and browsers only allow that over HTTPS. You do not need to own a domain — the server will give you a free one.&lt;/p&gt;

&lt;p&gt;Open the web panel at &lt;code&gt;http://your-server-ip:5080&lt;/code&gt; — that is HTTP on port 5080, which is how the server starts before SSL exists. Go to Settings → SSL, set Type to Subdomain of antmedia.cloud and click Activate.&lt;/p&gt;

&lt;p&gt;A subdomain is allocated to you, a Let’s Encrypt certificate is issued and installed, and the server restarts itself. From then on it answers on &lt;code&gt;https://your-subdomain.antmedia.cloud:5443.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuvtj6g2mv2lpakhkqc1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuvtj6g2mv2lpakhkqc1f.png" alt="SSL" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Install the MoQ plugin&lt;/strong&gt;&lt;br&gt;
The plugin is a single release archive. You can download MoQPlugin-release.zip to your own machine and upload it, but the curl command below is easier — it pulls the file straight onto the server, so there is nothing to transfer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH&lt;/strong&gt; in as ubuntu and run these in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# fetch the plugin release onto the server&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s2"&gt;"https://drive.usercontent.google.com/download?id=1X9ymWsDjfdNdcXH2h0y2Ak2IWpmnkijk&amp;amp;export=download&amp;amp;confirm=t"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; MoQPlugin-release.zip

&lt;span class="c"&gt;# unpack it and step into the folder&lt;/span&gt;
unzip MoQPlugin-release.zip
&lt;span class="nb"&gt;cd &lt;/span&gt;MoQ-Plugin

&lt;span class="c"&gt;# make the installer executable, then run it&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x install-moq-plugin.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./install-moq-plugin.sh

&lt;span class="c"&gt;# put the browser publisher and player into your application&lt;/span&gt;
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /usr/local/antmedia/webapps/live/moq
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; moq-ams-player-build/&lt;span class="k"&gt;*&lt;/span&gt; /usr/local/antmedia/webapps/live/moq

&lt;span class="c"&gt;# restart so the server loads the plugin&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service antmedia restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Publish, and watch it back
&lt;/h2&gt;

&lt;p&gt;Two pages are now live on your server. Replace your-subdomain with the address the server allocated you in step 3 — everything after the domain stays exactly as written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 · Open the publisher&lt;/strong&gt;&lt;br&gt;
Enter a stream ID, choose Camera as the source, and hit Start Publishing.&lt;br&gt;
&lt;code&gt;https://your-subdomain.antmedia.cloud:5443/live/moq/play.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpx2m04ztty2cr6ilwtdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpx2m04ztty2cr6ilwtdo.png" alt="MOQ publisher" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Status flips to publishing, and the relay URL on port 4443 appears at the top alongside the broadcast path.&lt;/p&gt;

&lt;p&gt;2 · Open the player in a second window&lt;br&gt;
Enter the same stream ID and pick the source track. The debug panel underneath reports what you are actually getting — frame rate, buffer, stalls and glass-to-glass latency.&lt;br&gt;
&lt;code&gt;https://your-subdomain.antmedia.cloud:5443/live/moq/play.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsrmh4jhd5cejyjxvjmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcsrmh4jhd5cejyjxvjmq.png" alt="MOQ Player" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;source&lt;/code&gt; is the original quality as published. If you switch on adaptive bitrate streaming, each rendition the server produces appears here as its own MoQ track — 720p, 480p and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is running now
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Browser publishing and playback at sub-second latency&lt;/li&gt;
&lt;li&gt;An embedded moq-lite relay listening on port 4443&lt;/li&gt;
&lt;li&gt;Every adaptive rendition exposed as its own MoQ track&lt;/li&gt;
&lt;li&gt;Any moq-lite client able to publish straight to the relay&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What you can add to it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;RTMP, RTSP or SRT in the front, MoQ out the back&lt;/li&gt;
&lt;li&gt;The same stream over WebRTC, HLS and DASH simultaneously&lt;/li&gt;
&lt;li&gt;Recording, transcoding and control from the REST API&lt;/li&gt;
&lt;li&gt;Cloudflare’s MoQ edge in place of the embedded relay&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you build production on it. MoQ is still being standardised. This plugin implements moq-lite, a deployable subset that already interoperates with full moq-transport CDNs including Cloudflare’s. It is functional and actively maintained — for a serious integration, start in staging and talk to us.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why run it on AWS specifically
&lt;/h2&gt;

&lt;p&gt;MoQ is a transport. You still need somewhere to ingest, transcode and record — and something that speaks RTMP and RTSP for the sources that will never speak QUIC.&lt;/p&gt;

&lt;p&gt;Running it on an AWS instance means the MoQ relay, the media server and the rest of your pipeline sit in one place, on infrastructure you already have committed spend on, and it is licensed per instance-hour rather than per stream or per viewer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single instance, single hourly rate, no per-stream or per-viewer fees&lt;/li&gt;
&lt;li&gt;Auto-managed deployment for one server, CloudFormation for a multi-node cluster&lt;/li&gt;
&lt;li&gt;Draws down against committed AWS spend&lt;/li&gt;
&lt;li&gt;Everything stays inside your own account and VPC&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Measured on one c5.xlarge
&lt;/h2&gt;

&lt;p&gt;Ant Media Server throughput measured on a single AWS c5.xlarge instance.&lt;/p&gt;

&lt;p&gt;Workload                                   Capacity&lt;br&gt;
RTSP camera streams, video only,360p              550&lt;br&gt;
WebRTC publishers, 1080p                      35&lt;br&gt;
WebRTC viewers, 1080p                             105&lt;br&gt;
RTMP ingest, 1080p                            35&lt;br&gt;
SRT ingest, 1080p                             42&lt;/p&gt;

&lt;p&gt;Sustained at 65–75% CPU. Each figure measured on its own — publish and playback were not run concurrently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on AWS
&lt;/h2&gt;

&lt;p&gt;Launch, add one port, activate SSL, paste one command. Publisher and player included. &lt;strong&gt;Would rather not do the setup?&lt;/strong&gt; Tell us what you are building and we will deploy the first one for you, free.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/marketplace/pp/prodview-464ritgzkzod6?utm_source=antmedia&amp;amp;utm_medium=usecase&amp;amp;utm_campaign=moq_aws_footer" rel="noopener noreferrer"&gt;Start Free on AWS&lt;/a&gt;&lt;br&gt;
7-day free trial · billed per instance-hour · cancel any time&lt;/p&gt;

</description>
      <category>streaming</category>
      <category>networking</category>
      <category>aws</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Stream IP Cameras on AWS: RTSP to WebRTC in 4 Steps</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Thu, 22 Oct 2026 04:28:54 +0000</pubDate>
      <link>https://dev.to/antmedia_io/stream-ip-cameras-on-aws-rtsp-to-webrtc-in-4-steps-3921</link>
      <guid>https://dev.to/antmedia_io/stream-ip-cameras-on-aws-rtsp-to-webrtc-in-4-steps-3921</guid>
      <description>&lt;p&gt;Your cameras speak RTSP. Your browser doesn't.&lt;/p&gt;

&lt;p&gt;That is why so much camera video ends up stuck inside an NVR or a desktop client. What you need is a server in the middle that ingests the RTSP feed and hands the browser WebRTC. This guide walks through setting that up on AWS with Ant Media Server. It takes about ten minutes and ends with a camera playing in a browser tab at roughly half a second of delay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Launch the server
&lt;/h2&gt;

&lt;p&gt;Subscribe to &lt;a href="https://aws.amazon.com/marketplace/pp/prodview-464ritgzkzod6" rel="noopener noreferrer"&gt;Ant Media Server on AWS Marketplace&lt;/a&gt; and launch a &lt;code&gt;c5.xlarge&lt;/code&gt; instance. The image boots with the server already running.&lt;/p&gt;

&lt;p&gt;Two things to get right at launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the recommended security group, or open TCP &lt;code&gt;5080&lt;/code&gt; and &lt;code&gt;5443&lt;/code&gt; (panel and HTTPS) and UDP &lt;code&gt;50000-60000&lt;/code&gt; (WebRTC media).&lt;/li&gt;
&lt;li&gt;Attach an Elastic IP so the address doesn't change when the instance restarts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2: Open the panel
&lt;/h2&gt;

&lt;p&gt;Go to &lt;code&gt;http://your-server-ip:5080&lt;/code&gt; and log in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;JamesBond&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password:&lt;/strong&gt; your AWS instance ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Change the password straight away. Port 5080 is plain HTTP, so enable SSL before connecting real cameras, otherwise your login travels unencrypted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add your camera
&lt;/h2&gt;

&lt;p&gt;Open an application (&lt;code&gt;live&lt;/code&gt; exists by default), click &lt;strong&gt;New Live Stream&lt;/strong&gt;, choose &lt;strong&gt;Stream Source&lt;/strong&gt;, name it, and paste the camera's RTSP URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rtsp://{username}:{password}@{camera-ip}:554/{stream-path}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The catch: your server is in AWS and your camera is probably on a private network. A &lt;code&gt;192.168.x.x&lt;/code&gt; address is not reachable from EC2. Give the server a route to the camera by using either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a site-to-site VPN into your VPC (the cleaner option), or&lt;/li&gt;
&lt;li&gt;a port-forward on the site router that only accepts connections from the instance's Elastic IP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't expose port 554 to the whole internet.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create Stream&lt;/strong&gt;. If the URL and credentials are right, the status changes to &lt;em&gt;broadcasting&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Watch it live
&lt;/h2&gt;

&lt;p&gt;Open the stream and press play. No plugin, no download, no transcoding job to configure.&lt;/p&gt;

&lt;p&gt;It works without video transcoding because the camera's H.264 video passes straight through. If a camera is set to H.265, switch it to H.264 in the camera settings. Browser support for H.265 over WebRTC is still inconsistent, and the server would otherwise have to transcode it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WebRTC instead of HLS?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Typical latency&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HLS&lt;/td&gt;
&lt;td&gt;8–20 seconds&lt;/td&gt;
&lt;td&gt;Reviewing footage, large passive audiences&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LL-HLS&lt;/td&gt;
&lt;td&gt;3–5 seconds&lt;/td&gt;
&lt;td&gt;Near-live viewing where some buffering is fine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebRTC&lt;/td&gt;
&lt;td&gt;Under 0.5 seconds&lt;/td&gt;
&lt;td&gt;Security, access control, PTZ, anything someone acts on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three come off the same ingested stream, so you can send WebRTC to a control room and HLS to everyone's phones without touching the cameras again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Controlling PTZ cameras
&lt;/h2&gt;

&lt;p&gt;Driving a pan-tilt-zoom camera through a ten-second feed is miserable: you nudge, nothing happens, you nudge again, then both moves arrive at once and you overshoot. With WebRTC you hold the control, see the camera move, and let go where you meant to stop.&lt;/p&gt;

&lt;p&gt;For an ONVIF camera, choose &lt;strong&gt;IP Camera&lt;/strong&gt; instead of Stream Source under &lt;strong&gt;New Live Stream&lt;/strong&gt;, then enter the camera's ONVIF URL, username and password. The panel exposes PTZ controls, and the same actions are available through the REST API, so you can put pan, tilt and zoom buttons in your own app.&lt;/p&gt;

&lt;p&gt;ONVIF auto-discovery only works when the server is on the same local network as the cameras, so on AWS add cameras by URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capacity: one setting, twelve times the cameras
&lt;/h2&gt;

&lt;p&gt;Most cameras send AAC audio by default. WebRTC doesn't carry AAC, so the server has to transcode every camera's audio to Opus, and that transcode is what eats the CPU, not the video. Nobody is listening to a camera bolted to a corridor ceiling anyway.&lt;/p&gt;

&lt;p&gt;Disable audio in each camera's encoder settings and the same &lt;code&gt;c5.xlarge&lt;/code&gt; goes from &lt;strong&gt;50 streams to 600&lt;/strong&gt; at 360p, with CPU in the low sixties.&lt;/p&gt;

&lt;p&gt;On cost, the instance is $0.17/hour on demand (us-east-1) and the Ant Media Server license is $0.63/hour on top. That is about $584 a month with no per-stream or per-viewer license fee, which works out to roughly $1 per camera per month at 600 cameras. The line that does grow is AWS data transfer out, which scales with viewers rather than cameras.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The flow is: launch the instance, log in, add the RTSP source, press play. The three things that trip people up are network reachability to the camera, H.265 encoding, and camera audio left on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a condensed version. I originally published the full guide, with screenshots and the ONVIF walkthrough, on the Ant Media blog: &lt;a href="https://antmedia.io/stream-ip-cameras-aws/" rel="noopener noreferrer"&gt;Stream IP Cameras on AWS: RTSP to WebRTC in 4 Easy Steps&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webrtc</category>
      <category>streaming</category>
    </item>
    <item>
      <title>WebRTC Video Streaming: How a Live Broadcast Reaches 0.5s Latency [2026 Update]</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Fri, 16 Oct 2026 07:39:39 +0000</pubDate>
      <link>https://dev.to/antmedia_io/webrtc-video-streaming-how-a-live-broadcast-reaches-05s-latency-2026-update-2h56</link>
      <guid>https://dev.to/antmedia_io/webrtc-video-streaming-how-a-live-broadcast-reaches-05s-latency-2026-update-2h56</guid>
      <description>&lt;p&gt;&lt;strong&gt;WebRTC video streaming&lt;/strong&gt; delivers live audio and video from a publisher to an audience at &lt;strong&gt;approximately 0.5 seconds of glass-to-glass latency&lt;/strong&gt;. Virtual events, live auctions, telehealth consultations and online gaming all depend on that figure, because a delay above one second breaks the interaction the product is built around.&lt;/p&gt;

&lt;p&gt;HTTP-based protocols deliver the same stream at 8–12 seconds. WebRTC closes that gap by carrying media over RTP on UDP instead of fetching segments, and by running natively in every modern browser, so &lt;strong&gt;viewers join a stream from a URL without installing a plugin or an application&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is WebRTC?
&lt;/h2&gt;

&lt;p&gt;WebRTC (Web Real-Time Communication) is an open standard from the W3C and IETF that transmits audio, video and arbitrary data directly between browsers and devices. Every WebRTC media path carries DTLS-SRTP encryption by specification, and every modern browser ships the API without a plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foaenxryfkqcxi8jllhvk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foaenxryfkqcxi8jllhvk.png" alt="webrtc" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Peer connection setup, ICE candidate negotiation and the signaling exchange that precedes media are covered in the guide to &lt;a href="https://antmedia.io/what-is-webrtc-and-how-webrtc-works/" rel="noopener noreferrer"&gt;how WebRTC works&lt;/a&gt;. The rest of this post covers what changes when WebRTC carries a live stream to an audience rather than a call to one other participant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WebRTC Video Streaming Is Transforming Live Streaming
&lt;/h2&gt;

&lt;p&gt;WebRTC video streaming delivers a live feed in approximately 0.5 seconds, against 8–12 seconds for standard HLS and MPEG-DASH. That twenty-fold difference decides whether a viewer participates in an event or watches a recording of one that already finished.&lt;/p&gt;

&lt;p&gt;The gap comes from transport. HLS and DASH cut video into segments, publish a manifest, and require the player to buffer several segments before playback starts. WebRTC pushes RTP packets over UDP with no segment boundary and no manifest fetch, so the only accumulated delay is encode time, network transit and jitter buffer depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Advantages of WebRTC Video Streaming
&lt;/h3&gt;

&lt;p&gt;Six properties separate WebRTC from every HTTP-based delivery protocol:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sub-second latency&lt;/strong&gt; – Approximately 0.5 seconds glass-to-glass from publisher camera to viewer screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser-native playback&lt;/strong&gt; – Chrome, Safari, Firefox, Edge and Opera decode WebRTC without a plugin or an application install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive quality&lt;/strong&gt; – Bandwidth estimation and adaptive jitter buffering hold playback continuous as network conditions change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mandatory encryption&lt;/strong&gt; – DTLS-SRTP secures every media packet, and the specification permits no unencrypted transmission.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Horizontal scale&lt;/strong&gt; – An SFU with edge nodes serves an audience the publisher device cannot reach directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data channels&lt;/strong&gt; – Chat messages, bid values, scores and control commands travel alongside video on the same connection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Properties one and five interact, and that interaction defines the architecture of every production deployment: the latency figure holds only while the fan-out layer keeps up with the audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does WebRTC Live Streaming Work for a One-to-Many Broadcast?
&lt;/h2&gt;

&lt;p&gt;WebRTC live streaming moves one publisher's audio and video to a large audience through &lt;strong&gt;a media server that terminates the publisher's peer connection and fans the stream out to viewers&lt;/strong&gt;. A browser opens a peer connection to that server rather than to each viewer, which holds publisher upload bandwidth flat as the audience grows.&lt;/p&gt;

&lt;p&gt;Two workloads share the WebRTC protocol and behave differently. WebRTC conferencing connects a small group where every participant publishes and subscribes. WebRTC broadcast moves a single source to viewers who never publish back. A broadcast to 10,000 viewers cannot run peer-to-peer, because one device cannot hold 10,000 simultaneous peer connections.&lt;/p&gt;

&lt;p&gt;A production WebRTC broadcast runs through five stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capture&lt;/strong&gt; the source from a browser, a hardware encoder, or OBS Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Negotiate&lt;/strong&gt; the session over WebSocket or WHIP signaling before media moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ingest&lt;/strong&gt; the stream at the origin node, which terminates the DTLS-SRTP handshake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt; the stream to edge nodes that pull from origin and serve viewers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver&lt;/strong&gt; playback over WebRTC, LL-HLS or MoQ depending on the latency target.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stages three and four separate a live broadcast from a video call. Ant Media Server accepts non-WebRTC sources on the same origin — RTMP, SRT, RTSP, NDI and Zixi — so a WebRTC audience watches a stream that never started as WebRTC.&lt;/p&gt;

&lt;p&gt;The table below maps four audience sizes to the infrastructure each one requires.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Audience Size&lt;/th&gt;
&lt;th&gt;Topology&lt;/th&gt;
&lt;th&gt;Server Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2 participants&lt;/td&gt;
&lt;td&gt;Peer-to-peer with STUN&lt;/td&gt;
&lt;td&gt;Signaling and STUN only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3–4 participants&lt;/td&gt;
&lt;td&gt;Mesh&lt;/td&gt;
&lt;td&gt;Signaling and STUN only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5–100 participants&lt;/td&gt;
&lt;td&gt;SFU&lt;/td&gt;
&lt;td&gt;Single media server node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-to-many broadcast&lt;/td&gt;
&lt;td&gt;SFU plus edge cluster&lt;/td&gt;
&lt;td&gt;Origin node plus edge nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The jump from row three to row four is the decisive one. A single node serves up to 200 concurrent viewers at 360p on 4 CPU cores, and capacity past that figure comes from adding edge nodes rather than adding cores to one machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Latency Does WebRTC Video Streaming Actually Deliver?
&lt;/h2&gt;

&lt;p&gt;WebRTC video streaming delivers &lt;strong&gt;approximately 0.5 seconds of glass-to-glass latency&lt;/strong&gt; between a publisher's camera and a viewer's screen. That figure covers capture, encode, ICE-negotiated UDP transport, server-side forwarding, jitter buffering and decode.&lt;/p&gt;

&lt;p&gt;Delivery protocol sets the latency the audience experiences, and ingest protocol barely moves it. The table below compares the three delivery tiers Ant Media Server produces from a single ingest.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Delivery Protocol&lt;/th&gt;
&lt;th&gt;End-to-End Latency&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebRTC&lt;/td&gt;
&lt;td&gt;~0.5 seconds&lt;/td&gt;
&lt;td&gt;Auctions, betting, conversation, remote control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LL-HLS and LL-DASH (CMAF)&lt;/td&gt;
&lt;td&gt;3–5 seconds&lt;/td&gt;
&lt;td&gt;Large audiences needing near-real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLS&lt;/td&gt;
&lt;td&gt;8–10 seconds&lt;/td&gt;
&lt;td&gt;Maximum device reach, one-way viewing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap between row one and row three is roughly twenty-fold, which is why delivery choice outranks ingest choice in almost every architecture decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Pushes WebRTC Latency Above 0.5 Seconds?
&lt;/h3&gt;

&lt;p&gt;Four conditions raise measured latency above the 0.5-second figure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TURN relay&lt;/strong&gt; replaces the direct media path when symmetric NAT blocks it, adding the round trip to the relay server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-side transcoding&lt;/strong&gt; decodes and re-encodes the stream to produce adaptive bitrate renditions, which costs frames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geographic distance&lt;/strong&gt; between publisher, origin node and viewer adds propagation delay no protocol removes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edition mismatch&lt;/strong&gt; caps playback: Ant Media Server Community Edition ingests WebRTC but plays back over HLS at 8–12 seconds, while Enterprise Edition plays WebRTC back at 0.5 seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fourth condition catches the most projects. A team benchmarks a free WebRTC server, measures eight seconds, and concludes WebRTC is slow — when the protocol was never in the playback path.&lt;/p&gt;

&lt;p&gt;Published figures describe a reference network. The only latency number that reflects a specific deployment comes from measuring publish-to-play delay on that deployment's own network path.&lt;/p&gt;

&lt;h2&gt;
  
  
  RTMP to WebRTC Migration: Why It's Essential
&lt;/h2&gt;

&lt;p&gt;RTMP survives as an ingest protocol and has no role in delivery. Adobe ended Flash Player support in 2020, and iOS, Android and every modern browser reject &lt;a href="https://antmedia.io/what-is-rtmp-server-how-to-set-up-a-free-rtmp-server/" rel="noopener noreferrer"&gt;RTMP&lt;/a&gt; for playback, which leaves it as an encoder-to-server contribution path carrying roughly 5 seconds of latency.&lt;/p&gt;

&lt;p&gt;Migration therefore splits into two separate decisions. Replacing RTMP delivery with WebRTC removes 4.5 seconds from the viewer path. Replacing RTMP ingest with WHIP removes the remaining hop, and the full latency comparison across eight protocols sits in the guide to &lt;a href="https://antmedia.io/streaming-protocols/" rel="noopener noreferrer"&gt;streaming protocol latency&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Projects that keep an RTMP encoder fleet convert server-side instead, publishing RTMP to the origin and delivering WebRTC to viewers. The distinction between the two delivery models is covered in &lt;a href="https://antmedia.io/real-time-streaming-vs-live-streaming/" rel="noopener noreferrer"&gt;real-time streaming vs live streaming&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Software Publishes a WebRTC Video Stream?
&lt;/h2&gt;

&lt;p&gt;Four client types publish a WebRTC video stream: &lt;strong&gt;a browser using getUserMedia, OBS Studio over WHIP, FFmpeg through its WHIP muxer, and a native SDK on iOS, Android, Flutter, React Native or Unity&lt;/strong&gt;. Each terminates against the same server ingest endpoint.&lt;/p&gt;

&lt;p&gt;Hardware encoders are the exception. Most broadcast encoders and streaming cameras carry no native WebRTC support, so those workflows publish over SRT or RTMP and let the server convert to WebRTC for delivery.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Publishing Client&lt;/th&gt;
&lt;th&gt;Signaling&lt;/th&gt;
&lt;th&gt;Install Required&lt;/th&gt;
&lt;th&gt;Typical Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser (getUserMedia)&lt;/td&gt;
&lt;td&gt;WebSocket or WHIP&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Webcam broadcast, guest contribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OBS Studio 30+&lt;/td&gt;
&lt;td&gt;WHIP&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Produced multi-source broadcast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FFmpeg (WHIP muxer)&lt;/td&gt;
&lt;td&gt;WHIP&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Automated and headless pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile and Unity SDKs&lt;/td&gt;
&lt;td&gt;WebSocket&lt;/td&gt;
&lt;td&gt;App build&lt;/td&gt;
&lt;td&gt;In-app publishing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware encoder&lt;/td&gt;
&lt;td&gt;SRT or RTMP, converted server-side&lt;/td&gt;
&lt;td&gt;Device&lt;/td&gt;
&lt;td&gt;Broadcast contribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Row two changed the field. WHIP became an IETF standard as RFC 9725 in March 2025, and OBS Studio added native WHIP output in version 30.0, which removed the RTMP hop and its 5-second penalty from the ingest path.&lt;/p&gt;

&lt;p&gt;Ant Media Server has accepted WHIP ingest since version 2.10.0, tested against OBS Studio and the Eyevinn WHIP client, on an endpoint of the form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-domain:5443/{application}/whip/{streamId}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selecting the server behind that endpoint is a separate decision, and the guide to &lt;a href="https://antmedia.io/webrtc-servers/" rel="noopener noreferrer"&gt;WebRTC server types&lt;/a&gt; compares eight production servers on license, ingest support and built-in HTTP delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does a WebRTC Video Stream Fail to Connect or Play?
&lt;/h2&gt;

&lt;p&gt;A WebRTC video stream fails for &lt;strong&gt;four reasons: blocked media permissions, failed NAT traversal, a codec the receiving browser cannot decode, or insufficient upload bandwidth&lt;/strong&gt;. Each produces a distinct symptom, which makes diagnosis fast once the symptom is matched to its cause.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Camera or microphone never activates&lt;/td&gt;
&lt;td&gt;A &lt;code&gt;Permissions-Policy&lt;/code&gt; response header sets &lt;code&gt;camera=()&lt;/code&gt; or &lt;code&gt;microphone=()&lt;/code&gt;, which blocks getUserMedia before the browser prompts&lt;/td&gt;
&lt;td&gt;Allow the origin in the header, or drop the directive on pages that publish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screen share button does nothing&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;display-capture&lt;/code&gt; directive is unset or restricted, and an iframe needs it delegated explicitly&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;display-capture=(self)&lt;/code&gt; and set &lt;code&gt;allow="display-capture"&lt;/code&gt; on the iframe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection negotiates then drops to nothing&lt;/td&gt;
&lt;td&gt;Symmetric NAT or a corporate firewall blocks the direct path, and no TURN server relays the media&lt;/td&gt;
&lt;td&gt;Deploy a TURN server and supply its credentials in the ICE configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio plays, video stays black&lt;/td&gt;
&lt;td&gt;The publisher encoded a codec the receiving browser lacks — H.265 sits outside standard browser WebRTC&lt;/td&gt;
&lt;td&gt;Publish H.264 or VP8, or transcode server-side&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Row three accounts for the majority of production incidents, because it passes every test on an office network and fails on the first corporate viewer. Deployments serving enterprise audiences configure TURN before launch rather than after the first support ticket.&lt;/p&gt;

&lt;p&gt;Setting &lt;code&gt;iceTransportPolicy: "relay"&lt;/code&gt; in the peer connection configuration forces every candidate through TURN, which confirms whether a relay path works before anything else gets diagnosed. Configuration for restrictive network paths is covered in the guide to &lt;a href="https://antmedia.io/publish-and-play-streams-behind-nat/" rel="noopener noreferrer"&gt;NAT traversal setup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Reproducing symmetric NAT behaviour, adaptive jitter buffering under packet loss and TURN relay fallback demands a running origin node rather than a local test page, because a browser-to-browser loopback never exercises the server-side ICE candidate selection path where these failures occur. A &lt;a href="https://antmedia.io/self-hosted-free-trial/" rel="noopener noreferrer"&gt;14-day trial licence&lt;/a&gt; runs the Enterprise build with WebRTC playback, WHIP ingest and clustering enabled, places no cap on broadcasters or viewers, and requires no credit card — enough to measure glass-to-glass latency and TURN relay success rate on the same network the production audience uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebRTC Video Streaming with Ant Media Server
&lt;/h2&gt;

&lt;p&gt;Ant Media Server ingests WebRTC, WHIP, RTMP, SRT, RTSP, NDI and Zixi on a single origin, then delivers the same stream over WebRTC, &lt;a href="https://antmedia.io/what-is-hls-streaming/" rel="noopener noreferrer"&gt;HLS streaming&lt;/a&gt;, LL-HLS, LL-DASH, &lt;a href="https://antmedia.io/cmaf-streaming/" rel="noopener noreferrer"&gt;CMAF streaming&lt;/a&gt; and MoQ. One ingest feeds every delivery tier without a second encoding pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Choose Ant Media for WebRTC?
&lt;/h3&gt;

&lt;p&gt;Five capabilities decide the fit for a WebRTC broadcast workload:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;0.5-second playback&lt;/strong&gt; – Enterprise Edition delivers WebRTC glass-to-glass at approximately 0.5 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Origin-edge clustering&lt;/strong&gt; – Virtual machines, Docker containers and Kubernetes carry the same cluster, and the cluster license adds no premium over the standard Enterprise license.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-protocol delivery&lt;/strong&gt; – WebRTC, LL-HLS, LL-DASH, CMAF and MoQ from one ingest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source Community Edition&lt;/strong&gt; – Apache-licensed builds cover WebRTC ingest with HLS playback at 8–12 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment breadth&lt;/strong&gt; – AWS, Google Cloud, Microsoft Azure, DigitalOcean, Oracle Cloud, on-premises hardware and offline environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capability two carries the most weight for a live broadcast, because publisher-side bandwidth stays flat while edge nodes absorb the audience. Node counts, load balancer placement and auto-scaling triggers are covered in the guide to &lt;a href="https://antmedia.io/webrtc-scalability/" rel="noopener noreferrer"&gt;WebRTC clustering architecture&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What makes WebRTC different from other streaming protocols?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WebRTC carries media over RTP on UDP and delivers approximately 0.5 seconds of glass-to-glass latency. HLS and MPEG-DASH fetch HTTP segments and deliver the same stream at 8–12 seconds. That twenty-fold gap is why auctions, betting, telehealth and remote control run on WebRTC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WebRTC require plugins or special software?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. WebRTC runs natively in Chrome, Safari, Firefox, Edge and Opera, so a viewer joins a stream from a URL. Publishing a produced multi-source layout uses OBS Studio 30 or later over WHIP, and headless pipelines use FFmpeg.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can WebRTC handle large-scale live streaming events?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. A media server terminates the publisher's peer connection and fans the stream out through edge nodes, which holds publisher upload bandwidth flat regardless of audience size. A 4-core node serves up to 200 concurrent viewers at 360p, and capacity beyond that comes from adding edge nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What software do I need to publish a WebRTC video stream?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A browser, OBS Studio 30 or later, FFmpeg, or a native mobile SDK publishes WebRTC directly. OBS and FFmpeg use WHIP, the IETF ingest standard published as RFC 9725 in March 2025. Hardware encoders publish over SRT or RTMP, and the server converts to WebRTC for delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my WebRTC stream slower than 500 milliseconds?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TURN relay, server-side transcoding, geographic distance and edition mismatch each add delay. Edition mismatch is the most common cause: Community Edition ingests WebRTC but plays back over HLS at 8–12 seconds, so the measurement never tested WebRTC playback at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does WebRTC video streaming work behind a corporate firewall?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, with a TURN server configured. Symmetric NAT and strict firewall rules block the direct media path, and TURN relays the session instead. Deployments without TURN negotiate a connection that then carries no media, which is the most frequent production failure on enterprise networks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are WebRTC Data Channels used for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data channels carry non-media payloads on the same peer connection as video: chat messages, bid values, gaming inputs, scores and control commands. The channel inherits the connection's DTLS encryption and its sub-second timing, which keeps interaction synchronised with the picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why migrate from RTMP to WebRTC?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;RTMP delivers at roughly 5 seconds and no modern browser plays it back. WebRTC delivers at approximately 0.5 seconds with DTLS-SRTP encryption mandatory and native browser playback. RTMP retains one role in 2026: encoder-to-server ingest, which WHIP now replaces on WebRTC-native pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;WebRTC video streaming delivers approximately 0.5 seconds glass-to-glass, roughly twenty times faster than standard HLS at 8–12 seconds. Reaching that figure for a one-to-many broadcast takes a media server, an origin node and an edge cluster, because a publisher device cannot open a peer connection to every viewer.&lt;/p&gt;

&lt;p&gt;Ant Media Server ingests WebRTC, WHIP, RTMP, SRT, RTSP, NDI and Zixi on one origin, then delivers WebRTC at 0.5 seconds, LL-HLS and LL-DASH at 3–5 seconds, and HLS at 8–10 seconds from the same stream. Teams weighing real-time delivery against &lt;a href="https://antmedia.io/low-latency-hls-or-ll-hls/" rel="noopener noreferrer"&gt;Low-Latency HLS&lt;/a&gt; run both outputs from a single ingest and compare them side by side.&lt;/p&gt;

&lt;p&gt;Measuring adaptive jitter buffering under packet loss, TURN relay fallback behind symmetric NAT and edge node fan-out at audience scale requires a running origin rather than a published benchmark, because glass-to-glass latency depends on the network path between publisher, origin and viewer. A &lt;a href="https://antmedia.io/self-hosted-free-trial/" rel="noopener noreferrer"&gt;sub-second playback trial&lt;/a&gt; runs for 14 days on the Enterprise build with WebRTC playback, WHIP ingest, adaptive bitrate transcoding and clustering enabled, places no cap on broadcasters or viewers, and requires no credit card.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://antmedia.io/webrtc-video-streaming/" rel="noopener noreferrer"&gt;Ant Media blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webrtc</category>
      <category>streaming</category>
      <category>webdev</category>
      <category>livestreaming</category>
    </item>
    <item>
      <title>WebRTC Servers Explained: Signaling, TURN, SFUs and How to Set One Up</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Tue, 13 Oct 2026 18:44:41 +0000</pubDate>
      <link>https://dev.to/antmedia_io/webrtc-servers-explained-signaling-turn-sfus-and-how-to-set-one-up-19ja</link>
      <guid>https://dev.to/antmedia_io/webrtc-servers-explained-signaling-turn-sfus-and-how-to-set-one-up-19ja</guid>
      <description>&lt;p&gt;&lt;a href="https://antmedia.io/what-is-webrtc-and-how-webrtc-works/" rel="noopener noreferrer"&gt;WebRTC&lt;/a&gt; is peer-to-peer by design, which leads many developers to assume they don't need any server infrastructure. That works for a simple call between two browsers. It breaks down once you deal with restrictive networks, group calls, or broadcasting to an audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a WebRTC server does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wfpq29g0fkj5awcdnub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3wfpq29g0fkj5awcdnub.png" alt="WebRTC-AMS" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"WebRTC server" really covers four separate jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://antmedia.io/webrtc-signaling-servers-everything-you-need-to-know/" rel="noopener noreferrer"&gt;Signaling&lt;/a&gt;:&lt;/strong&gt; exchanging SDP offers, answers and ICE candidates so endpoints can agree on codecs, addresses and keys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAT traversal:&lt;/strong&gt; STUN reports a device's public address; &lt;a href="https://docs.antmedia.io/guides/advanced-usage/turn-instalation/coturn-quick-installation/" rel="noopener noreferrer"&gt;TURN&lt;/a&gt; relays media when a direct path fails, for example behind symmetric NAT or strict corporate firewalls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Media routing:&lt;/strong&gt; forwarding or mixing streams once there are more than two participants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fan-out:&lt;/strong&gt; serving one publisher's stream to an audience the publisher can't connect to directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A two-person call needs the first two. A broadcast to 10,000 viewers needs all four.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do you need one?
&lt;/h2&gt;

&lt;p&gt;Every WebRTC session needs signaling and STUN, even a two-person call. What else you need depends on the use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 participants:&lt;/strong&gt; signaling + STUN, plus TURN for sessions that fail direct connectivity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3–4 participants:&lt;/strong&gt; same stack, and a mesh topology still holds up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5+ participants:&lt;/strong&gt; add an SFU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-to-many broadcast:&lt;/strong&gt; add an SFU and edge nodes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mesh, MCU or SFU
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mesh:&lt;/strong&gt; every participant connects to every other. It works up to roughly four users and needs no media server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCU:&lt;/strong&gt; the server decodes and mixes all streams into one composite. Client bandwidth stays flat, but server CPU cost is high.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SFU:&lt;/strong&gt; the server forwards streams without re-encoding. It scales past 100 participants at moderate server cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://antmedia.io/webrtc-network-topology/" rel="noopener noreferrer"&gt;network topology guide&lt;/a&gt; covers the bandwidth maths in more depth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ingest: getting a stream to the server
&lt;/h2&gt;

&lt;p&gt;A publisher can be a browser (&lt;code&gt;getUserMedia&lt;/code&gt;), a hardware encoder, or &lt;a href="https://antmedia.io/how-to-use-obs-with-ant-media-server/" rel="noopener noreferrer"&gt;OBS Studio&lt;/a&gt;. &lt;a href="https://antmedia.io/ant-media-server-whip-support/" rel="noopener noreferrer"&gt;WHIP&lt;/a&gt; standardises WebRTC ingest into a single HTTP POST carrying the SDP offer, instead of custom signaling. The endpoint shape looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-domain:5443/{application}/whip/{streamId}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some servers also accept non-WebRTC sources such as &lt;a href="https://antmedia.io/srt-streaming-the-secure-reliable-transport-protocol/" rel="noopener noreferrer"&gt;SRT&lt;/a&gt;, RTSP and NDI. That lets a WebRTC audience watch a stream that never started as WebRTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Delivery latency matters more than ingest
&lt;/h2&gt;

&lt;p&gt;Once a stream is on the server, the delivery protocol sets what viewers experience:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Typical latency&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;WebRTC&lt;/td&gt;
&lt;td&gt;~0.5 s&lt;/td&gt;
&lt;td&gt;Auctions, betting, conversation, remote control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LL-HLS / LL-DASH&lt;/td&gt;
&lt;td&gt;3–5 s&lt;/td&gt;
&lt;td&gt;Large audiences needing near-real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HLS&lt;/td&gt;
&lt;td&gt;8–10 s&lt;/td&gt;
&lt;td&gt;Maximum device reach, one-way viewing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's roughly a twenty-fold gap between the first and last rows. For many products it's the main architectural decision. For more on bridging real-time ingest to HTTP delivery, see &lt;a href="https://antmedia.io/webrtc-to-hls-dash/" rel="noopener noreferrer"&gt;WebRTC to HLS and DASH&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing eight open-source servers
&lt;/h2&gt;

&lt;p&gt;Eight projects cover most self-hosted deployments. Each optimises for a different goal:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ant Media Server&lt;/td&gt;
&lt;td&gt;Apache-2.0 (CE) / commercial (EE)&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Broadcast and conferencing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveKit&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Conferencing and AI agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mediasoup&lt;/td&gt;
&lt;td&gt;ISC&lt;/td&gt;
&lt;td&gt;C++ / Node.js API&lt;/td&gt;
&lt;td&gt;SFU library with fine &lt;a href="https://antmedia.io/what-is-simulcasting/" rel="noopener noreferrer"&gt;simulcast&lt;/a&gt; control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Janus&lt;/td&gt;
&lt;td&gt;GPLv3&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;SIP/PBX bridging, modular gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jitsi Videobridge&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;Kotlin / Java&lt;/td&gt;
&lt;td&gt;Ready-made conferencing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pion&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Building your own SFU from a library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MediaMTX&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Protocol relay (WebRTC, RTMP, SRT, RTSP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kurento&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Media processing pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things narrow the shortlist quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. HTTP delivery.&lt;/strong&gt; Five of the eight include no built-in HLS/DASH output. If you need real-time and large-audience playback together, you'll end up running a second system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Licensing.&lt;/strong&gt; Apache-2.0, MIT and ISC all allow closed-source products. GPLv3 (Janus) requires derivative works to carry the same license unless you buy a commercial one. Check this before the media layer is embedded in a shipped product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosted vs managed API
&lt;/h2&gt;

&lt;p&gt;The main trade-offs are cost shape and control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted:&lt;/strong&gt; flat cost as usage grows, and media stays inside your own infrastructure. That matters for regulated areas like telehealth or finance. You take on patching, scaling and monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed API:&lt;/strong&gt; no infrastructure to run, but fees scale with usage, and media passes through the vendor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hardware sizing
&lt;/h2&gt;

&lt;p&gt;Capacity scales close to linearly with cores. Ant Media's published benchmark at 360p:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CPU cores&lt;/th&gt;
&lt;th&gt;Broadcasts&lt;/th&gt;
&lt;th&gt;Viewers&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Up to 50&lt;/td&gt;
&lt;td&gt;Up to 200&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Up to 100&lt;/td&gt;
&lt;td&gt;Up to 400&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Up to 200&lt;/td&gt;
&lt;td&gt;Up to 800&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;Up to 400&lt;/td&gt;
&lt;td&gt;Up to 2,000&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Past that, you scale by adding clustered nodes rather than cores. See the docs on &lt;a href="https://docs.antmedia.io/category/clustering-and-scaling/" rel="noopener noreferrer"&gt;clustering and scaling&lt;/a&gt; and &lt;a href="https://antmedia.io/scale-ant-media-server-with-kubernetes/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security basics
&lt;/h2&gt;

&lt;p&gt;WebRTC encrypts media with DTLS-SRTP by default. For production, add HTTPS/WSS on the signaling channel, token-based publish and play authorisation (for example &lt;a href="https://antmedia.io/how-to-secure-stream-with-jwt-stream-security-filter/" rel="noopener noreferrer"&gt;JWT stream tokens&lt;/a&gt;), and firewall rules that limit the media port range. See also the notes on &lt;a href="https://antmedia.io/webrtc-security/" rel="noopener noreferrer"&gt;WebRTC security&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up a first stream
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Provision a Linux host&lt;/strong&gt; with 4 vCPUs, 8 GB RAM and SSD storage. Open port 5443 plus the UDP range used for media.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install the server.&lt;/strong&gt; The Community Edition builds are on &lt;a href="https://github.com/ant-media/Ant-Media-Server/releases/" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. It ingests WebRTC but plays back over HLS at 8–12 s. WHIP, clustering and sub-second WebRTC playback are Enterprise features in Ant Media Server's case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish a test stream&lt;/strong&gt;, open the player on a second device and measure the delay. That's the only latency number that reflects your own network.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full setup details are in the &lt;a href="https://docs.antmedia.io/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, and questions go to the &lt;a href="https://github.com/orgs/ant-media/discussions" rel="noopener noreferrer"&gt;developer community&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Choose the server whose default architecture matches your workload. Adding broadcast behaviour to a conferencing-focused SFU later usually costs more engineering time than picking the right tool early.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://antmedia.io/webrtc-servers/" rel="noopener noreferrer"&gt;antmedia.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webrtc</category>
      <category>streaming</category>
      <category>networking</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Flutter Video Conference App for iOS, Android, Web and Desktop.</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Thu, 08 Oct 2026 06:43:24 +0000</pubDate>
      <link>https://dev.to/antmedia_io/flutter-video-conference-app-for-ios-android-web-and-desktop-563m</link>
      <guid>https://dev.to/antmedia_io/flutter-video-conference-app-for-ios-android-web-and-desktop-563m</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://antmedia.io/flutter-video-conference-app-for-ios-android-web-and-desktop/" rel="noopener noreferrer"&gt;Ant Media blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By the end of this guide you'll have a &lt;strong&gt;working Flutter video conference app&lt;/strong&gt; running on your iPhone, with people joining the same call from their browsers. Because it's built with Flutter, the same code also runs on Android, the web, Windows, macOS and Linux, and the sample project and the Ant Media Flutter SDK give you everything you need to shape the app to your own product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Flutter for a Video Conference App?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flutter lets you write the video conference app once and run it almost everywhere.&lt;/strong&gt; One Dart codebase builds native apps for iOS and Android, a web app, and desktop apps for Windows, macOS and Linux. The Ant Media Flutter SDK handles the WebRTC connection to Ant Media Server on top of that, so the call screen you set up in this guide is the same one your Android, web and desktop users get, with around 0.5 seconds of latency.&lt;/p&gt;

&lt;p&gt;This guide uses an iPhone because iOS has the most setup steps: code signing, Developer Mode and device trust. Once the app runs there, running it on an Android phone is a single &lt;code&gt;flutter run&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Do You Need Before You Start?
&lt;/h2&gt;

&lt;p&gt;You need four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A Mac&lt;/strong&gt; with the latest Xcode and the &lt;a href="https://docs.flutter.dev/get-started/install/macos" rel="noopener noreferrer"&gt;Flutter SDK&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An iPhone&lt;/strong&gt; and a USB cable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Apple ID&lt;/strong&gt;: a free account is enough&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A running Ant Media Server Enterprise Edition.&lt;/strong&gt; Conferencing is an Enterprise Edition feature; with Community Edition, the Flutter SDK supports WebRTC publishing only. If you don't have a server yet, pick one of these:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;14-day free trial (self-hosted):&lt;/strong&gt; fill in the &lt;a href="https://antmedia.io/self-hosted-free-trial/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=flutter-conference" rel="noopener noreferrer"&gt;trial request form&lt;/a&gt;, get the license key by email, then follow the &lt;a href="https://docs.antmedia.io/category/installation/" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;. No credit card required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Buy a license:&lt;/strong&gt; monthly or annual subscription, or a one-time perpetual license. See &lt;a href="https://antmedia.io/pricing/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=flutter-conference" rel="noopener noreferrer"&gt;Ant Media Server pricing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Throughout this guide, &lt;code&gt;AMS_HOST&lt;/code&gt; is the server address: an IP address (for example &lt;code&gt;192.168.1.20&lt;/code&gt;) or a domain name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Confirm the iPhone Reaches Ant Media Server
&lt;/h2&gt;

&lt;p&gt;Open Safari on the iPhone and load the Ant Media Server web panel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://AMS_HOST:5080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result: the Ant Media Server page loads in Safari.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every later step depends on this connection, so fix it first when the page does not load. When Ant Media Server runs on the Mac, use the Mac's IP address, never &lt;code&gt;localhost&lt;/code&gt;. The command &lt;code&gt;ipconfig getifaddr en0&lt;/code&gt; prints the Mac's IP address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Clone the Flutter SampleProject
&lt;/h2&gt;

&lt;p&gt;Clone the Ant Media Flutter SDK repository and install the SampleProject dependencies. SampleProject bundles all 5 modes (Publish, Play, Peer to Peer, Conference and Data Channel) in one app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ant-media/WebRTC-Flutter-SDK.git
&lt;span class="nb"&gt;cd &lt;/span&gt;WebRTC-Flutter-SDK/example/SampleProject
flutter pub get
&lt;span class="nb"&gt;cd &lt;/span&gt;ios &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pod &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result: the terminal prints &lt;code&gt;Pod installation complete!&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Sign the App in Xcode
&lt;/h2&gt;

&lt;p&gt;iOS installs only apps signed with an Apple ID. Open the Xcode workspace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;open ios/Runner.xcworkspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Xcode, complete these 5 actions in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the blue &lt;strong&gt;Runner&lt;/strong&gt; icon in the left sidebar.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Runner&lt;/strong&gt; under &lt;strong&gt;TARGETS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Signing &amp;amp; Capabilities&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Tick &lt;strong&gt;Automatically manage signing&lt;/strong&gt; and choose your Apple ID under &lt;strong&gt;Team&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Change &lt;strong&gt;Bundle Identifier&lt;/strong&gt; to a unique value, such as &lt;code&gt;com.yourname.conferencedemo&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result: the Signing section shows no red errors.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Enable Developer Mode on the iPhone
&lt;/h2&gt;

&lt;p&gt;Developer Mode lets Xcode and Flutter install debug builds on the iPhone. Complete these 3 actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect the iPhone to the Mac and tap &lt;strong&gt;Trust&lt;/strong&gt; on the phone.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Settings → Privacy &amp;amp; Security → Developer Mode&lt;/strong&gt; on the iPhone, turn Developer Mode on and restart. The option appears only after the phone has connected to Xcode.&lt;/li&gt;
&lt;li&gt;Run the device list command on the Mac:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter devices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result: the iPhone appears in the device list.&lt;/strong&gt; Copy the iPhone's device ID for Step 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Run the App on the iPhone
&lt;/h2&gt;

&lt;p&gt;Build and launch the SampleProject on the iPhone with the copied device ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter run &lt;span class="nt"&gt;-d&lt;/span&gt; YOUR_DEVICE_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;iOS blocks the first launch as an untrusted developer. Open &lt;strong&gt;Settings → General → VPN &amp;amp; Device Management&lt;/strong&gt; on the iPhone, trust your Apple ID, and run the command again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the app lists 5 modes: Play, Publish, Peer to Peer, Conference and Data Channel.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Connect the App to the WebSocket URL
&lt;/h2&gt;

&lt;p&gt;Tap the &lt;strong&gt;settings icon&lt;/strong&gt; (top right) and enter the WebSocket URL of the &lt;code&gt;WebRTCAppEE&lt;/code&gt; application, the default Enterprise Edition application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ws://AMS_HOST:5080/WebRTCAppEE/websocket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servers with SSL on a domain use &lt;code&gt;wss://AMS_HOST:5443/WebRTCAppEE/websocket&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F150e7m4a8fsr0eg3cukx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F150e7m4a8fsr0eg3cukx.webp" alt="Flutter video conference app server settings screen on iPhone with the Ant Media Server WebSocket URL entered" width="600" height="1301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the server indicator turns green.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Join the Conference Room from the iPhone
&lt;/h2&gt;

&lt;p&gt;Join room &lt;code&gt;demo&lt;/code&gt; from the iPhone with these 4 actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tap &lt;strong&gt;Conference&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter a &lt;strong&gt;Stream ID&lt;/strong&gt;, for example &lt;code&gt;iphone&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Enter the &lt;strong&gt;Room ID&lt;/strong&gt; &lt;code&gt;demo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Connect&lt;/strong&gt;, then allow camera, microphone and local network access.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6gfw3ak8hm0pytc7caa.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe6gfw3ak8hm0pytc7caa.webp" alt="Flutter conference screen on iPhone with Stream ID iphone and Room ID demo entered before connecting to Ant Media Server" width="600" height="1301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the iPhone camera appears in the first tile.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Add 3 Browser Participants
&lt;/h2&gt;

&lt;p&gt;Open the multitrack conference sample page in &lt;strong&gt;three browser tabs&lt;/strong&gt; to add three more people to room &lt;code&gt;demo&lt;/code&gt;. Browsers allow camera access over &lt;code&gt;http://&lt;/code&gt; only on &lt;code&gt;localhost&lt;/code&gt;, so choose the URL that matches the server setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A — browser on the machine running Ant Media Server:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5080/WebRTCAppEE/multitrack-conference.html?roomId=demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B — any computer, server with SSL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://AMS_HOST:5443/WebRTCAppEE/multitrack-conference.html?roomId=demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option C — any computer, server without SSL (development only):&lt;/strong&gt; add &lt;code&gt;http://AMS_HOST:5080&lt;/code&gt; to &lt;code&gt;chrome://flags/#unsafely-treat-insecure-origin-as-secure&lt;/code&gt; in Chrome, relaunch Chrome, then open &lt;code&gt;http://AMS_HOST:5080/WebRTCAppEE/multitrack-conference.html?roomId=demo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Join Room&lt;/strong&gt; in each tab and allow the camera.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the iPhone shows the three browser participants alongside its own camera.&lt;/strong&gt; Open more tabs, or join from other devices with the same Room ID, to add more people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbz386stgln4jajry3jzp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbz386stgln4jajry3jzp.webp" alt="Multi-party Flutter WebRTC video conference on iPhone with three browser participants in Ant Media Server room demo" width="600" height="1301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Test Controls and Adaptive Bitrate
&lt;/h2&gt;

&lt;p&gt;Test the 2 conference features on the iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camera and microphone:&lt;/strong&gt; tap the buttons at the bottom of the screen. Each button turns red while its device is off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive bitrate:&lt;/strong&gt; each tile shows that participant's resolution and bitrate. Open &lt;strong&gt;Settings → Developer → Network Link Conditioner&lt;/strong&gt; on the iPhone, choose the &lt;strong&gt;3G&lt;/strong&gt; profile and turn it on. The resolution and bitrate values drop, then recover when Network Link Conditioner is off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Do You Fix the 8 Common Setup Errors?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Each of the 8 setup errors below has a single fix&lt;/strong&gt;, covering server reachability, room mismatches, permissions, code signing, stream IDs and CocoaPods.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The app never connects&lt;/td&gt;
&lt;td&gt;Repeat Step 1. On a physical iPhone, &lt;code&gt;localhost&lt;/code&gt; refers to the phone itself; use the server's IP address or domain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser participants do not appear on the iPhone&lt;/td&gt;
&lt;td&gt;Use the same application (&lt;code&gt;WebRTCAppEE&lt;/code&gt;) and the same room on every device. Open &lt;code&gt;multitrack-conference.html&lt;/code&gt;, not &lt;code&gt;conference.html&lt;/code&gt;, because the Flutter SDK joins &lt;a href="https://antmedia.io/reveal-the-secrets-of-3-types-of-video-conference-solutions/" rel="noopener noreferrer"&gt;track-based SFU conferences&lt;/a&gt; and the browser page has to match that room type.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser tabs cannot access the camera&lt;/td&gt;
&lt;td&gt;The page is loaded over &lt;code&gt;http://&lt;/code&gt; from a host other than &lt;code&gt;localhost&lt;/code&gt;. Install an SSL certificate and use port 5443; the guide to &lt;a href="https://antmedia.io/enable-ssl-on-ant-media-server/" rel="noopener noreferrer"&gt;enabling SSL certificates&lt;/a&gt; covers the domain setup. Option C in Step 8 covers development-only testing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app cannot reach a server on the local network&lt;/td&gt;
&lt;td&gt;The local network permission was denied. Enable the app under &lt;strong&gt;Settings → Privacy &amp;amp; Security → Local Network&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xcode: "cannot be registered to your development team"&lt;/td&gt;
&lt;td&gt;The bundle identifier is taken. Change the bundle identifier to a unique value (Step 3).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"This app can only be launched from Flutter tooling"&lt;/td&gt;
&lt;td&gt;Debug builds start only through &lt;code&gt;flutter run&lt;/code&gt;. Start the app from the Mac instead of tapping the icon.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;invalidStreamName&lt;/code&gt; error&lt;/td&gt;
&lt;td&gt;Use only English letters and numbers in stream IDs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pod install&lt;/code&gt; fails with &lt;code&gt;XCLocalSwiftPackageReference&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;CocoaPods is older than 1.16. Upgrade with &lt;code&gt;brew upgrade cocoapods&lt;/code&gt; (Homebrew installs) or &lt;code&gt;sudo gem install cocoapods&lt;/code&gt; (RubyGems installs).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The room mismatch in row 2 is the error most specific to this tutorial: every device connects to Ant Media Server successfully, yet the iPhone and the browser tabs never see each other because the devices joined different room types.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Build Next?
&lt;/h2&gt;

&lt;p&gt;Your conference app works. From here you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run it on other platforms.&lt;/strong&gt; Flutter builds the same code for Android, the web, Windows, macOS and Linux, so you don't rewrite the call screen for each one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it interactive.&lt;/strong&gt; Send chat messages, reactions or other in-call events over &lt;a href="https://antmedia.io/how-to-use-webrtc-data-channels/" rel="noopener noreferrer"&gt;WebRTC data channels&lt;/a&gt;, without touching audio or video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try the other SDK modes.&lt;/strong&gt; The same sample app includes Publish &amp;amp; Play for one-to-many streaming and P2P for direct calls. The &lt;a href="https://docs.antmedia.io/category/flutter-sdk/" rel="noopener noreferrer"&gt;Flutter SDK documentation&lt;/a&gt; covers each mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does Ant Media Server Community Edition support Flutter video conferencing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No. Flutter video conferencing requires Ant Media Server Enterprise Edition.&lt;/strong&gt; With Community Edition, the Flutter SDK supports WebRTC publishing only; WebRTC playback, conference rooms and data channels are Enterprise Edition features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which WebSocket URL does the Flutter app use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Flutter app uses &lt;code&gt;ws://AMS_HOST:5080/APP_NAME/websocket&lt;/code&gt; without SSL and &lt;code&gt;wss://AMS_HOST:5443/APP_NAME/websocket&lt;/code&gt; with SSL.&lt;/strong&gt; This tutorial uses &lt;code&gt;WebRTCAppEE&lt;/code&gt; as the application name. Production apps use &lt;code&gt;wss://&lt;/code&gt; on port 5443.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the browser use multitrack-conference.html?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The browser uses &lt;code&gt;multitrack-conference.html&lt;/code&gt; because the Flutter SDK joins multitrack conference rooms.&lt;/strong&gt; The Flutter SDK's Room ID parameter targets WebRTC multitrack conference mode, and a browser participant appears on the iPhone only when the browser page joins the same room type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does adaptive quality work in the conference?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adaptive quality lowers each stream's resolution and bitrate when bandwidth drops and raises both when bandwidth recovers.&lt;/strong&gt; The tile captions display the current values, and the relationship between &lt;a href="https://antmedia.io/video-bitrate-vs-resolution-4-key-differences-and-their-role-in-video-streaming/" rel="noopener noreferrer"&gt;bitrate and resolution&lt;/a&gt; explains why both numbers move together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the conference work when participants are on different networks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes. Participants on different networks connect through STUN, and participants behind restrictive firewalls require a TURN server.&lt;/strong&gt; The Flutter SDK's &lt;code&gt;connect()&lt;/code&gt; method accepts a custom ICE server list. The guide to &lt;a href="https://antmedia.io/publish-and-play-streams-behind-nat/" rel="noopener noreferrer"&gt;NAT traversal setup&lt;/a&gt; covers TURN configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the same Flutter app run on Android?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes. The same SampleProject runs on Android without code changes.&lt;/strong&gt; Enable developer options and USB debugging on the Android device, connect the device, and run the project with &lt;code&gt;flutter run&lt;/code&gt; or from Android Studio.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you secure Flutter conference rooms?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter conference rooms are secured with stream tokens passed through the &lt;code&gt;token&lt;/code&gt; parameter of &lt;code&gt;connect()&lt;/code&gt;.&lt;/strong&gt; Ant Media Server validates the token before allowing publish or play. &lt;a href="https://antmedia.io/how-to-secure-stream-with-jwt-stream-security-filter/" rel="noopener noreferrer"&gt;JWT stream security&lt;/a&gt; adds time-based expiration to each token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between the Flutter SDK and the native iOS SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Flutter SDK builds one codebase for iOS and Android; the native iOS SDK builds iOS-only apps in Swift.&lt;/strong&gt; Teams with an existing Swift app start from the &lt;a href="https://antmedia.io/build-and-try-webrtc-ios-app-for-dummies/" rel="noopener noreferrer"&gt;native iOS SDK&lt;/a&gt;. Both SDKs ship free with an Enterprise Edition license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You now have a multi-party Flutter video conference app running on your iPhone, with browser participants in the same room, camera and microphone controls, and video quality that adapts to the network. The same Flutter code runs on Android, the web and desktop, so the next step is taking it to the platforms your users are on. To test &lt;a href="https://antmedia.io/self-hosted-free-trial/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=flutter-conference" rel="noopener noreferrer"&gt;multi-party WebRTC rooms&lt;/a&gt; beyond a single server, a 14-day free trial of Ant Media Server Enterprise Edition gives you clustering, adaptive bitrate and every SDK, with no credit card required.&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/ant-media/WebRTC-Flutter-SDK" rel="noopener noreferrer"&gt;Ant Media Flutter SDK on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>webrtc</category>
      <category>ios</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Flutter Video Conference App for iOS, Android, Web and Desktop</title>
      <dc:creator>Amar Thodupunoori</dc:creator>
      <pubDate>Wed, 07 Oct 2026 16:53:35 +0000</pubDate>
      <link>https://dev.to/antmedia_io/flutter-video-conference-app-for-ios-android-web-and-desktop-1i68</link>
      <guid>https://dev.to/antmedia_io/flutter-video-conference-app-for-ios-android-web-and-desktop-1i68</guid>
      <description>&lt;p&gt;By the end of this guide you’ll have a working Flutter video conference app running on your iPhone, with people joining the same call from their browsers. Because it’s built with Flutter, the same code also runs on Android, the web, Windows, macOS and Linux, and the sample project and the Ant Media Flutter SDK give you everything you need to shape the app to your own product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Why Flutter for a Video Conference App?&lt;/li&gt;
&lt;li&gt;What Do You Need Before You Start?&lt;/li&gt;
&lt;li&gt;Step 1: Confirm the iPhone Reaches Ant Media Server&lt;/li&gt;
&lt;li&gt;Step 2: Clone the Flutter SampleProject&lt;/li&gt;
&lt;li&gt;Step 3: Sign the App in Xcode&lt;/li&gt;
&lt;li&gt;Step 4: Enable Developer Mode on the iPhone&lt;/li&gt;
&lt;li&gt;Step 5: Run the App on the iPhone&lt;/li&gt;
&lt;li&gt;Step 6: Connect the App to the WebSocket URL&lt;/li&gt;
&lt;li&gt;Step 7: Join the Conference Room from the iPhone&lt;/li&gt;
&lt;li&gt;Step 8: Add 3 Browser Participants&lt;/li&gt;
&lt;li&gt;Step 9: Test Controls and Adaptive Bitrate&lt;/li&gt;
&lt;li&gt;How Do You Fix the 8 Common Setup Errors?&lt;/li&gt;
&lt;li&gt;What Can You Build Next?&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Flutter for a Video Conference App?
&lt;/h2&gt;

&lt;p&gt;Flutter lets you write the video conference app once and run it almost everywhere. One Dart codebase builds native apps for iOS and Android, a web app, and desktop apps for Windows, macOS and Linux. The Ant Media Flutter SDK handles the WebRTC connection to Ant Media Server on top of that, so the call screen you set up in this guide is the same one your Android, web and desktop users get, with around 0.5 seconds of latency.&lt;/p&gt;

&lt;p&gt;This guide uses an iPhone because iOS has the most setup steps: code signing, Developer Mode and device trust. Once the app runs there, running it on an Android phone is a single &lt;code&gt;flutter run&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What Do You Need Before You Start?&lt;br&gt;
You need four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A MAC&lt;/strong&gt; with the latest Xcode and the Flutter SDK installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An iPhone&lt;/strong&gt; and a USB cable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Apple ID&lt;/strong&gt;: a free account is enough&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A running Ant Media Server Enterprise Edition&lt;/strong&gt;. Conferencing is an Enterprise Edition feature; with Community Edition, the Flutter SDK supports WebRTC publishing only. If you don’t have a server yet, pick one of these:

&lt;ul&gt;
&lt;li&gt;14-day free trial (self-hosted): fill in the trial request form, get the license key by email, then follow the installation guide. No credit card required.&lt;/li&gt;
&lt;li&gt;Buy a license: monthly or annual subscription, or a one-time perpetual license. See &lt;a href="https://antmedia.io/pricing/" rel="noopener noreferrer"&gt;Pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Throughout this guide, &lt;code&gt;AMS_HOST&lt;/code&gt; is the server address: an IP address (for example &lt;code&gt;192.168.1.20&lt;/code&gt;) or a domain name.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Confirm the iPhone Reaches Ant Media Server
&lt;/h2&gt;

&lt;p&gt;Open Safari on the iPhone and load the Ant Media Server web panel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://AMS_HOST:5080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: the Ant Media Server page loads in Safari.&lt;/p&gt;

&lt;p&gt;Every later step depends on this connection, so fix it first when the page does not load. When Ant Media Server runs on the Mac, use the Mac’s IP address, never &lt;code&gt;localhost&lt;/code&gt;. The command &lt;code&gt;ipconfig getifaddr en0&lt;/code&gt; prints the Mac’s IP address.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Clone the Flutter SampleProject
&lt;/h2&gt;

&lt;p&gt;Clone the Ant Media Flutter SDK repository and install the SampleProject dependencies. SampleProject bundles all 5 modes (Publish, Play, Peer to Peer, Conference and Data Channel) in one app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/ant-media/WebRTC-Flutter-SDK.git
cd WebRTC-Flutter-SDK/example/SampleProject
flutter pub get
cd ios &amp;amp;&amp;amp; pod install &amp;amp;&amp;amp; cd ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: the terminal prints &lt;code&gt;**Pod installation complete!**&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Sign the App in Xcode
&lt;/h2&gt;

&lt;p&gt;iOS installs only apps signed with an Apple ID. Open the Xcode workspace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;open ios/Runner.xcworkspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Xcode, complete these 5 actions in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the blue Runner icon in the left sidebar.&lt;/li&gt;
&lt;li&gt;Select Runner under TARGETS.&lt;/li&gt;
&lt;li&gt;Open the Signing &amp;amp; Capabilities tab.&lt;/li&gt;
&lt;li&gt;Tick Automatically manage signing and choose your Apple ID under Team.&lt;/li&gt;
&lt;li&gt;Change Bundle Identifier to a unique value, such as com.yourname.conferencedemo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result: the Signing section shows no red errors.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Enable Developer Mode on the iPhone
&lt;/h2&gt;

&lt;p&gt;Developer Mode lets Xcode and Flutter install debug builds on the iPhone. Complete these 3 actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect the iPhone to the Mac and tap Trust on the phone.&lt;/li&gt;
&lt;li&gt;Open Settings → Privacy &amp;amp; Security → Developer Mode on the iPhone, turn Developer Mode on and restart. The option appears only after the phone has connected to Xcode.&lt;/li&gt;
&lt;li&gt;Run the device list command on the Mac:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter devices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: the iPhone appears in the device list. Copy the iPhone’s device ID for Step 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Run the App on the iPhone
&lt;/h2&gt;

&lt;p&gt;Build and launch the SampleProject on the iPhone with the copied device ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter run -d YOUR_DEVICE_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;iOS blocks the first launch as an untrusted developer. Open Settings → General → VPN &amp;amp; Device Management on the iPhone, trust your Apple ID, and run the command again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the app lists 5 modes: Play, Publish, Peer to Peer, Conference and Data Channel.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Connect the App to the WebSocket URL
&lt;/h2&gt;

&lt;p&gt;Tap the settings icon (top right) and enter the WebSocket URL of the &lt;code&gt;WebRTCAppEE&lt;/code&gt; application, the default Enterprise Edition application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ws://AMS_HOST:5080/WebRTCAppEE/websocket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servers with SSL on a domain use &lt;code&gt;wss://AMS_HOST:5443/WebRTCAppEE/websocket&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3d2r1z4ojm25pxsabvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj3d2r1z4ojm25pxsabvc.png" alt="Websocket screen" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result: the server indicator turns green.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Join the Conference Room from the iPhone
&lt;/h2&gt;

&lt;p&gt;Join room demo from the iPhone with these 4 actions:&lt;/p&gt;

&lt;p&gt;Tap Conference.&lt;br&gt;
Enter a Stream ID, for example iphone.&lt;br&gt;
Enter the Room ID demo.&lt;br&gt;
Tap Connect, then allow camera, microphone and local network access.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5p4g1v5un9xpb4egwt1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5p4g1v5un9xpb4egwt1f.png" alt="Connecting Screen" width="800" height="1734"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Result: the iPhone camera appears in the first tile.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 8: Add 3 Browser Participants
&lt;/h2&gt;

&lt;p&gt;Open the multitrack conference sample page in three browser tabs to add three more people to room demo. Browsers allow camera access over http:// only on localhost, so choose the URL that matches the server setup.&lt;/p&gt;

&lt;p&gt;Option A — browser on the machine running Ant Media Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5080/WebRTCAppEE/multitrack-conference.html?roomId=demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Option B — any computer, server with SSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://AMS_HOST:5443/WebRTCAppEE/multitrack-conference.html?roomId=demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Option C — any computer, server without SSL (development only): add &lt;code&gt;http://AMS_HOST:5080&lt;/code&gt; to &lt;code&gt;chrome://flags/#unsafely-treat-insecure-origin-as-secure&lt;/code&gt; in Chrome, relaunch Chrome, then open &lt;code&gt;http://AMS_HOST:5080/WebRTCAppEE/multitrack-conference.html?roomId=demo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Click Join Room in each tab and allow the camera.&lt;/p&gt;

&lt;p&gt;Result: the iPhone shows the three browser participants alongside its own camera. Open more tabs, or join from other devices with the same Room ID, to add more people.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5sxds1t6sm8emnl3vb2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5sxds1t6sm8emnl3vb2i.png" alt="Conferencing" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Test Controls and Adaptive Bitrate
&lt;/h2&gt;

&lt;p&gt;Test the 2 conference features on the iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Camera and microphone: tap the buttons at the bottom of the screen. Each button turns red while its device is off.&lt;/li&gt;
&lt;li&gt;Adaptive bitrate: each tile shows that participant’s resolution and bitrate. Open Settings → Developer → Network Link Conditioner on the iPhone, choose the 3G profile and turn it on. The resolution and bitrate values drop, then recover when Network Link Conditioner is off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Do You Fix the 8 Common Setup Errors?
&lt;/h2&gt;

&lt;p&gt;Each of the 8 setup errors below has a single fix, covering server reachability, room mismatches, permissions, code signing, stream IDs and CocoaPods. The table has 8 rows (one per error) and 2 columns: the observed problem and the fix.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The app never connects&lt;/td&gt;
&lt;td&gt;Repeat Step 1. On a physical iPhone, localhost refers to the phone itself; use the server’s IP address or domain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser participants do not appear on the iPhone&lt;/td&gt;
&lt;td&gt;Use the same application (WebRTCAppEE) and the same room on every device. Open multitrack-conference.html, not conference.html, because the Flutter SDK joins track-based SFU conferences and the browser page has to match that room type.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser tabs cannot access the camera&lt;/td&gt;
&lt;td&gt;The page is loaded over http:// from a host other than localhost. Install an SSL certificate and use port 5443; the guide to enabling SSL certificates covers the domain setup. Option C in Step 8 covers development-only testing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app cannot reach a server on the local network&lt;/td&gt;
&lt;td&gt;The local network permission was denied. Enable the app under Settings → Privacy &amp;amp; Security → Local Network.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xcode: “cannot be registered to your development team”&lt;/td&gt;
&lt;td&gt;The bundle identifier is taken. Change the bundle identifier to a unique value (Step 3).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“This app can only be launched from Flutter tooling”&lt;/td&gt;
&lt;td&gt;Debug builds start only through flutter run. Start the app from the Mac instead of tapping the icon.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;invalidStreamName error&lt;/td&gt;
&lt;td&gt;Use only English letters and numbers in stream IDs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pod install fails with XCLocalSwiftPackageReference&lt;/td&gt;
&lt;td&gt;CocoaPods is older than 1.16. Upgrade with brew upgrade cocoapods (Homebrew installs) or sudo gem install cocoapods (RubyGems installs).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Can You Build Next?
&lt;/h2&gt;

&lt;p&gt;Your conference app works. From here you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run it on other platforms. Flutter builds the same code for Android, the web, Windows, macOS and Linux, so you don’t rewrite the call screen for each one.&lt;/li&gt;
&lt;li&gt;Make it interactive. Send chat messages, reactions or other in-call events over WebRTC data channels, without touching audio or video.&lt;/li&gt;
&lt;li&gt;Try the other SDK modes. The same sample app includes Publish &amp;amp; Play for one-to-many streaming and P2P for direct calls. The Flutter SDK documentation covers each mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does Ant Media Server Community Edition support Flutter video conferencing?&lt;/strong&gt;&lt;br&gt;
No. Flutter video conferencing requires Ant Media Server Enterprise Edition. With Community Edition, the Flutter SDK supports WebRTC publishing only; WebRTC playback, conference rooms and data channels are Enterprise Edition features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which WebSocket URL does the Flutter app use?&lt;/strong&gt;&lt;br&gt;
The Flutter app uses ws://AMS_HOST:5080/APP_NAME/websocket without SSL and wss://AMS_HOST:5443/APP_NAME/websocket with SSL. This tutorial uses WebRTCAppEE as the application name. Production apps use wss:// on port 5443.&lt;/p&gt;

&lt;p&gt;**Why does the browser use multitrack-conference.html?&lt;br&gt;
**The browser uses multitrack-conference.html because the Flutter SDK joins multitrack conference rooms. The Flutter SDK’s Room ID parameter targets WebRTC multitrack conference mode, and a browser participant appears on the iPhone only when the browser page joins the same room type.&lt;/p&gt;

&lt;p&gt;**How does adaptive quality work in the conference?&lt;br&gt;
**Adaptive quality lowers each stream’s resolution and bitrate when bandwidth drops and raises both when bandwidth recovers. The tile captions display the current values, and the relationship between bitrate and resolution explains why both numbers move together.&lt;/p&gt;

&lt;p&gt;**Does the conference work when participants are on different networks?&lt;br&gt;
**Yes. Participants on different networks connect through STUN, and participants behind restrictive firewalls require a TURN server. The Flutter SDK’s connect() method accepts a custom ICE server list. The guide to NAT traversal setup covers TURN configuration.&lt;/p&gt;

&lt;p&gt;**Does the same Flutter app run on Android?&lt;br&gt;
**Yes. The same SampleProject runs on Android without code changes. Enable developer options and USB debugging on the Android device, connect the device, and run the project with flutter run or from Android Studio.&lt;/p&gt;

&lt;p&gt;**How do you secure Flutter conference rooms?&lt;br&gt;
**Flutter conference rooms are secured with stream tokens passed through the token parameter of connect(). Ant Media Server validates the token before allowing publish or play. JWT stream security adds time-based expiration to each token.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between the Flutter SDK and the native iOS SDK?&lt;/strong&gt;&lt;br&gt;
The Flutter SDK builds one codebase for iOS and Android; the native iOS SDK builds iOS-only apps in Swift. Teams with an existing Swift app start from the native iOS SDK. Both SDKs ship free with an Enterprise Edition license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You now have a multi-party Flutter video conference app running on your iPhone, with browser participants in the same room, camera and microphone controls, and video quality that adapts to the network. The same Flutter code runs on Android, the web and desktop, so the next step is taking it to the platforms your users are on. To test multi-party WebRTC rooms beyond a single server, a 14-day free trial of Ant Media Server Enterprise Edition gives you clustering, adaptive bitrate and every SDK, with no credit card required.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MoQ: The Next Big Shift in Ultra-Low Latency Streaming?</title>
      <dc:creator>Ankush Banyal</dc:creator>
      <pubDate>Wed, 20 May 2026 10:46:44 +0000</pubDate>
      <link>https://dev.to/antmedia_io/moq-the-next-big-shift-in-ultra-low-latency-streaming-2hn3</link>
      <guid>https://dev.to/antmedia_io/moq-the-next-big-shift-in-ultra-low-latency-streaming-2hn3</guid>
      <description>&lt;p&gt;Media over QUIC (MoQ) is starting to become one of the most interesting shifts in real-time streaming infrastructure.&lt;/p&gt;

&lt;p&gt;For years, the industry has been balancing between:&lt;/p&gt;

&lt;p&gt;Ultra-low latency with WebRTC&lt;br&gt;
Scalability with HLS/CDN architectures&lt;/p&gt;

&lt;p&gt;MoQ introduces a different direction — combining QUIC-based transport with scalable real-time delivery models that can potentially reduce infrastructure overhead while maintaining very low latency.&lt;/p&gt;

&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;p&gt;Large-scale interactive streaming becomes more practical&lt;br&gt;
Better transport efficiency compared to traditional approaches&lt;br&gt;
Reduced dependency on heavy peer/session management&lt;br&gt;
More flexibility for modern live experiences like esports, live shopping, auctions, and interactive broadcasts&lt;/p&gt;

&lt;p&gt;At Ant Media, we’re actively exploring and supporting MoQ-based workflows alongside WebRTC and LL-HLS architectures.&lt;/p&gt;

&lt;p&gt;One important point:&lt;br&gt;
MoQ is still evolving, and adoption will require ecosystem changes — especially around playback support and player integrations. But the direction is extremely promising for the future of scalable real-time media delivery.&lt;/p&gt;

&lt;p&gt;The streaming stack is evolving fast:&lt;br&gt;
RTMP → HLS → WebRTC → MoQ&lt;/p&gt;

&lt;p&gt;Excited to see where the ecosystem goes next 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  MoQ #MediaOverQUIC #WebRTC #LowLatencyStreaming #StreamingInfrastructure #LiveStreaming #QUIC #RealtimeMedia #AntMedia #OTT #Esports
&lt;/h1&gt;

</description>
      <category>architecture</category>
      <category>infrastructure</category>
      <category>networking</category>
      <category>performance</category>
    </item>
    <item>
      <title>Ant Media Server v3.0 Is Here — AI-Powered Streaming, AV1, MoQ &amp; More 🚀</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Wed, 13 May 2026 10:34:31 +0000</pubDate>
      <link>https://dev.to/antmedia_io/ant-media-server-v30-is-here-ai-powered-streaming-av1-moq-more-2aea</link>
      <guid>https://dev.to/antmedia_io/ant-media-server-v30-is-here-ai-powered-streaming-av1-moq-more-2aea</guid>
      <description>&lt;p&gt;Ant Media Server v3.0 Released 🚀&lt;/p&gt;

&lt;p&gt;Ant Media Server&lt;br&gt;
 has officially launched v3.0, bringing major upgrades for low-latency streaming and AI-powered video applications.&lt;/p&gt;

&lt;p&gt;Highlights of v3.0&lt;br&gt;
🔹 AV1 Codec Support&lt;/p&gt;

&lt;p&gt;Better compression, lower bandwidth usage, and improved video quality for modern streaming workflows.&lt;/p&gt;

&lt;p&gt;🔹 Media over QUIC (MoQ)&lt;/p&gt;

&lt;p&gt;New MoQ plugin support enables next-gen ultra-low-latency media delivery using QUIC transport.&lt;/p&gt;

&lt;p&gt;🔹 AI Plugin&lt;/p&gt;

&lt;p&gt;A powerful new AI plugin lets developers process live video streams with external Python AI modules for:&lt;/p&gt;

&lt;p&gt;Object detection&lt;br&gt;
Face recognition&lt;br&gt;
Real-time analytics&lt;br&gt;
Smart surveillance&lt;br&gt;
🔹 Improved LL-HLS &amp;amp; SRT&lt;/p&gt;

&lt;p&gt;Enhanced LL-HLS playback and better SRT re-streaming support for professional broadcasting pipelines.&lt;/p&gt;

&lt;p&gt;🔹 Security &amp;amp; Stability&lt;/p&gt;

&lt;p&gt;v3.0 also includes architecture cleanup, deprecated API removal, HSTS support, and several stability improvements.&lt;/p&gt;

&lt;p&gt;Why It Matters&lt;/p&gt;

&lt;p&gt;Ant Media Server v3.0 focuses on the future of streaming:&lt;/p&gt;

&lt;p&gt;AI-powered video workflows&lt;br&gt;
Modern low-latency protocols&lt;br&gt;
Efficient codecs&lt;br&gt;
Scalable real-time delivery&lt;/p&gt;

&lt;p&gt;A solid update for developers building WebRTC, live streaming, and real-time video applications.&lt;/p&gt;

&lt;p&gt;👉 Official release: &lt;a href="https://antmedia.io/ant-media-server-v3-0-release/" rel="noopener noreferrer"&gt;https://antmedia.io/ant-media-server-v3-0-release/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>networking</category>
      <category>news</category>
      <category>python</category>
    </item>
    <item>
      <title>What is Simulcasting in Live Streaming?</title>
      <dc:creator>Amar Thodupunoori</dc:creator>
      <pubDate>Wed, 29 Apr 2026 09:56:36 +0000</pubDate>
      <link>https://dev.to/antmedia_io/what-is-simulcasting-in-live-streaming-5fp4</link>
      <guid>https://dev.to/antmedia_io/what-is-simulcasting-in-live-streaming-5fp4</guid>
      <description>&lt;p&gt;You’ve got one stream. Your audience is on YouTube, Facebook, Twitch, and LinkedIn — all at the same time. Simulcasting lets you reach all of them simultaneously from a single broadcast, without running multiple encoders or creating separate content for each platform.&lt;/p&gt;

&lt;p&gt;That’s the short version. Here’s everything else you need to know — from how the architecture works under the hood to exactly how to set it up with Ant Media Server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What is Simulcasting and How Does It Differ from Standard Streaming?&lt;/li&gt;
&lt;li&gt;How Does Simulcast Architecture Work Technically?&lt;/li&gt;
&lt;li&gt;What Are the 5 Key Benefits of Simulcasting?&lt;/li&gt;
&lt;li&gt;What is the Difference Between Simulcasting, Multicasting, and Adaptive Bitrate Streaming?&lt;/li&gt;
&lt;li&gt;How Do You Set Up Simulcasting with Ant Media Server?&lt;/li&gt;
&lt;li&gt;What are the Supported Simulcast Destination Types in Ant Media Server?&lt;/li&gt;
&lt;li&gt;What are the Bandwidth and Encoding Requirements for Simulcasting?&lt;/li&gt;
&lt;li&gt;Frequently Asked Questions&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Simulcasting and How Does It Differ from Standard Streaming?
&lt;/h2&gt;

&lt;p&gt;Simulcasting is the simultaneous transmission of the same encoded video stream to 2 or more destination platforms from a single ingest point. A media server takes that one incoming stream, duplicates it, and pushes independent copies to every platform you’ve configured — all at the same time.&lt;/p&gt;

&lt;p&gt;Standard streaming sends one stream to one platform. Simulcasting sends that same stream to N platforms in parallel. The key thing: your encoder doesn’t do the heavy lifting here. It pushes once to the media server. The media server handles everything else.&lt;/p&gt;

&lt;p&gt;The term comes from “simultaneous broadcast” — a concept that goes back to radio in the 1920s. The BBC first simulcast a live symphony performance over both medium and long-wave frequencies in 1926. Today, it describes real-time multi-platform distribution to destinations like YouTube Live, Facebook Live, Twitch, and any RTMP-compatible endpoint including custom servers and CDN ingest points.&lt;/p&gt;

&lt;p&gt;The critical difference from standard streaming: your encoder (OBS, Wirecast, vMix) sends one RTMP stream to the media server’s ingest endpoint. The media server — not the encoder — duplicates and forwards to each destination. Your encoder’s CPU and upload bandwidth don’t scale with the number of platforms you’re targeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Does Simulcast Architecture Work Technically?
&lt;/h2&gt;

&lt;p&gt;Simulcast architecture in Ant Media Server runs across 4 sequential stages: ingest, optional transcoding, stream duplication, and parallel forwarding. Here’s what actually happens at each stage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1 — RTMP Ingest
&lt;/h3&gt;

&lt;p&gt;Your encoder publishes a single H.264 or H.265 stream to Ant Media Server’s RTMP ingest endpoint: rtmp://[server-ip]/LiveApp/[streamId]. The server accepts the stream on port 1935 and buffers the incoming encoded bitstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2 — Optional Transcoding
&lt;/h3&gt;

&lt;p&gt;If adaptive bitrate transcoding is enabled, Ant Media Server decodes the ingest stream and re-encodes it at multiple quality levels (1080p, 720p, 480p). For simulcasting to social platforms, the original bitstream is typically passed through without re-encoding — this keeps CPU overhead low and preserves your encoder-side quality settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3 — Stream Duplication
&lt;/h3&gt;

&lt;p&gt;Ant Media Server creates parallel stream copies in memory. Each copy is an independent data pathway with its own buffer, connection state, and destination RTMP URL. Duplication happens at the application layer — the server doesn’t retransmit the ingest stream from your encoder. It forwards from its own buffer to each destination.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4 — Parallel RTMP Forwarding
&lt;/h3&gt;

&lt;p&gt;Each duplicated stream is pushed simultaneously to its configured destination using that platform’s RTMP ingest URL and stream key. Ant Media Server maintains an independent TCP connection to each platform, handles reconnection on failure, and monitors each output stream’s connection state and bitrate.&lt;/p&gt;

&lt;p&gt;A failure on one destination doesn’t interrupt the others. Your YouTube stream stays live even if Facebook’s RTMP ingest goes down.&lt;/p&gt;

&lt;p&gt;One thing to plan for: a 5 Mbps 1080p30 ingest stream requires 5 Mbps × N Mbps of outbound bandwidth from the Ant Media Server instance, where N equals the number of simultaneous destination streams. A 3-platform simulcast at 5 Mbps per destination needs 15 Mbps of sustained outbound throughput from the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Are the 5 Key Benefits of Simulcasting?
&lt;/h2&gt;

&lt;p&gt;Simulcasting isn’t just a nice-to-have for large broadcasters. These 5 advantages apply whether you’re running a startup webinar or a stadium live event.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Multiply Your Audience Reach Without Extra Production Overhead&lt;br&gt;
One encoder session, one camera setup, one production workflow — distributed to YouTube, Facebook, LinkedIn, and Twitch at the same time. Production cost stays constant while your addressable viewer count scales with every platform you add.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Activate Multiple Platform Algorithms Simultaneously&lt;br&gt;
Each destination platform registers an independent live stream event. That triggers its notification system and live content feed ranking for that platform’s subscriber base. A 3-platform simulcast activates 3 separate recommendation algorithms from a single broadcast.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meet Your Audience Where They Already Are&lt;br&gt;
Your audience has strong platform preferences — gaming audiences cluster on Twitch, professionals prefer LinkedIn Live, casual viewers default to YouTube — and committing to one platform means losing everyone else. Understanding live streaming platform reach shows that simulcasting eliminates that segmentation loss entirely, letting a single broadcast event activate every platform’s notification and recommendation system simultaneously.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build Resilient Broadcast Delivery&lt;br&gt;
Single-platform streaming has no fallback path — if that platform’s RTMP ingest failure takes your entire broadcast offline. Simulcasting maintains parallel TCP connections to each destination independently, so one disconnection leaves every other output stream untouched. You get inherent redundancy across output paths without any extra infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collect Cross-Platform Analytics From One Event&lt;br&gt;
Every destination platform generates independent viewer count, engagement, and retention data for the same broadcast event — parallel performance datasets from a single production workflow that live streaming analytics simply cannot provide from single-platform streaming alone. Cross-platform data reveals which audiences engage longest, which platforms drive the highest interaction rate, and where to concentrate future broadcast investment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What is the Difference Between Simulcasting, Multicasting, and Adaptive Bitrate Streaming?
&lt;/h2&gt;

&lt;p&gt;These 3 methods operate at different layers of the streaming stack. They’re often confused — here’s how they actually differ across 5 technical dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do You Set Up Simulcasting with Ant Media Server?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install and configure Ant Media Server. Deploy on Ubuntu 22.04 LTS using the one-line installation script or deploy from AWS Marketplace, Azure Marketplace, or Google Cloud Marketplace. Make sure ports 1935 (RTMP), 5080 (HTTP), and 5443 (HTTPS) are open on your instance’s security group or firewall.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a live stream in the web panel. Log in to the Ant Media Server web panel at &lt;br&gt;
&lt;code&gt;https://[your-domain]:5443&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Navigate to the &lt;strong&gt;LiveApp&lt;/strong&gt; application, select &lt;strong&gt;New Live Stream&lt;/strong&gt;, and assign a &lt;strong&gt;stream ID&lt;/strong&gt;. Your ingest URL follows the pattern &lt;code&gt;rtmp://[server-address]/LiveApp/[streamId]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure RTMP endpoint forwarding. In the stream settings, click the hamburger icon on the right of your stream row, then select &lt;strong&gt;Edit RTMP Endpoint&lt;/strong&gt;. 
Enter each destination’s RTMP ingest URL and stream key. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;YouTube Live uses &lt;code&gt;rtmp://a.rtmp.youtube.com/live2/[stream-key]&lt;/code&gt;; Facebook Live uses &lt;code&gt;rtmps://live-api-s.facebook.com:443/rtmp/[stream-key]&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Click Add RTMP Endpoint for each platform.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Publish the ingest stream. When your encoder goes live, Ant Media Server simultaneously forwards to all configured destination endpoints. &lt;br&gt;
For OBS RTMP configuration with Ant Media Server, set the &lt;br&gt;
&lt;strong&gt;server URL&lt;/strong&gt; to &lt;code&gt;rtmp://[server-address]/LiveApp&lt;/code&gt; and the &lt;br&gt;
&lt;strong&gt;stream key&lt;/strong&gt; to your assigned &lt;strong&gt;streamId&lt;/strong&gt; — the same ingest point feeds every simulcast destination from that single connection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor stream health via REST API (advanced). The REST API endpoint &lt;code&gt;GET /LiveApp/rest/v2/broadcasts/{streamId}&lt;/code&gt; returns real-time status for the source stream including connection state and bitrate. &lt;br&gt;
To manage RTMP endpoints programmatically, use POST &lt;code&gt;/LiveApp/rest/v2/broadcasts/{streamId}/rtmp-endpoint&lt;/code&gt; to add destinations and DELETE to remove them. &lt;br&gt;
For the full endpoint reference and authentication setup, see the &lt;a href="https://antmedia.io/rest/" rel="noopener noreferrer"&gt;REST API guide&lt;/a&gt;, which covers IP filter configuration, JWT token authentication, and the complete broadcast object schema.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What are the Supported Simulcast Destination Types in Ant Media Server?
&lt;/h2&gt;

&lt;p&gt;Ant Media Server supports simulcast forwarding to any RTMP or RTMPS-compatible destination endpoint. The official docs confirm the following platforms with their specific ingest URL formats:&lt;/p&gt;

&lt;p&gt;YouTube Live — &lt;code&gt;rtmp://a.rtmp.youtube.com/live2/[stream-key]&lt;/code&gt;&lt;br&gt;
Facebook Live — &lt;code&gt;rtmps://live-api-s.facebook.com:443/rtmp/[stream-key]&lt;/code&gt;(Note: YouTube does not accept streams without audio — make sure your encoder includes an audio track)&lt;br&gt;
Twitch — &lt;code&gt;[nearest-ingest-endpoint]/[stream-key]&lt;/code&gt;(get your nearest ingest server from the Twitch Ingest Server list)&lt;br&gt;
Periscope — &lt;code&gt;rtmp://de.pscp.tv:80/x/[stream-key]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Any RTMP-compatible platform — including LinkedIn Live, Twitter/X, and other services that provide an RTMP ingest URL and stream key&lt;br&gt;
Custom RTMP servers — any RTMP-compliant ingest endpoint, including other Ant Media Server instances and CDN ingest points&lt;/p&gt;

&lt;p&gt;Because Ant Media Server forwards to any RTMP endpoint, you’re not limited to the platforms listed above. If a platform gives you an RTMP URL and stream key, it works as a simulcast destination. This also enables cascaded architectures — forwarding from one Ant Media Server instance to another for multi-hop distribution pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the Bandwidth and Encoding Requirements for Simulcasting?
&lt;/h2&gt;

&lt;p&gt;Simulcast bandwidth requirements scale linearly with destination count multiplied by per-stream bitrate. Planning this correctly before you go live is the most common thing people skip.&lt;/p&gt;

&lt;p&gt;A 1080p30 simulcast at 4 Mbps per stream to 4 destinations requires 16 Mbps of sustained outbound bandwidth from the Ant Media Server instance. That’s the primary infrastructure scaling factor — it’s what determines whether you need a larger instance or not. Size your server instance based on outbound bandwidth capacity, not CPU, when running pass-through simulcast (no transcoding).&lt;/p&gt;

&lt;p&gt;Here are the encoding specs that work reliably across all major social platform RTMP ingest systems:&lt;/p&gt;

&lt;p&gt;The wrong audio codec selection causes immediate rejection at the platform ingest level — which is why verifying encoder audio settings before going live with a simulcast is a non-negotiable pre-flight step. AAC-LC at 128 kbps stereo is the standard requirement across YouTube and Facebook RTMP ingest systems.&lt;/p&gt;

&lt;p&gt;CPU overhead in pass-through mode is low. When simulcasting without transcoding, Ant Media Server forwards the incoming encoded bitstream without decode/re-encode. CPU load scales primarily with the number of TCP connections managed, not video resolution. The key resource to monitor and size for is outbound bandwidth — add the per-stream bitrate for every destination you’re targeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What is simulcasting in live streaming?&lt;br&gt;
Simulcasting is the simultaneous transmission of one live stream to multiple destination platforms — such as YouTube, Facebook, and Twitch — from a single RTMP ingest point. A media server duplicates the ingest stream and pushes independent copies to each configured RTMP endpoint in parallel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does simulcasting require a separate encoder for each platform?&lt;br&gt;
No. You need one encoder publishing to one media server ingest endpoint. The media server handles duplication and parallel forwarding to all destination platforms. Adding destinations increases server outbound bandwidth, not encoder load or production complexity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How many platforms does Ant Media Server simulcast to simultaneously?&lt;br&gt;
Ant Media Server supports simulcasting to multiple RTMP and RTMPS destination endpoints from a single ingest stream. The practical limit is your server’s available outbound bandwidth — each destination consumes bandwidth equal to the forwarded stream’s bitrate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is the difference between simulcasting and adaptive bitrate streaming?&lt;br&gt;
Simulcasting forwards the same encoded stream to multiple platform destinations simultaneously. Adaptive bitrate streaming delivers multiple quality tiers of a stream to individual viewers, where each viewer’s player selects the appropriate bitrate based on network conditions. Both work from a single Ant Media Server ingest stream and run in parallel.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What encoder settings work best for simulcasting?&lt;br&gt;
H.264 video at 4–6 Mbps for 1080p30, AAC-LC audio at 128 kbps, and a 2-second keyframe interval. These settings satisfy the ingest requirements of YouTube Live, Facebook Live, Twitch, and other RTMP-compatible platforms simultaneously. In OBS, use the zerolatency tune setting for x264 or enable Low Latency mode for NVENC to minimize encoder-side delay.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does Ant Media Server support simulcasting via REST API?&lt;br&gt;
Yes. The REST API provides programmatic control over simulcast RTMP endpoint management. &lt;br&gt;
Use &lt;br&gt;
&lt;code&gt;POST /LiveApp/rest/v2/broadcasts/{streamId}/rtmp-endpoint&lt;/code&gt;to add a destination &lt;br&gt;
&lt;code&gt;DELETE /LiveApp/rest/v2/broadcasts/{streamId}/rtmp-endpoint?endpointServiceId={dataId}&lt;/code&gt; to remove one. &lt;br&gt;
&lt;code&gt;GET /LiveApp/rest/v2/broadcasts/{streamId}&lt;/code&gt; endpoint returns the broadcast object with current connection state and bitrate.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is simulcasting the same as multistreaming?&lt;br&gt;
Yes — same outcome, different framing. Simulcasting is the technical method (server-side stream duplication and parallel RTMP forwarding). Multistreaming is the same workflow described in product interfaces and marketing. They refer to the same thing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Simulcasting routes a single RTMP ingest stream to multiple simultaneous platform destinations through server-side duplication and parallel forwarding — one production workflow reaches YouTube Live, Facebook Live, Twitch, and any RTMP-compatible endpoint at the same time. No extra encoders. No extra production overhead.&lt;/p&gt;

&lt;p&gt;Ant Media Server handles ingest, optional transcoding, stream duplication, and parallel RTMP forwarding — with per-destination connection monitoring and full REST API control over every endpoint. In pass-through mode, CPU overhead scales with TCP connection count, not resolution — the resource to size for is outbound bandwidth per destination stream.&lt;/p&gt;

&lt;p&gt;You can validate the complete simulcast forwarding pipeline — including RTMP endpoint configuration, REST API management, and adaptive bitrate integration — during a 14-day free trial of Ant Media Server’s simulcast streaming deployment.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>networking</category>
      <category>socialmedia</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is Simulcasting in Live Streaming?</title>
      <dc:creator>Mohammad Owais K.</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:00:06 +0000</pubDate>
      <link>https://dev.to/antmedia_io/what-is-simulcasting-in-live-streaming-4oje</link>
      <guid>https://dev.to/antmedia_io/what-is-simulcasting-in-live-streaming-4oje</guid>
      <description>&lt;p&gt;You’ve got one stream. Your audience is on YouTube, Facebook, Twitch, and LinkedIn — all at the same time. Simulcasting lets you reach all of them simultaneously from a single broadcast, without running multiple encoders or creating separate content for each platform.&lt;/p&gt;

&lt;p&gt;That’s the short version. Here’s everything else you need to know — from how the architecture works under the hood to exactly how to set it up with Ant Media Server.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Simulcasting and How Does It Differ from Standard Streaming?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://antmedia.io/what-is-simulcasting/" rel="noopener noreferrer"&gt;Simulcasting &lt;/a&gt;is the simultaneous transmission of the same encoded video stream to 2 or more destination platforms from a single ingest point. A media server takes that one incoming stream, duplicates it, and pushes independent copies to every platform you’ve configured — all at the same time.&lt;/p&gt;

&lt;p&gt;Standard streaming sends one stream to one platform. Simulcasting sends that same stream to N platforms in parallel. The key thing: your encoder doesn’t do the heavy lifting here. It pushes once to the media server. The media server handles everything else.&lt;/p&gt;

&lt;p&gt;The term comes from “simultaneous broadcast” — a concept that goes back to radio in the 1920s. The BBC first simulcast a live symphony performance over both medium and long-wave frequencies in 1926. Today, it describes real-time multi-platform distribution to destinations like YouTube Live, Facebook Live, Twitch, and any RTMP-compatible endpoint including custom servers and CDN ingest points.&lt;/p&gt;

&lt;p&gt;The critical difference from standard streaming: your encoder (OBS, Wirecast, vMix) sends one RTMP stream to the media server’s ingest endpoint. The media server — not the encoder — duplicates and forwards to each destination. Your encoder’s CPU and upload bandwidth don’t scale with the number of platforms you’re targeting.&lt;/p&gt;

&lt;p&gt;Simulcasting routes a single RTMP ingest stream to multiple simultaneous platform destinations through server-side duplication and parallel forwarding — one production workflow reaches YouTube Live, Facebook Live, Twitch, and any RTMP-compatible endpoint at the same time. No extra encoders. No extra production overhead.&lt;/p&gt;

&lt;p&gt;Ant Media Server handles ingest, optional transcoding, stream duplication, and parallel RTMP forwarding — with per-destination connection monitoring and full REST API control over every endpoint. In pass-through mode, CPU overhead scales with TCP connection count, not resolution — the resource to size for is outbound bandwidth per destination stream.&lt;/p&gt;

&lt;p&gt;You can validate the complete simulcast forwarding pipeline — including RTMP endpoint configuration, REST API management, and adaptive bitrate integration — during a &lt;a href="https://antmedia.io/self-hosted-free-trial/" rel="noopener noreferrer"&gt;14-day free trial of Ant Media Server’s&lt;/a&gt; simulcast streaming deployment.&lt;/p&gt;

</description>
      <category>simulcasting</category>
    </item>
    <item>
      <title>WebRTC vs. MoQ — Two Protocols, One Platform Completely Built for Both</title>
      <dc:creator>Amar Thodupunoori</dc:creator>
      <pubDate>Wed, 08 Apr 2026 10:55:56 +0000</pubDate>
      <link>https://dev.to/antmedia_io/webrtc-vs-moq-two-protocols-one-platform-completely-built-for-both-4aj1</link>
      <guid>https://dev.to/antmedia_io/webrtc-vs-moq-two-protocols-one-platform-completely-built-for-both-4aj1</guid>
      <description>&lt;p&gt;Two powerful protocols. One streaming platform built for both. Lets focus on what happens today and what’s waiting for us in the future as Ant Media Server perspective.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mntkt3d5vgaw2wtqt84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mntkt3d5vgaw2wtqt84.png" alt="WebRTC vs MOQ" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The live streaming world is buzzing about Media over QUIC (MoQ) — a new IETF-standard protocol that promises to combine the scalability of CDN-based streaming with the sub-second latency as we used to associate with WebRTC only so far. At Ant Media Server, we’ve built our platform around WebRTC since day one as known globally.&lt;/p&gt;

&lt;p&gt;So the question we get asked constantly is: Should you be worried? Is WebRTC dead?&lt;/p&gt;

&lt;p&gt;The short answer: No. But MoQ is genuinely exciting — and understanding the difference between the two is critical to making smart infrastructure decisions now and also for future.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two Protocols, Two Philosophies
&lt;/h3&gt;

&lt;p&gt;WebRTC and MoQ weren’t designed for the same problem. They emerged from different eras, different constraints, and different visions of what the real-time web should look like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WebRTC- Web Real-Time Communication&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Born in 2011&lt;/li&gt;
&lt;li&gt;Standardized by W3C &amp;amp; IETF, shipped in Chrome in 2012&lt;/li&gt;
&lt;li&gt;~0.2–0.5s latency&lt;/li&gt;
&lt;li&gt;True sub-second, ideal for interactive apps&lt;/li&gt;
&lt;li&gt;SFU Architecture&lt;/li&gt;
&lt;li&gt;Server-side Selective Forwarding Units for scalability&lt;/li&gt;
&lt;li&gt;Universal browser support&lt;/li&gt;
&lt;li&gt;Chrome, Safari, Firefox, Edge — no plugins needed&lt;/li&gt;
&lt;li&gt;Transport: UDP / DTLS-SRTP&lt;/li&gt;
&lt;li&gt;Built on RTP, approximately 20 referenced standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MoQ- Media over QUIC&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emerging standard, ~2022–present&lt;/li&gt;
&lt;li&gt;IETF working group, still in active development&lt;/li&gt;
&lt;li&gt;Sub-second to near-real-time&lt;/li&gt;
&lt;li&gt;Configurable latency from ultra-low to VOD-grade&lt;/li&gt;
&lt;li&gt;Pub/Sub + CDN Relay Architecture&lt;/li&gt;
&lt;li&gt;Relays fan out live media with structured tracks&lt;/li&gt;
&lt;li&gt;Chrome &amp;amp; Edge only (2026)&lt;/li&gt;
&lt;li&gt;Safari iOS WebTransport support is on the way&lt;/li&gt;
&lt;li&gt;Transport: QUIC / WebTransport&lt;/li&gt;
&lt;li&gt;Built on HTTP/3, no RTP dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WebRTC: Where Ant Media Focuses Today
&lt;/h3&gt;

&lt;p&gt;Ant Media Server was built around WebRTC — and for good reason. WebRTC delivers sub-0.5 second latency across every major browser on the planet without requiring a plugin, app download, or special configuration from your end users. For use cases where responsiveness is existential — live auctions, telehealth consultations, remote drone monitoring, interactive sports betting — there is simply no better option available at production scale today.&lt;/p&gt;

&lt;p&gt;Our SFU-based architecture means viewer connections are handled efficiently: the origin node accepts and transcodes incoming streams, while edge nodes play them out. This scales from a few person virtual classroom to a global live event with tens of thousands of concurrent viewers — and it does so on infrastructure that auto-scales on AWS, Azure, GCP, or your own on-premise cluster via Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where WebRTC Wins
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Telehealth &amp;amp; Remote Consultation&lt;br&gt;
HIPAA-compliant, real-time patient-provider video with sub-500ms responsiveness. Latency matters when a doctor needs to notice a patient’s reaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Live Auctions &amp;amp; Bidding&lt;br&gt;
Fairness depends on all bidders seeing the same moment simultaneously. Any latency asymmetry is a legal and commercial liability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Interactive Gaming &amp;amp; Betting&lt;br&gt;
Engagement and revenue in real-time gaming require immediate feedback loops. WebRTC delivers the interactivity that keeps users in the moment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Surveillance &amp;amp; IoT Monitoring&lt;br&gt;
Real-time CCTV and IP camera feeds benefit from WebRTC’s encrypted, browser-native delivery without buffering delays or plugins.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Honest Limitations
&lt;/h3&gt;

&lt;p&gt;WebRTC’s complexity is legendary. The protocol stack references approximately 20 standards, making it genuinely difficult to customize outside the bounds of what browser vendors choose to implement. ICE negotiation, STUN/TURN traversal, and SDP signaling are all layers of complexity that sit between you and “just streaming video.” At Ant Media, we abstract most of this — but it’s worth being honest that at true internet-scale one-to-many streaming, WebRTC’s architecture requires significant investment to remain cost-efficient.&lt;/p&gt;

&lt;p&gt;WebRTC also has no native concept of CDN-friendly relay architectures. It scales through SFUs and clustering which means infrastructure costs grow with your viewer count in ways that pure CDN-used protocols avoid.&lt;/p&gt;

&lt;h3&gt;
  
  
  MoQ: The Architecture That Fixes the Middle Ground
&lt;/h3&gt;

&lt;p&gt;Media over QUIC is the most thoughtful attempt yet to bridge the long-standing gap between two worlds: the cost efficiency and CDN-scalability of HLS, and the near-zero latency that WebRTC enables. MoQ is built on QUIC — the same transport layer behind HTTP/3 — which eliminates TCP’s head-of-line blocking, handles connection migration gracefully.&lt;/p&gt;

&lt;p&gt;The key innovation in MoQ is its publish/subscribe model built around “tracks” — linear flows of media data (video, audio, captions, metadata) that relays can cache and fan out at the live edge. Unlike WebRTC, which requires a full SFU session per viewer, MoQ’s relay architecture lets CDN nodes participate natively. That’s why giant companies like YouTube are paying attention: MoQ lets existing CDN infrastructure be upgraded rather than replaced.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;MoQ’s goal is to give you WebRTC-like interactivity and HLS-like scalability in a single protocol. Sub-second join times + internet-scale fan-out without maintaining thousands of individual real-time sessions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Where MoQ Shines (When Ready)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Large-Scale Live Events&lt;br&gt;
Concerts, sports broadcasts, and political events where you need sub-second latency for a million simultaneous viewers — a CDN relay model makes this economical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hybrid Live + VOD Platforms&lt;br&gt;
A single protocol handling live streaming and on-demand playback means dramatically simpler architecture and unified infrastructure costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next-Gen CDN Integration&lt;br&gt;
MoQ’s HTTP/3 compatibility means CDNs can extend their existing networks rather than replace them wholesale.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Honest Limitations
&lt;/h3&gt;

&lt;p&gt;MoQ is genuinely exciting — but it is not production-ready today, and the numbers back that up. As of late 2025, WebTransport (which MoQ depends on in browsers) represents a fraction of a percent of web page loads, versus WebRTC’s stable ~0.35%. Chrome metrics show brief experimental spikes followed by drop-offs.&lt;/p&gt;

&lt;p&gt;Safari on iOS was a significant blocker until it was recently (a week ago) announced  that WebTransport is supported with Safari iOS 26.4 , may help removing fallback implementations that add complexity. Some networks still block UDP traffic. And the MoQ specification itself, while advancing rapidly through IETF, is still evolving — meaning production deployments today may carry interoperability risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Ant Media Is Positioned: Protocol-Agnostic Pragmatism
&lt;/h3&gt;

&lt;p&gt;Ant Media Server has always been protocol-pragmatic. We started with RTMP and WebRTC, layered in SRT, RTSP, HLS, LL-HLS, CMAF, WHIP/WHEP — because the right protocol depends on the use case, not industry fashion cycles.&lt;/p&gt;

&lt;p&gt;Our position on WebRTC vs MoQ mirrors what the most credible voices in the streaming space have concluded: these protocols are not competitors — they are complements. WebRTC is the definitive answer for interactive, browser-native, sub-500ms experiences. MoQ is the most architecturally elegant answer for the future of one-to-many streaming at internet scale with CDN economics.&lt;/p&gt;

&lt;p&gt;The industry consensus forming around a hybrid workflow makes intuitive sense: WebRTC for browser-based contribution and ingest, with MoQ as the delivery layer when it matures. This is exactly the kind of architecture Ant Media Server is designed to support — accepting streams over any protocol and delivering them over whatever transport best fits the viewer context.&lt;/p&gt;

&lt;h4&gt;
  
  
  What This Means for Ant Media Users
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Today: build on WebRTC with confidence. Our SFU-based clustering, adaptive bitrate engine, auto-scaling on major clouds or on premise, and ~0.5s latency guarantee are production-proven. When MoQ achieves production maturity, Ant Media’s multi-protocol architecture means you add it as a delivery option — not a platform migration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  How Ant Media Approach: Don’t Choose. Prepare for Both.
&lt;/h3&gt;

&lt;p&gt;If you need to build something today — a telehealth platform, a live auction, a drone monitoring system, an interactive sports stream — build it on WebRTC. It’s proven, universally supported, and with Ant Media Server, it scales gracefully from prototype to production without infrastructure dependencies.&lt;/p&gt;

&lt;p&gt;If you’re designing a platform for 2028 and beyond — especially one where CDN economics and massive concurrent audiences matter — keep a close eye on MoQ. The fundamentals are solid. The IETF momentum is real. The giant companies are all investing. When cross-browser support closes, MoQ will be ready for the architectures that WebRTC was never designed for.&lt;/p&gt;

&lt;p&gt;At Ant Media, our strategy is simple: the future of streaming is to have multi-protocol capability in one platform, and your infrastructure should be too. We’re watching MoQ closely, supporting WHIP/WHEP as the bridge between today and tomorrow, and building the platform that lets you change your delivery layer without changing your application.&lt;/p&gt;

&lt;p&gt;To demonstrate our commitment to our users, we’ve decided to showcase how MoQ works and performs compared to other protocols at &lt;a href="https://antmedia.io/join-ant-media-at-nab-2026-las-vegas-w3317/" rel="noopener noreferrer"&gt;NAB Show, starting April 19, 2026, at Booth 3318 in Las Vegas&lt;/a&gt;. We invite you to join us and experience it firsthand.&lt;/p&gt;

&lt;p&gt;Pick the right tool for the right job — and build on infrastructure flexible enough to evolve with it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>networking</category>
      <category>performance</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>MPEG-DASH Streaming: Complete Guide to Adaptive Video Delivery over HTTP</title>
      <dc:creator>Mohammad Owais K.</dc:creator>
      <pubDate>Wed, 01 Apr 2026 09:16:28 +0000</pubDate>
      <link>https://dev.to/antmedia_io/mpeg-dash-streaming-complete-guide-to-adaptive-video-delivery-over-http-4hfk</link>
      <guid>https://dev.to/antmedia_io/mpeg-dash-streaming-complete-guide-to-adaptive-video-delivery-over-http-4hfk</guid>
      <description>&lt;p&gt;Every viewer expects smooth, buffer-free video — whether they are watching a live sports broadcast on a phone or streaming a feature film on a smart TV. Behind the scenes, the protocol handling that delivery determines whether the experience holds up under real-world network conditions. MPEG-DASH (Dynamic Adaptive Streaming over HTTP) is the only ISO-ratified international standard designed specifically for this job. Ratified in 2012 under ISO/IEC 23009-1 and revised most recently in 2022, MPEG-DASH powers adaptive video delivery for Netflix, YouTube, and thousands of broadcast-grade streaming platforms worldwide.&lt;/p&gt;

&lt;p&gt;This guide walks through &lt;a href="https://antmedia.io/mpeg-dash-streaming-protocol/" rel="noopener noreferrer"&gt;how the MPEG-DASH protocol works&lt;/a&gt; at a technical level, where it differs from Apple’s HLS, what makes its codec-agnostic design valuable for modern streaming architectures, and how Ant Media Server implements DASH delivery with low-latency CMAF packaging, GPU-accelerated transcoding, and multi-protocol ingest support.&lt;/p&gt;

</description>
      <category>mpeg</category>
      <category>dash</category>
      <category>streaming</category>
    </item>
  </channel>
</rss>
