Build Streaming App React Native: Step-by-Step Video Server Tutorial for Broadcasters

Want your own mobile streaming app for radio, podcasts, church services, school stations, or live events—without paying Wowza-style expensive per-hour/per-viewer billing? In this guide, you’ll build a React Native streaming app that plays a live video (or audio) stream from Shoutcast Net using a flat-rate, unlimited model designed for broadcasters.

You’ll learn how to create a streaming server, grab the stream URL, connect it to React Native, display Now Playing metadata, and add AutoDJ fallback so your stream stays online with 99.9% uptime.

  • Best for: radio DJs, music streamers, podcasters, church broadcasters, school radio stations, live event streamers
  • What you get: SSL streaming, unlimited listeners, reliable delivery, and the ability to stream from any device to any device

Quick note on “Shoutcast” vs modern streaming

Legacy Shoutcast setups are often audio-only and can be limiting when you need modern video workflows, low latency, and cross-platform delivery. Shoutcast Net’s hosting focuses on broadcaster-friendly infrastructure and a flat rate—without Wowza’s meter running every time a viewer hits play.

Goal: build once, publish your app, and scale with unlimited listeners.

What You’ll Build (React Native + Shoutcast Net Video Server)

By the end of this tutorial you’ll have a React Native app that:

  • Plays your live stream using a stable HTTPS (SSL) stream URL
  • Shows a simple Now Playing / program info panel (great for DJs and stations)
  • Handles common “broadcaster reality” needs like fallback content via AutoDJ
  • Is ready to grow with unlimited listeners on a flat-rate plan (starting at $4/month)

Architecture (simple and broadcaster-friendly)

Your setup will look like this:

  • Encoder (OBS, vMix, Wirecast, mobile encoder) sends your live feed to your server
  • Shoutcast Net Video Server distributes the stream globally with SSL, reliability, and scale
  • React Native app plays the stream and displays metadata / program info

Why broadcasters prefer Shoutcast Net’s flat-rate model

If you’ve looked at Wowza, you’ve probably seen the catch: expensive per-hour/per-viewer billing can balloon costs as your audience grows. Shoutcast Net is built for real-world broadcasting with predictable pricing and a platform that’s designed to stream from any device to any device.

You also get modern flexibility for production workflows: any stream protocols to any stream protocols (RTMP, RTSP, WebRTC, SRT, etc), plus options to Restream to Facebook, Twitch, YouTube when you want multi-platform reach.

Pro Tip

If you’re building for events, church services, or sports, aim for very low latency 3 sec delivery where possible—your viewers will feel the difference when chat, announcements, and real-time moments sync up.

Step 1: Create Your Shoutcast Net Server (7-day free trial, from $4/mo)

First, you’ll create the streaming server your app will connect to. Shoutcast Net plans start at $4/month and include features broadcasters actually need: SSL streaming, unlimited listeners, and a platform designed for reliability.

1) Start the 7-day free trial

Open the free trial page and create your account:

  • Go to 7 days trial (free trial signup)
  • Choose the server type that matches your broadcast needs (audio or video)
  • Complete checkout (trial) and wait for your server details

2) Choose the right hosting option

If you’re primarily doing radio/music/podcasts, standard Shoutcast hosting is ideal. If you want to do video streaming (church services, events, live DJ sets), choose a video-capable plan from the shop.

Use case Recommended Why it fits
24/7 music radio with metadata Shoutcast hosting Station-style streaming, easy player links, predictable cost
Podcast “live room” streams Shoutcast hosting + metadata Stable delivery and clear Now Playing updates
Church services / school events / live video Video streaming plans Video delivery + options for low latency and restreaming
Need Icecast compatibility Icecast hosting Compatible with Icecast workflows and tooling

3) Why Shoutcast Net over legacy Shoutcast and Wowza

Legacy Shoutcast setups can be restrictive for modern app builds (especially when you want video, advanced protocol support, or easier scaling). Meanwhile, Wowza’s model often turns growth into a cost problem with expensive per-hour/per-viewer billing. Shoutcast Net keeps it simple: flat-rate plans, broadcaster tooling, and scaling without surprise invoices.

Pro Tip

If your audience can spike during sermons, sports, or DJ raids, pick a plan built for growth—Shoutcast Net’s unlimited listeners and 99.9% uptime positioning helps you stay online when it matters most.

