<?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: Malti Thakur</title>
    <description>The latest articles on DEV Community by Malti Thakur (@malti_thakur_fc70e73f4dde).</description>
    <link>https://dev.to/malti_thakur_fc70e73f4dde</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%2Fuser%2Fprofile_image%2F3566448%2Ff43902aa-5776-4e36-a6aa-418b591d0ecc.jpg</url>
      <title>DEV Community: Malti Thakur</title>
      <link>https://dev.to/malti_thakur_fc70e73f4dde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/malti_thakur_fc70e73f4dde"/>
    <language>en</language>
    <item>
      <title>How to Get Sub-Second Latency from OBS Using WHIP on AWS published.</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Fri, 30 Oct 2026 08:58:35 +0000</pubDate>
      <link>https://dev.to/malti_thakur_fc70e73f4dde/how-to-get-sub-second-latency-from-obs-using-whip-on-awspublished-3972</link>
      <guid>https://dev.to/malti_thakur_fc70e73f4dde/how-to-get-sub-second-latency-from-obs-using-whip-on-awspublished-3972</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I work at Ant Media, and this walkthrough uses Ant Media Server. The same WHIP steps in OBS apply to any WHIP-compatible server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OBS over RTMP usually puts viewers 2 to 5 seconds behind you. That's fine for a normal broadcast. It's a problem for auctions, live classes, remote camera control, or anything where a person has to respond to what they see.&lt;/p&gt;

&lt;p&gt;WHIP (WebRTC-HTTP Ingestion Protocol, RFC 9725) is the fix. OBS has supported it since v30, so you don't need new software on the encoder side. You change the service and the URL, and glass-to-glass latency drops below 0.5 seconds.&lt;/p&gt;

&lt;p&gt;Here's a setup on AWS, start to finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An AWS account&lt;/li&gt;
&lt;li&gt;OBS 30 or newer&lt;/li&gt;
&lt;li&gt;About ten minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Launch the server
&lt;/h2&gt;

&lt;p&gt;Subscribe to Ant Media Server on AWS Marketplace (there's a 7-day free trial of the software; normal EC2 charges still apply):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;View purchase options&lt;/strong&gt;, choose &lt;strong&gt;Usage based&lt;/strong&gt;, and click &lt;strong&gt;Subscribe&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Launch your software&lt;/strong&gt; and choose &lt;strong&gt;Launch from EC2 Console&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pick the latest version and a region, then name the instance and choose an instance type and key pair.&lt;/li&gt;
&lt;li&gt;Keep the default security group for now and launch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nothing needs installing because the software is already running on the instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Enable SSL
&lt;/h2&gt;

&lt;p&gt;A fresh instance serves plain HTTP on port 5080. Log in at &lt;code&gt;http://&amp;lt;server-ip&amp;gt;:5080&lt;/code&gt; with the username &lt;code&gt;JamesBond&lt;/code&gt; and your EC2 instance ID as the password.&lt;/p&gt;

&lt;p&gt;Then go to &lt;strong&gt;Server Settings → TLS/SSL&lt;/strong&gt;, pick the free &lt;code&gt;antmedia.cloud&lt;/code&gt; subdomain (or use your own domain), click &lt;strong&gt;Configure SSL&lt;/strong&gt;, and apply the restart. When it comes back you'll have HTTPS on port 5443.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Configure OBS
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Settings → Stream&lt;/strong&gt;, set the service to &lt;strong&gt;WHIP&lt;/strong&gt; and use this as the server URL:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;live&lt;/code&gt; is the default application name, and &lt;code&gt;streamId&lt;/code&gt; can be anything. The stream is created when OBS connects. Leave the bearer token empty unless you've turned on stream security, then hit &lt;strong&gt;Start Streaming&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Play it back
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;your-domain&amp;gt;:5443/live/play.html?id=&amp;lt;streamId&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That plays over WebRTC. Add &lt;code&gt;&amp;amp;playOrder=hls&lt;/code&gt; to check the HLS output of the same stream.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it doesn't work
&lt;/h2&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;Likely cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OBS says "streaming", no video&lt;/td&gt;
&lt;td&gt;UDP 50000–60000 is blocked in the security group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fails immediately on start&lt;/td&gt;
&lt;td&gt;Wrong endpoint URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No WHIP option in OBS&lt;/td&gt;
&lt;td&gt;OBS is older than v30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;App name in the URL doesn't match (it's case-sensitive)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The UDP one catches almost everyone. Signalling goes over HTTPS and succeeds, so OBS looks happy, but the media has no path through.&lt;/p&gt;

&lt;h2&gt;
  
  
  RTMP or WHIP?
&lt;/h2&gt;

