Local Node.js Tool

HLS / DASH Converter

Convert your videos to HLS and DASH with the real FFmpeg installed on your own machine — everything stays on localhost, nothing gets uploaded anywhere.

Node.js 18+Express + MulterNo external upload~470 KB
Download source (.zip)

Free. After downloading: npm install && npm start

Concept

What are HLS and DASH?

HLS (HTTP Live Streaming) and DASH (Dynamic Adaptive Streaming over HTTP) are two standards for adaptive-quality video. Instead of one big file, the video is cut into a few-seconds-long segments at several quality levels, and a manifest file (.m3u8 for HLS, .mpd for DASH) tells the player where each segment is. The player picks — and switches — quality based on the viewer's connection speed, mid-playback.

HLS is Apple's format and plays natively in Safari/iOS (elsewhere via a library like hls.js); DASH is an open ISO/IEC standard, codec-agnostic, and powers players like YouTube's. This tool builds both from the same input video so you can compare them side by side.

Features

What the tool does

Drag and drop multiple videos at once — the server processes them one at a time, not in parallel.
Output HLS (.m3u8/.ts), DASH (.mpd/.m4s), or both — your choice.
A real ABR quality ladder, up to 4 renditions (1080p/720p/480p/360p); qualities above the source resolution are skipped automatically, no upscaling.
Segment duration (2–10s) and an x264 encode speed preset (ultrafast to medium) are both configurable.
"View demo" opens a real hls.js / dash.js player — exactly what an adaptive streaming player actually sees.
"Open folder" opens the output directly in File Explorer / Finder / your file manager.
Download a finished video's whole output as a single ZIP.
Live progress read straight from FFmpeg's own -progress output; a running job can be canceled.
The font (Vazirmatn) and both players (hls.js, dash.js) are bundled locally — nothing loads from a CDN.
Preview

The interface

The processing queue and output settings — what you'll see in the browser right after npm start.

The processing queue and output settings — what you'll see in the browser right after npm start.

Prerequisites

What you need before running it

Node.js 18 or newer

Install it from nodejs.org. Without it, even npm install won't run.

FFmpeg

The actual encoder. The app looks on your system PATH first, then in a bundled ffmpeg-bin/ folder next to the project; if neither exists, the page shows a setup hint at the top.

Windows

# Option 1 (easiest): run from the project folder npm run setup-ffmpeg # Option 2: winget winget install Gyan.FFmpeg # Option 3: Chocolatey choco install ffmpeg

macOS

# System install via Homebrew (recommended) brew install ffmpeg

Auto-download is intentionally disabled on macOS: the official evermeet.cx URL currently redirects to a different domain that this script couldn't verify. Homebrew is the safe, standard path.

Linux

# Option 1: run from the project folder npm run setup-ffmpeg # Option 2: your distro's package manager sudo apt install ffmpeg # Debian/Ubuntu sudo dnf install ffmpeg # Fedora sudo pacman -S ffmpeg # Arch

The Windows/Linux auto-download pulls a GPL build from the BtbN/FFmpeg-Builds project on GitHub — the same source ffmpeg.org's own download page points to for those platforms.

Run it

Three steps to get started

01

Install dependencies

Run npm install inside the project folder.

02

Start the server

npm start boots it up; the port is configurable via the PORT environment variable.

03

Open the browser

Go to http://localhost:3000 and drop a video onto the page.

Project structure

What's inside the source

This is the layout after you unzip it — exactly what npm install and npm start run against.

hls-dash-creator.zip
server.jsExpress server: uploads, the processing queue, streaming output, opening folders
ffmpeg-runner.jsLocates FFmpeg, builds the HLS/DASH argument lists, runs the encode
scripts/
setup-ffmpeg.jsAuto-downloads FFmpeg for Windows/Linux
public/
index.htmlThe UI: drag-drop, output settings, queue
app.jsFrontend logic: queue, uploads, processing status
fonts/Vazirmatn font, bundled locally — no CDN load
vendor/hls.js and dash.js, bundled locally, for the "View demo" button
package.jsonDependencies: express, multer, adm-zip
README.mdFull install and usage guide
uploads/Temporary upload files — gitignored
output/Finished HLS/DASH output — gitignored
Output

Output folder layout

For each video, this is what gets built under output/<video-name>/:

hls/ master.m3u8 (multi-quality mode only) v0.m3u8, v1.m3u8, ... or index.m3u8 v0_000.ts, ... or seg_000.ts, ... dash/ manifest.mpd init-stream0.m4s, chunk-stream0-00001.m4s, ...
Technical notes

Under the hood

Encodinglibx264 + aac; output framerate is pinned to 30fps so the keyframe interval (GOP) lines up exactly with the segment duration — a requirement for clean HLS/DASH segmenting.
Audio in multi-quality modeHLS encodes audio separately per rendition (each rendition is self-contained); DASH instead builds one shared audio AdaptationSet for every video rendition.
Progress reportingRead from FFmpeg's own -progress pipe:1 output; if the browser can't detect the video's duration, the progress bar stays put but the job keeps running.
"Open folder"Runs the OS's native command (explorer on Windows, open on macOS, xdg-open on Linux) on the same machine running the server.

Limitations

  • The server is built for personal/local use only — no auth, no rate limiting. Don't expose it to the public internet.
  • This is an educational/demo tool, not a production-scale transcoding pipeline.

Ready to try it?

Download the source, install FFmpeg, and you're running in under a minute with npm install && npm start.

Download source .zip