Step 2: Get Your Stream URL and Test Playback

Next, you’ll grab the stream URL your React Native app will play and confirm it works in a normal player before you write any code. This saves hours of debugging later.

1) Locate your stream endpoint

From your Shoutcast Net service details (welcome email or panel), find:

  • Hostname / IP
  • Port
  • Stream path (often /stream, /live, /hls.m3u8, etc.)
  • SSL URL (preferred for mobile apps)

For mobile apps, prefer HTTPS/SSL streaming URLs whenever possible. Mobile platforms are increasingly strict about non-HTTPS media.

2) Test playback in a desktop player first

Before connecting React Native, test your stream in a reliable player like VLC.

# VLC quick test
# Media → Open Network Stream → paste your SSL stream URL
# Example formats you might see:
https://YOUR-HOST:PORT/stream
https://YOUR-HOST:PORT/hls.m3u8

If VLC plays it, you’re in great shape. If not, fix the stream at the source (encoder config, credentials, path) before moving to the app.

3) Encoder notes (OBS example)

If you’re streaming video from OBS, you’ll typically push via RTMP/SRT (depending on your workflow), then your server outputs a playback format your app can consume. The key advantage with Shoutcast Net is flexibility: any stream protocols to any stream protocols (RTMP, RTSP, WebRTC, SRT, etc), so you can choose what’s best for your setup.

Pro Tip

If you plan to Restream to Facebook, Twitch, YouTube, confirm your outgoing destinations early. It’s easier to lock in resolution/bitrate once than change it after your audience bookmarks your channel.

Step 3: Create the React Native App Project

Now you’ll create a React Native project. The fastest path for most broadcasters is using Expo (simple setup, fast testing). If you already use bare React Native, you can still follow along—the player code is similar.

1) Install prerequisites

  • Node.js LTS
  • Git (optional but recommended)
  • Expo CLI (via npx)
  • Xcode (iOS) and/or Android Studio (Android) for device simulators

2) Create the project

# Create a new Expo app
npx create-expo-app shoutcastnet-streaming-app
cd shoutcastnet-streaming-app

# Start the dev server
npx expo start

At this point, you should see the default app running on a simulator or the Expo Go app on your phone.

3) Add a simple screen layout

Create a clean UI your listeners/viewers can use quickly: a header (station name), the player, and a Now Playing panel. In the next step, you’ll drop in the video player and connect the stream URL.

Pro Tip

Treat your app like a “station receiver.” Keep it simple and fast: big play/pause area, clear status text, and minimal taps. That’s how you get more session time—and fewer support messages.

Step 4: Add a Video Player and Connect the Stream

Now you’ll add a player component and connect your Shoutcast Net stream URL. For Expo-based projects, expo-av is a reliable starting point. If you need more advanced playback features later, you can switch to other libraries—but get the stream playing first.

1) Install expo-av

npx expo install expo-av

2) Add the player to App.js (or your screen)

Replace your App.js with a simple player screen. Paste your SSL stream URL where noted.

import React, { useMemo, useState } from "react";
import { SafeAreaView, View, Text, Pressable, StyleSheet } from "react-native";
import { Video, ResizeMode } from "expo-av";