&lt;p&gt;Use RTMP if nobody needs to react to the video. It works with almost every encoder. Use WHIP when delay matters and you're okay requiring OBS 30+, FFmpeg or a browser as the publisher.&lt;/p&gt;

&lt;p&gt;Full version with screenshots: &lt;a href="https://antmedia.io/whip-server-aws/" rel="noopener noreferrer"&gt;antmedia.io/whip-server-aws&lt;/a&gt;. You can also try publishing from a browser first on the &lt;a href="https://test.antmedia.io:5443/live/whip.html" rel="noopener noreferrer"&gt;public WHIP test page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ready to try it? &lt;a href="https://aws.amazon.com/marketplace/pp/prodview-464ritgzkzod6?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=whip_obs_aws&amp;amp;utm_content=footer_cta" rel="noopener noreferrer"&gt;Start the 7-day free trial on AWS Marketplace&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>streaming</category>
      <category>tutorial</category>
      <category>aws</category>
      <category>performance</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>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>Ant Media Server v2.17.0 — SSAI, Web SDK v2 &amp; Low-Latency Streaming at Scale</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Wed, 18 Mar 2026 10:35:54 +0000</pubDate>
      <link>https://dev.to/antmedia_io/ant-media-server-v2170-ssai-web-sdk-v2-low-latency-streaming-at-scale-3hkf</link>
      <guid>https://dev.to/antmedia_io/ant-media-server-v2170-ssai-web-sdk-v2-low-latency-streaming-at-scale-3hkf</guid>
      <description>&lt;p&gt;If you’re working with real-time video or live streaming, the new release of Ant Media Server v2.17.0 is worth a look.&lt;/p&gt;

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

&lt;p&gt;🔥 &lt;strong&gt;What’s new?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💰 Server-Side Ad Insertion (SSAI)&lt;br&gt;
Monetize your streams without disrupting playback — ads are stitched directly into the stream.&lt;/p&gt;

&lt;p&gt;⚙️ &lt;strong&gt;Web SDK v2&lt;/strong&gt;&lt;br&gt;
Cleaner API, better reconnection handling, and modern async/await support.&lt;/p&gt;

&lt;p&gt;⚡ Improved Low-Latency HLS (LL-HLS)&lt;br&gt;
Scale to larger audiences while keeping latency low (≈2–5s).&lt;/p&gt;

&lt;p&gt;🧠 &lt;strong&gt;Why it matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This update focuses on what developers actually need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better monetization&lt;/li&gt;
&lt;li&gt;Smoother developer experience&lt;/li&gt;
&lt;li&gt;More reliable scaling
Whether you’re building a live streaming app, webinar platform, or real-time product, these upgrades make things easier.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🚀 Enhance Your Android Live Streams with DeepAR &amp; Custom Overlays Using Ant Media SDK</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Wed, 04 Mar 2026 11:06:53 +0000</pubDate>
      <link>https://dev.to/antmedia_io/enhance-your-android-live-streams-with-deepar-custom-overlays-using-ant-media-sdk-19ni</link>
      <guid>https://dev.to/antmedia_io/enhance-your-android-live-streams-with-deepar-custom-overlays-using-ant-media-sdk-19ni</guid>
      <description>&lt;p&gt;Live streaming has come a long way. Viewers today expect engaging, interactive experiences — not just a static camera feed. With the Ant Media Android SDK, you can bring Augmented Reality (AR) effects and branded overlays right into your live streams. In this post, we’ll explore how to add DeepAR effects and Custom Canvas Overlays to Android live streams using Ant Media Server’s WebRTC SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Getting Started&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are two sample activities available in the companion GitHub repo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;DeepARActivity.java&lt;/code&gt; — for AR effects&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CustomCanvasActivity.java&lt;/code&gt; — for custom overlays&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 To get started:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the sample:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/USAMAWIZARD/AntMedia-DeepAR-And-Overlay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Build and run on your Android device.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start streaming with dynamic effects or branded overlays!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🪄 &lt;strong&gt;Section 1: DeepAR Activity — Augmented Reality for Live Streaming&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What is DeepAR?&lt;/p&gt;

&lt;p&gt;DeepAR is an AR SDK for real-time face tracking, filters, and visual effects. When integrated with the Ant Media Server SDK, you can stream AR-enhanced video with ultra-low latency to your viewers.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;How It Works&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The camera captures the video feed.&lt;/li&gt;
&lt;li&gt;Frames pass through the DeepAR SDK.&lt;/li&gt;
&lt;li&gt;DeepAR applies selected AR effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Processed frames are sent via WebRTC to the Ant Media Server and streamed live to viewers.&lt;/p&gt;

&lt;p&gt;Example effects include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viking helmets&lt;/li&gt;
&lt;li&gt;Neon devil horns&lt;/li&gt;
&lt;li&gt;Playful AR elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*&lt;em&gt;Code Snippet — Initialize DeepAR&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deepAR = new DeepAR(this);
deepAR.setLicenseKey("your-license-key");
deepAR.initialize(this, this);

