{"id":842,"date":"2026-04-02T11:25:20","date_gmt":"2026-04-02T04:25:20","guid":{"rendered":"https:\/\/liveapi.com\/blog\/rtmp-server\/"},"modified":"2026-04-07T11:24:28","modified_gmt":"2026-04-07T04:24:28","slug":"rtmp-server","status":"publish","type":"post","link":"https:\/\/liveapi.com\/blog\/rtmp-server\/","title":{"rendered":"What Is an RTMP Server? How It Works, Setup, and Top Software Options"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>RTMP servers are the backbone of live streaming workflows worldwide. Despite being developed by Adobe in the early 2000s, RTMP remains the dominant ingest protocol for live video \u2014 used by OBS, Streamlabs, XSplit, Wirecast, and virtually every hardware encoder on the market.<\/p>\n<p>If you&#8217;re building a live streaming app or setting up a broadcast pipeline, you need to understand what an RTMP server does, how to run one, and when a self-hosted server makes sense versus a managed alternative.<\/p>\n<p>This guide covers what an RTMP server is, how the protocol works, the best open-source and commercial software options, a step-by-step setup guide using nginx-rtmp, and a protocol comparison to help you decide what&#8217;s right for your project.<\/p>\n<h2>What Is an RTMP Server?<\/h2>\n<p>An RTMP server is a media server that receives, processes, and distributes live video streams using the <a href=\"https:\/\/liveapi.com\/blog\/what-is-rtmp\/\" target=\"_blank\" rel=\"noopener\">Real-Time Messaging Protocol<\/a>. It acts as the central hub in a live streaming pipeline: encoders push video to the server, and the server relays that stream to viewers \u2014 either directly or through a CDN.<\/p>\n<p>RTMP was originally developed by Macromedia (later acquired by Adobe) and runs over TCP on <a href=\"https:\/\/rtmp.veriskope.com\/docs\/spec\/\" target=\"_blank\" rel=\"nofollow noopener\">port 1935<\/a>. The protocol splits audio and video data into small chunks \u2014 128 bytes for video, 64 bytes for audio \u2014 and sends them in an interleaved stream. This chunk-based design keeps latency low, typically in the 2\u20135 second range.<\/p>\n<p>Every time a streamer goes live on YouTube, Twitch, or Facebook using OBS, the encoder sends an RTMP stream to that platform&#8217;s RTMP server. The server then transcodes and packages the stream for delivery to viewers.<\/p>\n<p>If you&#8217;re building your own streaming platform, you need your own RTMP server to receive those inbound streams before delivering them to your audience.<\/p>\n<h3>Key RTMP Server Functions<\/h3>\n<ul>\n<li><strong>Ingest:<\/strong> Accept incoming streams from encoders over TCP port 1935<\/li>\n<li><strong>Authentication:<\/strong> Validate stream keys to authorize broadcasters<\/li>\n<li><strong>Transcoding:<\/strong> Convert the raw stream into delivery formats (typically HLS)<\/li>\n<li><strong>Packaging:<\/strong> Split the stream into segments for adaptive bitrate playback<\/li>\n<li><strong>Distribution:<\/strong> Push the packaged stream to a CDN or directly to players<\/li>\n<\/ul>\n<h2>How Does an RTMP Server Work?<\/h2>\n<p>Understanding the flow from encoder to viewer helps clarify where the RTMP server fits \u2014 and what happens when something goes wrong.<\/p>\n<h3>1. The Encoder Connects<\/h3>\n<p>The broadcaster&#8217;s encoder (OBS, hardware encoder, or software SDK) opens a TCP connection to the RTMP server using the server&#8217;s IP address or hostname, port 1935, and a stream key. The stream key authenticates the broadcast and routes it to the correct channel.<\/p>\n<h3>2. The Three-Way Handshake<\/h3>\n<p>RTMP uses a specific handshake sequence before streaming begins. The encoder sends an initial 1,537-byte handshake packet, the server responds with its own, and both sides confirm the connection. This takes under one second under normal network conditions.<\/p>\n<h3>3. Video and Audio Chunks Arrive<\/h3>\n<p>Once connected, the encoder sends audio and video in separate chunk streams. The server receives these chunks and reassembles them into a continuous stream. Video is typically encoded as H.264; audio as AAC. The server maintains the chunk stream and handles any packet reordering.<\/p>\n<h3>4. Transcoding and Packaging<\/h3>\n<p>Most RTMP servers don&#8217;t just relay the raw stream \u2014 they transcode it. <a href=\"https:\/\/liveapi.com\/blog\/what-is-video-encoding\/\" target=\"_blank\" rel=\"noopener\">Video encoding<\/a> converts the incoming stream into one or more output formats, usually HLS, and generates multiple quality renditions for <a href=\"https:\/\/liveapi.com\/blog\/adaptive-bitrate-streaming\/\" target=\"_blank\" rel=\"noopener\">adaptive bitrate streaming<\/a>. This lets viewers on different devices and connection speeds watch the same stream without buffering.<\/p>\n<h3>5. Delivery to Viewers<\/h3>\n<p>The processed stream goes to a delivery layer \u2014 either directly served to video players or pushed to a <a href=\"https:\/\/liveapi.com\/blog\/cdn-for-live-streaming\/\" target=\"_blank\" rel=\"noopener\">CDN for live streaming<\/a> that distributes it globally. The CDN caches the stream segments and serves them from edge locations close to each viewer.<\/p>\n<h2>Types of RTMP Server Software<\/h2>\n<p>RTMP server software falls into two categories: self-hosted open-source options and managed or commercial media servers. Each has different tradeoffs in cost, complexity, and scalability.<\/p>\n<h3>Open-Source RTMP Servers<\/h3>\n<p><strong>nginx-rtmp<\/strong><\/p>\n<p>The nginx RTMP module (nginx-rtmp-module) is the most widely used open-source RTMP server. It turns an nginx web server into an RTMP ingest point with HLS output. It&#8217;s lightweight, well-documented, and free \u2014 but it requires manual setup, and transcoding requires an additional ffmpeg integration.<\/p>\n<p><strong>SRS (Simple Realtime Server)<\/strong><\/p>\n<p>SRS is a high-performance open-source media server written in C++. It supports RTMP, HLS, WebRTC, and SRT out of the box. SRS handles higher concurrent streams than nginx-rtmp and includes built-in HTTP API for stream management \u2014 but it has a steeper learning curve.<\/p>\n<p><strong>Ant Media Server<\/strong><\/p>\n<p>Ant Media Server is available as both a free community edition and a commercial product. It supports RTMP, WebRTC, HLS, and DASH with a web management UI, making it easier to operate than nginx-rtmp. The community edition handles most production use cases.<\/p>\n<p><strong>Red5<\/strong><\/p>\n<p>Red5 is a Java-based open-source RTMP server, one of the oldest in the ecosystem. It supports RTMP, RTMPS, and RTMPT but runs heavier than nginx-based options and requires Java. It&#8217;s better suited for legacy applications than new builds.<\/p>\n<h3>Commercial and Managed RTMP Servers<\/h3>\n<p>Commercial options include Wowza Streaming Engine (a self-hosted Java media server) and cloud services like AWS MediaLive, Mux, and LiveAPI. These remove infrastructure management entirely \u2014 you get an RTMP ingest endpoint, and the platform handles transcoding, CDN delivery, and scaling.<\/p>\n<table>\n<thead>\n<tr>\n<th>Software<\/th>\n<th>Type<\/th>\n<th>Protocols<\/th>\n<th>Est. Latency<\/th>\n<th>Scalability<\/th>\n<th>Cost<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>nginx-rtmp<\/td>\n<td>Self-hosted<\/td>\n<td>RTMP, HLS<\/td>\n<td>3\u201310s<\/td>\n<td>Manual<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>SRS<\/td>\n<td>Self-hosted<\/td>\n<td>RTMP, HLS, WebRTC, SRT<\/td>\n<td>1\u20135s<\/td>\n<td>High<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>Ant Media Server<\/td>\n<td>Self-hosted \/ Cloud<\/td>\n<td>RTMP, WebRTC, HLS, SRT<\/td>\n<td>0.5\u20135s<\/td>\n<td>High<\/td>\n<td>Free \/ Paid<\/td>\n<\/tr>\n<tr>\n<td>Red5<\/td>\n<td>Self-hosted<\/td>\n<td>RTMP, RTMPS<\/td>\n<td>2\u20135s<\/td>\n<td>Medium<\/td>\n<td>Free<\/td>\n<\/tr>\n<tr>\n<td>Wowza Streaming Engine<\/td>\n<td>Self-hosted \/ Cloud<\/td>\n<td>RTMP, HLS, WebRTC<\/td>\n<td>1\u20135s<\/td>\n<td>High<\/td>\n<td>Paid<\/td>\n<\/tr>\n<tr>\n<td>LiveAPI<\/td>\n<td>Managed<\/td>\n<td>RTMP, SRT, HLS<\/td>\n<td>Low<\/td>\n<td>Automatic<\/td>\n<td>Pay-as-you-go<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>RTMP vs. Other Streaming Protocols<\/h2>\n<p>RTMP isn&#8217;t the only option for live streaming ingest or delivery. Here&#8217;s how it compares to the most common alternatives \u2014 and why most pipelines actually use multiple protocols together.<\/p>\n<table>\n<thead>\n<tr>\n<th>Protocol<\/th>\n<th>Primary Use<\/th>\n<th>Latency<\/th>\n<th>Transport<\/th>\n<th>Browser Support<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>RTMP<\/td>\n<td>Live ingest<\/td>\n<td>2\u20135s<\/td>\n<td>TCP<\/td>\n<td>No (native)<\/td>\n<\/tr>\n<tr>\n<td>HLS<\/td>\n<td>Viewer delivery<\/td>\n<td>6\u201330s (standard)<\/td>\n<td>HTTP<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>SRT<\/td>\n<td>Ingest over unreliable networks<\/td>\n<td>1\u20134s<\/td>\n<td>UDP<\/td>\n<td>No<\/td>\n<\/tr>\n<tr>\n<td>WebRTC<\/td>\n<td>Real-time interactive video<\/td>\n<td>&lt;500ms<\/td>\n<td>UDP<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>RTSP<\/td>\n<td>IP cameras, surveillance<\/td>\n<td>1\u20132s<\/td>\n<td>TCP\/UDP<\/td>\n<td>No<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>RTMP vs HLS:<\/strong> These protocols handle different parts of the pipeline. RTMP is for getting video *into* a server (ingest); <a href=\"https:\/\/liveapi.com\/blog\/what-is-hls-streaming\/\" target=\"_blank\" rel=\"noopener\">HLS streaming<\/a> is for getting video *out* to viewers. Most live streaming pipelines use both \u2014 RTMP in, HLS out. You can read more about <a href=\"https:\/\/liveapi.com\/blog\/what-is-hls\/\" target=\"_blank\" rel=\"noopener\">what HLS is<\/a> and how it differs architecturally.<\/p>\n<p><strong>RTMP vs SRT:<\/strong> <a href=\"https:\/\/liveapi.com\/blog\/srt-vs-rtmp\/\" target=\"_blank\" rel=\"noopener\">SRT vs RTMP<\/a> is the most relevant ingest comparison. SRT is a newer UDP-based protocol designed for unreliable networks \u2014 cross-continent contribution links, cellular connections, or satellite uplinks. RTMP is more widely supported by encoders. SRT wins on network resilience; RTMP wins on compatibility.<\/p>\n<p><strong>RTMP vs WebRTC:<\/strong> <a href=\"https:\/\/liveapi.com\/blog\/what-is-webrtc\/\" target=\"_blank\" rel=\"noopener\">WebRTC<\/a> targets sub-500ms latency for real-time communication. It&#8217;s built for video calls, interactive broadcasts, and live auctions. RTMP is better suited for broadcast-style streams where encoder compatibility matters more than sub-second latency.<\/p>\n<p><strong>RTMP vs RTSP:<\/strong> <a href=\"https:\/\/liveapi.com\/blog\/what-is-real-time-streaming-protocol\/\" target=\"_blank\" rel=\"noopener\">RTSP<\/a> is mainly used for IP cameras and surveillance systems. It controls media playback rather than delivering streams to large audiences. The two protocols overlap at the ingest layer for camera feeds but serve different use cases.<\/p>\n<h2>Hardware Requirements for an RTMP Server<\/h2>\n<p>Self-hosting an RTMP server requires the right infrastructure. Requirements depend on concurrent stream count and whether you&#8217;re transcoding.<\/p>\n<p><strong>RTMP ingest only (no transcoding):<\/strong><\/p>\n<ul>\n<li>CPU: 2 cores<\/li>\n<li>RAM: 2 GB<\/li>\n<li>Bandwidth: 10 Mbps per 1080p stream ingest<\/li>\n<\/ul>\n<p><strong>RTMP ingest with transcoding (nginx + ffmpeg, H.264 to HLS):<\/strong><\/p>\n<ul>\n<li>CPU: 4+ cores per concurrent transcoded stream<\/li>\n<li>RAM: 4\u20138 GB<\/li>\n<li>Bandwidth: 20\u201350 Mbps per stream (input + multiple HLS output renditions)<\/li>\n<li>Storage: Fast SSD for HLS segment buffering (\u2265100 GB recommended for live DVR)<\/li>\n<\/ul>\n<p>A 4-core, 8 GB cloud VPS handles 3\u20135 concurrent transcoded streams. For more concurrent streams, you&#8217;ll need to scale horizontally \u2014 running multiple transcoding nodes behind a load balancer. This is where self-hosting complexity grows quickly. Good <a href=\"https:\/\/liveapi.com\/blog\/best-video-streaming-servers\/\" target=\"_blank\" rel=\"noopener\">video streaming server<\/a> resources go deeper on sizing decisions.<\/p>\n<h2>How to Set Up an RTMP Server with nginx-rtmp<\/h2>\n<p>This setup runs nginx with the RTMP module on Ubuntu 22.04 LTS. It creates an RTMP ingest endpoint and outputs HLS for browser playback \u2014 the foundation of most self-hosted <a href=\"https:\/\/liveapi.com\/blog\/live-streaming-setup\/\" target=\"_blank\" rel=\"noopener\">live streaming setups<\/a>.<\/p>\n<h3>Prerequisites<\/h3>\n<ul>\n<li>Ubuntu 22.04 VPS (4 CPU, 4 GB RAM recommended)<\/li>\n<li>Root or sudo access<\/li>\n<li>Port 1935 open in your firewall<\/li>\n<\/ul>\n<h3>Step 1: Install nginx with the RTMP Module<\/h3>\n<pre><code class=\"language-bash\">sudo apt update<\/code><\/pre>\n<p>sudo apt install -y nginx libnginx-mod-rtmp<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h3>Step 2: Configure nginx<\/h3>\n<p>Open the nginx configuration file:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/nginx.conf\r\n<\/code><\/pre>\n<p>Add the RTMP block at the end of the file, outside the `http {}` block:<\/p>\n<pre><code class=\"language-nginx\">rtmp {<\/code><\/pre>\n<p>server {<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>listen 1935;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>chunk_size 4096;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>application live {<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>live on;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>record off;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p># Output HLS<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>hls on;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>hls_path \/var\/www\/html\/hls;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>hls_fragment 3;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>hls_playlist_length 60;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>Then update the `http` server block to serve HLS segments to players:<\/p>\n<pre><code class=\"language-nginx\">server {<\/code><\/pre>\n<p>listen 80;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>location \/hls {<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>types {<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>application\/vnd.apple.mpegurl m3u8;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>video\/mp2t ts;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>root \/var\/www\/html;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>add_header Cache-Control no-cache;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>add_header Access-Control-Allow-Origin *;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>}<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-nginx\"><\/code><\/pre>\n<h3>Step 3: Create the HLS Output Directory<\/h3>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\/html\/hls<\/code><\/pre>\n<p>sudo chown www-data:www-data \/var\/www\/html\/hls<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h3>Step 4: Open the Firewall<\/h3>\n<pre><code class=\"language-bash\">sudo ufw allow 1935\/tcp<\/code><\/pre>\n<p>sudo ufw allow 80\/tcp<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>sudo ufw reload<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h3>Step 5: Restart nginx<\/h3>\n<pre><code class=\"language-bash\">sudo systemctl restart nginx<\/code><\/pre>\n<p>sudo systemctl status nginx<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-bash\"><\/code><\/pre>\n<h3>Step 6: Configure Your Encoder<\/h3>\n<p>In OBS or any RTMP encoder, set:<\/p>\n<ul>\n<li><strong>Server:<\/strong> `rtmp:\/\/YOUR_SERVER_IP\/live`<\/li>\n<li><strong>Stream Key:<\/strong> any string (e.g., `mystream`)<\/li>\n<\/ul>\n<p>Your HLS output will be available at:<\/p>\n<pre><code class=\"language-\">http:\/\/YOUR_SERVER_IP\/hls\/mystream.m3u8\r\n<\/code><\/pre>\n<p>This URL works in any <a href=\"https:\/\/liveapi.com\/blog\/video-player-api\/\" target=\"_blank\" rel=\"noopener\">HLS-compatible video player<\/a>, including native iOS\/macOS playback and browser-based players with HLS.js.<\/p>\n<hr \/>\n<p>This setup handles <a href=\"https:\/\/liveapi.com\/blog\/live-rtmp-stream\/\" target=\"_blank\" rel=\"noopener\">live RTMP streams<\/a> for development and small-scale use. For larger deployments, you&#8217;ll need to handle transcoding with ffmpeg (for multiple quality renditions), add stream key authentication, configure HTTPS for RTMPS, and integrate a CDN separately.<\/p>\n<hr \/>\n<p>That added infrastructure work is what separates self-hosted RTMP from managed alternatives. Before deciding which path to take, it&#8217;s worth comparing the two approaches across the dimensions that actually matter for your project.<\/p>\n<h2>Self-Hosted vs. Managed RTMP Server<\/h2>\n<table>\n<thead>\n<tr>\n<th>Factor<\/th>\n<th>Self-Hosted (nginx-rtmp, SRS)<\/th>\n<th>Managed (LiveAPI)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Setup time<\/td>\n<td>Hours to days<\/td>\n<td>Minutes<\/td>\n<\/tr>\n<tr>\n<td>Infrastructure cost<\/td>\n<td>VPS + bandwidth fees<\/td>\n<td>Per-minute usage<\/td>\n<\/tr>\n<tr>\n<td>Scalability<\/td>\n<td>Manual (add nodes)<\/td>\n<td>Automatic<\/td>\n<\/tr>\n<tr>\n<td>CDN integration<\/td>\n<td>Manual configuration<\/td>\n<td>Built-in<\/td>\n<\/tr>\n<tr>\n<td>Transcoding<\/td>\n<td>Manual (ffmpeg setup)<\/td>\n<td>Built-in<\/td>\n<\/tr>\n<tr>\n<td>RTMPS \/ TLS<\/td>\n<td>Manual cert setup<\/td>\n<td>Built-in<\/td>\n<\/tr>\n<tr>\n<td>Stream monitoring<\/td>\n<td>Manual (logs, dashboards)<\/td>\n<td>Built-in analytics<\/td>\n<\/tr>\n<tr>\n<td>VOD from live<\/td>\n<td>Custom recording logic<\/td>\n<td>Automatic<\/td>\n<\/tr>\n<tr>\n<td>Best for<\/td>\n<td>Full control, DevOps bandwidth<\/td>\n<td>Speed, scale, reliability<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Choose self-hosted if:<\/strong> You have the DevOps resources to manage servers, you&#8217;re streaming at high enough volume that per-minute pricing exceeds VPS costs, or you need on-premises deployment for compliance.<\/p>\n<p><strong>Choose managed if:<\/strong> You&#8217;re building a product and need to ship fast, you need global CDN delivery, or you&#8217;d rather not maintain streaming infrastructure as your core competency.<\/p>\n<h2>Using a Managed RTMP Server with LiveAPI<\/h2>\n<p>Managed platforms like <a href=\"https:\/\/liveapi.com\/live-streaming-api\/\" target=\"_blank\" rel=\"noopener\">LiveAPI&#8217;s live streaming API<\/a> handle RTMP ingest, transcoding, CDN delivery, and VOD recording without running any server infrastructure on your end.<\/p>\n<p>You get a dedicated RTMP ingest endpoint (plus SRT support), automatic transcoding to HLS with adaptive bitrate output, delivery through CDN partners including Akamai, Cloudflare, and Fastly, and an embeddable player. The entire pipeline is ready in minutes.<\/p>\n<p>The integration looks like this:<\/p>\n<pre><code class=\"language-javascript\">const sdk = require('api')('@liveapi\/v1.0#5pfjhgkzh9rzt4');<\/code><\/pre>\n<p>sdk.post(&#8216;\/live-streams&#8217;, {<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>name: &#8216;My Live Event&#8217;,<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>record: true<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>})<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>.then(({ data }) =&gt; {<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>console.log(&#8216;RTMP URL:&#8217;, data.rtmpUrl);<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>console.log(&#8216;Stream Key:&#8217;, data.streamKey);<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>});<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>&nbsp;<\/p>\n<pre><code class=\"language-javascript\"><\/code><\/pre>\n<p>Once you have the RTMP URL and stream key, point OBS (or any encoder) at those credentials and you&#8217;re live. LiveAPI handles the rest: transcoding, packaging, CDN distribution, and automatic VOD creation when the stream ends.<\/p>\n<p>For teams that want to <a href=\"https:\/\/liveapi.com\/blog\/stream-to-multiple-platforms\/\" target=\"_blank\" rel=\"noopener\">stream to multiple platforms<\/a> at the same time, the multistream API rebroadcasts to 30+ destinations from a single ingest \u2014 no separate encoder configurations needed.<\/p>\n<h2>Is RTMP Server Right for Your Project?<\/h2>\n<p>RTMP ingest is still the right choice for most live streaming pipelines. Nearly every encoder \u2014 software or hardware \u2014 supports RTMP. If your use case involves any of the following, you need RTMP ingest:<\/p>\n<ul>\n<li>Receiving streams from OBS, Wirecast, or hardware encoders<\/li>\n<li>Broadcasting to a custom OTT or streaming platform<\/li>\n<li>Accepting streams from IP cameras or other RTSP\/RTMP sources<\/li>\n<li>Building a <a href=\"https:\/\/liveapi.com\/blog\/live-video-streaming-platform\/\" target=\"_blank\" rel=\"noopener\">live video streaming platform<\/a> that needs broad encoder compatibility<\/li>\n<\/ul>\n<p>RTMP is <strong>not<\/strong> the right choice if:<\/p>\n<ul>\n<li>You need under 500ms latency \u2014 use WebRTC instead<\/li>\n<li>You&#8217;re streaming over satellite or unreliable cellular links \u2014 SRT handles packet loss better<\/li>\n<li>You only need to deliver existing video files \u2014 RTMP is a live ingest protocol, not for VOD<\/li>\n<\/ul>\n<p>For the viewer-facing delivery layer, RTMP is almost never the answer. Browsers don&#8217;t support RTMP natively, so the standard approach is always RTMP in, HLS out.<\/p>\n<h2>RTMP Server FAQ<\/h2>\n<p><strong>What is an RTMP server?<\/strong><\/p>\n<p>An RTMP server is a media server that receives live video streams from encoders using the Real-Time Messaging Protocol, processes or transcodes the stream, and delivers it to viewers. It&#8217;s the ingest layer in a live streaming pipeline, sitting between the broadcaster&#8217;s encoder and the CDN that serves content to viewers.<\/p>\n<p><strong>What port does an RTMP server use?<\/strong><\/p>\n<p>RTMP uses TCP port 1935 by default. RTMPS (RTMP over TLS) runs on port 443 \u2014 the same as HTTPS \u2014 which is useful when port 1935 is blocked by firewalls. RTMPT (RTMP tunneled over HTTP) can also use port 80 or 443 as a fallback.<\/p>\n<p><strong>Is RTMP still relevant?<\/strong><\/p>\n<p>Yes. RTMP remains the standard ingest protocol for live streaming. Flash Player (which originally required RTMP for browser playback) is long gone, but RTMP&#8217;s role as a low-latency encoder-to-server transport protocol is unchanged. Virtually every live streaming workflow today \u2014 YouTube, Twitch, Facebook, Kick \u2014 still accepts RTMP ingest.<\/p>\n<p><strong>What is the difference between RTMP and RTMPS?<\/strong><\/p>\n<p>RTMPS is RTMP encrypted with TLS. It prevents interception of the stream between the encoder and server and runs on port 443. Most major platforms \u2014 including YouTube, Facebook, and Twitch \u2014 now require RTMPS. When building your own RTMP server, you&#8217;ll need a valid TLS certificate and nginx or Stunnel configured to handle RTMPS termination.<\/p>\n<p><strong>Can you run an RTMP server on Windows?<\/strong><\/p>\n<p>Yes. Ant Media Server, Red5, and Wowza Streaming Engine all run natively on Windows. nginx-rtmp is Linux-primary but runs on Windows via WSL (Windows Subsystem for Linux). For local development on Windows, a <a href=\"https:\/\/liveapi.com\/blog\/nodejs-video-streaming-server\/\" target=\"_blank\" rel=\"noopener\">Node.js video streaming server<\/a> can also handle RTMP ingestion as a lighter alternative.<\/p>\n<p><strong>How many concurrent streams can an RTMP server handle?<\/strong><\/p>\n<p>It depends on hardware, transcoding load, and bandwidth. A 4-core VPS running nginx-rtmp (ingest relay only, no transcoding) can handle 30\u201350 concurrent streams. Add transcoding and that drops to 3\u20135 streams per 4-core server. Managed platforms handle unlimited concurrent streams through automatic horizontal scaling.<\/p>\n<p><strong>What&#8217;s the latency of an RTMP server?<\/strong><\/p>\n<p>End-to-end RTMP latency \u2014 from encoder to viewer \u2014 is typically 3\u201315 seconds. The protocol itself adds 1\u20132 seconds; transcoding and HLS packaging add the rest. Reducing chunk sizes and HLS segment lengths can get you to the 2\u20134 second range. For true sub-second latency, you&#8217;d need WebRTC or CMAF with chunked transfer encoding.<\/p>\n<p><strong>What&#8217;s the difference between RTMP ingest and RTMP delivery?<\/strong><\/p>\n<p>RTMP ingest means the encoder sends video *to* the RTMP server over port 1935. RTMP delivery (pushing the processed stream to viewers) was common in the Flash era but is now rare since browsers don&#8217;t support it natively. Modern pipelines use RTMP ingest and HLS delivery \u2014 the server converts the incoming RTMP stream to HLS for viewer playback.<\/p>\n<h2>Getting Started with Live Streaming<\/h2>\n<p>An RTMP server is the entry point for any live streaming pipeline. Whether you run your own nginx-rtmp instance on a VPS or use a managed platform, the fundamentals are the same: your encoder pushes video to the server, the server transcodes and packages it, and a CDN delivers it to viewers.<\/p>\n<p>For developers building a streaming app, a managed RTMP server removes the infrastructure work and gets you live faster \u2014 no server provisioning, transcoding pipelines, or CDN configuration required.<\/p>\n<p><a href=\"https:\/\/liveapi.com\/\" target=\"_blank\" rel=\"noopener\">Get started with LiveAPI<\/a> to set up RTMP ingest, transcoding, and global CDN delivery with a few lines of code.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\">10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span> RTMP servers are the backbone of live streaming workflows worldwide. Despite being developed by Adobe in the early 2000s, RTMP remains the dominant ingest protocol for live video \u2014 used by OBS, Streamlabs, XSplit, Wirecast, and virtually every hardware encoder on the market. If you&#8217;re building a live streaming app or setting up a broadcast [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":895,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_title":"RTMP Server: What It Is, How It Works, and How to Set One Up %%sep%% %%sitename%%","_yoast_wpseo_metadesc":"Learn what an RTMP server is, how it works, and the best software options. Includes a step-by-step nginx RTMP setup guide and managed alternatives.","inline_featured_image":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-842","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rtmp"],"jetpack_featured_media_url":"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/04\/RTMP-Encoder.jpg","yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v15.6.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<meta name=\"description\" content=\"Learn what an RTMP server is, how it works, and the best software options. Includes a step-by-step nginx RTMP setup guide and managed alternatives.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/liveapi.com\/blog\/rtmp-server\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RTMP Server: What It Is, How It Works, and How to Set One Up - LiveAPI Blog\" \/>\n<meta property=\"og:description\" content=\"Learn what an RTMP server is, how it works, and the best software options. Includes a step-by-step nginx RTMP setup guide and managed alternatives.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/liveapi.com\/blog\/rtmp-server\/\" \/>\n<meta property=\"og:site_name\" content=\"LiveAPI Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-02T04:25:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-07T04:24:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/04\/RTMP-Encoder.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2500\" \/>\n\t<meta property=\"og:image:height\" content=\"1308\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"13 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/liveapi.com\/blog\/#website\",\"url\":\"https:\/\/liveapi.com\/blog\/\",\"name\":\"LiveAPI Blog\",\"description\":\"Live Video Streaming API Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/liveapi.com\/blog\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/rtmp-server\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/liveapi.com\/blog\/wp-content\/uploads\/2026\/04\/RTMP-Encoder.jpg\",\"width\":2500,\"height\":1308,\"caption\":\"RTMP\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/liveapi.com\/blog\/rtmp-server\/#webpage\",\"url\":\"https:\/\/liveapi.com\/blog\/rtmp-server\/\",\"name\":\"RTMP Server: What It Is, How It Works, and How to Set One Up - LiveAPI Blog\",\"isPartOf\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/liveapi.com\/blog\/rtmp-server\/#primaryimage\"},\"datePublished\":\"2026-04-02T04:25:20+00:00\",\"dateModified\":\"2026-04-07T04:24:28+00:00\",\"author\":{\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\"},\"description\":\"Learn what an RTMP server is, how it works, and the best software options. Includes a step-by-step nginx RTMP setup guide and managed alternatives.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/liveapi.com\/blog\/rtmp-server\/\"]}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/liveapi.com\/blog\/#\/schema\/person\/98f2ee8b3a0bd93351c0d9e8ce490e4a\",\"name\":\"govz\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/liveapi.com\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ab5cbe0543c0a44dc944c720159323bd001fc39a8ba5b1f137cd22e7578e84c9?s=96&d=mm&r=g\",\"caption\":\"govz\"},\"sameAs\":[\"https:\/\/liveapi.com\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/842","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/comments?post=842"}],"version-history":[{"count":2,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/842\/revisions"}],"predecessor-version":[{"id":845,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/posts\/842\/revisions\/845"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media\/895"}],"wp:attachment":[{"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/media?parent=842"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/categories?post=842"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/liveapi.com\/blog\/wp-json\/wp\/v2\/tags?post=842"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}