export default function App() {
  // Replace with your Shoutcast Net playback URL (prefer HTTPS/SSL)
  const STREAM_URL = useMemo(() => "https://YOUR-HOST:PORT/hls.m3u8", []);

  const [statusText, setStatusText] = useState("Ready");
  const [shouldPlay, setShouldPlay] = useState(true);

  return (
    <SafeAreaView style={styles.container}>
      <Text style={styles.title}>My Station Live</Text>

      <View style={styles.playerWrap}>
        <Video
          style={styles.video}
          source={{ uri: STREAM_URL }}
          useNativeControls
          shouldPlay={shouldPlay}
          resizeMode={ResizeMode.CONTAIN}
          onError={(e) => setStatusText("Playback error. Check stream URL/SSL.")}
          onPlaybackStatusUpdate={(s) => {
            if (!s || !("isLoaded" in s)) return;
            if (!s.isLoaded) setStatusText("Loading...");
            else if (s.isBuffering) setStatusText("Buffering...");
            else if (s.isPlaying) setStatusText("Live");
            else setStatusText("Paused");
          }}
        />
      </View>

      <View style={styles.panel}>
        <Text style={styles.label}>Status: <Text style={styles.value}>{statusText}</Text></Text>
        <Pressable style={styles.btn} onPress={() => setShouldPlay((v) => !v)}>
          <Text style={styles.btnText}>{shouldPlay ? "Pause" : "Play"}</Text>
        </Pressable>
      </View>

      <Text style={styles.footer}>
        Built to stream from any device to any device.
      </Text>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: { flex: 1, backgroundColor: "#0b0f14", padding: 16 },
  title: { color: "#fff", fontSize: 22, fontWeight: "700", marginBottom: 12 },
  playerWrap: { borderRadius: 12, overflow: "hidden", borderWidth: 1, borderColor: "#2b2f36" },
  video: { width: "100%", height: 220, backgroundColor: "#000" },
  panel: { marginTop: 14, padding: 14, borderRadius: 12, backgroundColor: "#111827", borderWidth: 1, borderColor: "#2b2f36" },
  label: { color: "#cbd5e1", marginBottom: 10 },
  value: { color: "#fbbf24", fontWeight: "700" },
  btn: { backgroundColor: "#fbbf24", paddingVertical: 10, borderRadius: 10, alignItems: "center" },
  btnText: { color: "#111827", fontWeight: "800" },
  footer: { color: "#94a3b8", marginTop: 14, fontSize: 12 }
});

3) Latency and “live feel”

For interactive broadcasts (chat, Q&A, live auctions, shout-outs), aim for very low latency 3 sec where your workflow supports it. Lower latency typically requires specific protocol choices and tuning, but Shoutcast Net’s flexibility helps you adapt as your production grows.

4) Common playback pitfalls (and quick fixes)

  • Non-SSL URL: use HTTPS if available; mobile devices may block mixed content.
  • Wrong path: confirm the exact stream path (HLS playlist vs mount).
  • Geo/network restrictions: test on mobile data and Wi-Fi.
  • Encoder not live: start your encoder and verify in VLC first.

Pro Tip

If you’re migrating from a legacy Shoutcast workflow, keep your old stream running temporarily and roll out the new app in stages. That way, listeners don’t get stranded while you verify URLs, SSL, and app store builds.

Step 5: Show Now Playing / Program Info (Great for DJs & stations)

A streaming app feels “alive” when it shows the current show, DJ name, track title, or sermon series—especially for radio stations and DJs. This is also where Shoutcast-style broadcasting shines: metadata keeps listeners engaged and reduces “what am I listening to?” drop-offs.

1) Decide what you want to display

Start with a simple, reliable set:

  • Now Playing: Track / episode / service title
  • Host/DJ: optional but great for personality
  • Show time: “Live now” or schedule window
  • Stream status: Live / buffering / offline

2) Pull metadata from your server (typical pattern)

Most broadcasters use a small JSON endpoint (from the panel, a stats endpoint, or a lightweight middleware) that the app polls every 10–30 seconds. The exact URL varies by setup, so treat the snippet below as the client-side pattern.

// Example React hook pattern for "Now Playing" polling.
// Replace NOW_PLAYING_URL with your Shoutcast Net stats/metadata endpoint.

import { useEffect, useState } from "react";

export function useNowPlaying(NOW_PLAYING_URL) {
  const [nowPlaying, setNowPlaying] = useState({ title: "Loading...", artist: "", show: "" });

  useEffect(() => {
    let timer;

    async function fetchNowPlaying() {
      try {
        const res = await fetch(NOW_PLAYING_URL, { headers: { "Cache-Control": "no-cache" } });
        const data = await res.json();

        // Map server fields into your UI fields (adjust to your endpoint)
        setNowPlaying({
          title: data?.title || data?.now_playing?.title || "Live Stream",
          artist: data?.artist || data?.now_playing?.artist || "",
          show: data?.show || data?.program || ""
        });
      } catch (e) {
        // Keep last known metadata rather than blanking out
      }
    }

    fetchNowPlaying();
    timer = setInterval(fetchNowPlaying, 15000);

    return () => clearInterval(timer);
  }, [NOW_PLAYING_URL]);

  return nowPlaying;
}