initializeEffects();
setupCamera();
setupStreamingAndPreview();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;WebRTC Client Setup&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;webRTCClient = IWebRTCClient.builder()
    .setServerUrl("wss://test.antmedia.io/LiveApp/websocket")
    .setActivity(this)
    .setVideoSource(IWebRTCClient.StreamSource.CUSTOM)
    .setWebRTCListener(createWebRTCListener())
    .setInitiateBeforeStream(true)
    .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Camera Frame Processing&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -&amp;gt; {
    try {
        feedDeepAR(image);
    } finally {
        image.close();
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also cycle through effects with simple UI controls.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🎨 Section 2: Custom Canvas Activity — Branded Overlays&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
While AR effects are fun, sometimes streams need branding elements, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logos&lt;/li&gt;
&lt;li&gt;Watermarks&lt;/li&gt;
&lt;li&gt;Text captions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where Custom Canvas Overlays come in.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Built-in Overlay Types&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Image Overlay&lt;br&gt;
Use your own logo or branding graphic, positioned anywhere on the screen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Text Overlay&lt;br&gt;
Show custom text like titles or hashtags, with adjustable font size and color.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;How It Works&lt;/li&gt;
&lt;li&gt;CameraX captures frames.&lt;/li&gt;
&lt;li&gt;An OpenGL ES renderer composites overlays.&lt;/li&gt;
&lt;li&gt;Final frames are streamed via WebRTC.
*&lt;em&gt;Sample Overlay Setup
*&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;imageProxyRenderer = new ImageProxyRenderer(webRTCClient, this, surfaceView, new CanvasListener() {
    @Override
    public void onSurfaceInitialized() {
        // Image overlay
        logoOverlay = new Overlay(getApplicationContext(), R.drawable.test, 0.8f, 0.8f);
        logoOverlay.setSize(0.2f);

        // Text overlay
        textOverlay = new Overlay(getApplicationContext(), "Hello", 64, Color.RED, 0f, -0.3f);
        textOverlay.setSize(0.12f);
    }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;🚀 Why Ant Media Server?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Using WebRTC with Ant Media Server gives you:&lt;/p&gt;

&lt;p&gt;✔ Ultra-low latency streaming&lt;br&gt;
✔ Scalable streaming to thousands of viewers&lt;br&gt;
✔ Adaptive bitrate support&lt;br&gt;
✔ Cross-platform playback on any device or browser&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🏁 Wrap Up&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Whether you want fun AR effects or professional overlays, the Ant Media Android SDK gives you powerful tools to elevate your Android live streaming.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;👉 Clone the project and start experimenting!&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Would you like a formatted Markdown version with images and GitHub links ready for DEV.to (so it looks even better when published)? Just let me know!&lt;br&gt;
👉 Check the original tutorial here: &lt;a href="https://antmedia.io/deepar-and-custom-overlay-with-ant-media-android-sdk/" rel="noopener noreferrer"&gt;https://antmedia.io/deepar-and-custom-overlay-with-ant-media-android-sdk/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>livestreaming</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Build a WebRTC Streaming App in Flutter Using Ant Media SDK</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Wed, 04 Feb 2026 09:34:05 +0000</pubDate>
      <link>https://dev.to/antmedia_io/build-a-webrtc-streaming-app-in-flutter-using-ant-media-sdk-562p</link>
      <guid>https://dev.to/antmedia_io/build-a-webrtc-streaming-app-in-flutter-using-ant-media-sdk-562p</guid>
      <description>&lt;p&gt;WebRTC enables real-time, ultra-low latency audio and video streaming. While it’s widely used on the web, integrating WebRTC into Flutter applications can be challenging without the right tools.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through how to use the Ant Media WebRTC Flutter SDK to publish and play live streams in a Flutter app with minimal setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you’ll learn&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to create a Flutter project&lt;/li&gt;
&lt;li&gt;How to add Ant Media’s WebRTC Flutter SDK&lt;/li&gt;
&lt;li&gt;How to publish a live WebRTC stream&lt;/li&gt;
&lt;li&gt;How to play the stream in your app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Ant Media WebRTC Flutter SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-platform support (Web &amp;amp; Mobile)&lt;/li&gt;
&lt;li&gt;Ultra-low latency streaming&lt;/li&gt;
&lt;li&gt;Easy API integration&lt;/li&gt;
&lt;li&gt;Production-ready WebRTC infrastructure
Getting Started&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, create a Flutter project and make sure Flutter Web is enabled.&lt;/p&gt;

&lt;p&gt;Then add the SDK to your &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;dependencies:&lt;br&gt;
  ant_media_flutter: ^1.4.1&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;flutter pub get&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Publish a Stream&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Using the SDK, you can connect to Ant Media Server and start publishing a WebRTC stream by setting the connection type to Publish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Play a Stream&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To play the live stream, simply change the connection type to Play and run the app again.&lt;/p&gt;

&lt;p&gt;That’s it 🎉&lt;br&gt;
With just a few steps, you can build real-time video streaming applications such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live events&lt;/li&gt;
&lt;li&gt;Online education platforms&lt;/li&gt;
&lt;li&gt;Video conferencing apps&lt;/li&gt;
&lt;li&gt;Interactive streaming solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Full tutorial:&lt;br&gt;
&lt;a href="https://antmedia.io/webrtc-flutter-sdk/" rel="noopener noreferrer"&gt;https://antmedia.io/webrtc-flutter-sdk/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>webrtc</category>
      <category>livestreaming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Join the Ant Media AI Hackathon | Feb 25–28, 2026</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Fri, 16 Jan 2026 11:49:44 +0000</pubDate>
      <link>https://dev.to/antmedia_io/join-the-ant-media-ai-hackathon-feb-25-28-2026-d54</link>
      <guid>https://dev.to/antmedia_io/join-the-ant-media-ai-hackathon-feb-25-28-2026-d54</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/malti_thakur_fc70e73f4dde" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3566448%2Ff43902aa-5776-4e36-a6aa-418b591d0ecc.jpg" alt="malti_thakur_fc70e73f4dde"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/malti_thakur_fc70e73f4dde/ant-media-ai-hackathon-build-ai-powered-real-time-streaming-apps-2j5b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Ant Media AI Hackathon: Build AI-Powered Real-Time Streaming Apps&lt;/h2&gt;
      &lt;h3&gt;Malti Thakur ・ Jan 16&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hackathon&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#streaming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webrtc&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Fri, 16 Jan 2026 11:47:54 +0000</pubDate>
      <link>https://dev.to/malti_thakur_fc70e73f4dde/-bje</link>
      <guid>https://dev.to/malti_thakur_fc70e73f4dde/-bje</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/malti_thakur_fc70e73f4dde" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3566448%2Ff43902aa-5776-4e36-a6aa-418b591d0ecc.jpg" alt="malti_thakur_fc70e73f4dde"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/malti_thakur_fc70e73f4dde/ant-media-ai-hackathon-build-ai-powered-real-time-streaming-apps-2j5b" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Ant Media AI Hackathon: Build AI-Powered Real-Time Streaming Apps&lt;/h2&gt;
      &lt;h3&gt;Malti Thakur ・ Jan 16&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#hackathon&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#streaming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webrtc&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>hackathon</category>
      <category>ai</category>
      <category>streaming</category>
      <category>webrtc</category>
    </item>
    <item>
      <title>Ant Media AI Hackathon: Build AI-Powered Real-Time Streaming Apps</title>
      <dc:creator>Malti Thakur</dc:creator>
      <pubDate>Fri, 16 Jan 2026 10:58:38 +0000</pubDate>
      <link>https://dev.to/malti_thakur_fc70e73f4dde/ant-media-ai-hackathon-build-ai-powered-real-time-streaming-apps-2j5b</link>
      <guid>https://dev.to/malti_thakur_fc70e73f4dde/ant-media-ai-hackathon-build-ai-powered-real-time-streaming-apps-2j5b</guid>
      <description>&lt;p&gt;The Ant Media AI Hackathon is an online hackathon focused on building &lt;br&gt;
AI-powered real-time streaming solutions using Ant Media Server.&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%2Ftaeadgdrdgbppwxh78xo.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%2Ftaeadgdrdgbppwxh78xo.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;br&gt;
📅 Hackathon Dates: Feb 25–28, 2026&lt;br&gt;&lt;br&gt;
🗓 Registration Deadline: Jan 25, 2026&lt;br&gt;&lt;br&gt;
🏆 Prizes: $5,000 | $3,000 | $2,000&lt;br&gt;&lt;br&gt;
👥 Participation: Individuals or teams (up to 5 members)&lt;/p&gt;

&lt;p&gt;Participants can build projects such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Speech-to-text or translation for live streams&lt;/li&gt;
&lt;li&gt;Real-time video effects&lt;/li&gt;
&lt;li&gt;AI-driven media generation&lt;/li&gt;
&lt;li&gt;Detection, analytics, or AR/VR streaming features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Learn more and register here:&lt;br&gt;
&lt;a href="https://antmedia.io/ai-hackathon/" rel="noopener noreferrer"&gt;https://antmedia.io/ai-hackathon/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>ai</category>
      <category>streaming</category>
      <category>webrtc</category>
    </item>
  </channel>
</rss>