3) Render the Now Playing panel in your app

Add a simple UI block under the player:

// Example UI snippet (inside your component)
const NOW_PLAYING_URL = "https://YOUR-HOST:PORT/now-playing.json";
const np = useNowPlaying(NOW_PLAYING_URL);

return (
  <View style={{ marginTop: 14, padding: 14, borderRadius: 12, backgroundColor: "#0f172a", borderWidth: 1, borderColor: "#2b2f36" }}>
    <Text style={{ color: "#cbd5e1", marginBottom: 6 }}>Now Playing</Text>
    <Text style={{ color: "#fff", fontSize: 16, fontWeight: "700" }}>{np.title}</Text>
    {!!np.artist && <Text style={{ color: "#94a3b8", marginTop: 4 }}>{np.artist}</Text>}
    {!!np.show && <Text style={{ color: "#fbbf24", marginTop: 8, fontWeight: "700" }}>{np.show}</Text>}
  </View>
);

4) Metadata workflows for broadcasters

How you update metadata depends on your format:

  • Live DJ sets: metadata from your playout software (title/artist) or manual “Now Playing” updates.
  • Church broadcasts: set program title per service (e.g., “Sunday Service – Week 12”).
  • School stations: show blocks (Morning announcements, sports, lunchtime mix).
  • Podcasters: “Live recording” + episode title for the session.

Pro Tip

Don’t over-poll metadata. A 10–30 second refresh interval feels real-time for listeners and keeps your app battery-friendly—especially during long sessions like services, assemblies, or festivals.

Step 6: Go Live, Add AutoDJ Fallback, and Keep 99.9% Uptime

A streaming app is only as good as its reliability. Broadcasters need a plan for encoder crashes, internet drops, and off-hours programming. This is where Shoutcast Net shines: 99.9% uptime, predictable flat-rate pricing, and features like AutoDJ so your station stays online.

1) Go live with your encoder

Start your encoder (OBS/vMix/Wirecast or hardware encoder) and confirm the stream is live in a desktop player. Then test in your app on:

  • Wi‑Fi
  • Mobile data (LTE/5G)
  • Another device (borrow a phone/tablet) to verify “real world” behavior

2) Add AutoDJ fallback for always-on streaming

If you’re running a station, the stream should never go silent. With AutoDJ, your server can automatically play scheduled content when you’re not live—or if your live encoder disconnects.

Enable and configure it here: AutoDJ. Typical broadcaster uses include:

  • Radio DJs: AutoDJ playlist overnight, live shows on schedule
  • Churches: AutoDJ plays music or past sermons when not live
  • Schools: scheduled announcements and playlists between live segments
  • Podcasters: loop trailers, best-of clips, or reruns between live rooms

3) Plan for scale: unlimited listeners and predictable cost

When a link goes viral or a community event spikes attendance, you don’t want to watch a billing dashboard. Wowza’s expensive per-hour/per-viewer billing can punish growth. Shoutcast Net’s approach is broadcaster-friendly: flat-rate plans, unlimited listeners, and predictable monthly pricing (starting at $4/month).

4) Security and trust: SSL streaming

Use SSL streaming URLs inside your app whenever possible. It improves compatibility (especially on iOS), reduces network blocks, and signals trust to listeners and app reviewers.

5) Multi-platform reach: restream while your app grows

Your React Native app should be your “home base,” but you can still expand discovery. Many broadcasters Restream to Facebook, Twitch, YouTube while promoting their app for the best listener experience and direct audience relationship.

Pro Tip

Build a “failure plan” before launch: enable AutoDJ fallback, keep a backup encoder profile, and store your stream URLs in remote config. That’s how you keep the stream online even when the unexpected happens.

Next steps (optional upgrades)

  • Add Chromecast / AirPlay buttons for living-room playback
  • Add push notifications for “Live Now” shows
  • Add a schedule screen and DJ profiles
  • Add a donation button (churches, schools, community stations)

Ready to launch?

Create your server, plug in your stream URL, and publish your app when you’re satisfied with playback and metadata. If you need a plan that scales without surprise costs, start here:

Whether you’re streaming music, sermons, announcements, or live events, Shoutcast Net helps you stream from any device to any device—reliably and on a flat rate.