Early access · free while we build

Video engineering, learned by doing.

Courses where every diagram is the real tool. Build an FFmpeg pipeline as a graph, read the command it writes, run it in your browser. Nothing to install, nothing uploaded.

Free account to tryRuns on ffmpeg.wasmBring your own binary
5 courses
FFMPEG to pipelines
6 tools · 5 labs
one workspace
In-browser
real ffmpeg runs
Free
while in early access
01

Tools

Six browser tools on one shared shell. Each hands its output to the next, and every panel below is the real one, not a mock-up. Build, measure, inspect and repair; they hand files to each other.

Open the workspace

FFMPEG Studio

Every flag is a node. Drop filters from the palette, tune them in the inspector, and the command bar writes the real ffmpeg line as you go. Type in the bar and the graph follows.

Open FFMPEG Studio
FFMPEG Studio/Watermark a videoCoreRun
Library/Watermark a video
Never empty
Pre-seeded with a runnable testsrc2 → scale → libx264 → mp4 graph, so Run works immediately.
85%
$Command
›
⌘/
ffmpeg
←the tool

What The FFMPEG

Paste a command and read it flag by flag. Inspect parses an MP4 box by box, Explain breaks a command into chips with the docs behind each one, Compare diffs two commands and predicts what changes.

Open What The FFMPEG
What The FFMPEGInspectExplainCompareOpen in StudioRun
A…empty
Try an exampleBuild one in Studio
Type a command to see its flags.

HLS Video Processing

Fetch a playlist and probe every segment in the browser. The timeline draws one lane per variant, marks where keyframes drift, and hands each finding to the Studio as a fix.

Open HLS Video Processing
HLS Video ProcessingGenerateAnalyzeLibraryhttps://cdn.beem.example/bunny/master.m3u8Re-fetch
No findings in this variant
Every probed segment in this variant starts on an IDR, no EXTINF exceeds the target duration, timestamps are continuous and every variant declares CODECS.
Segments are probed in the browser: MPEG-TS and fMP4 parsed for keyframes, duration and codec, nothing uploaded.

Corruption Check

Drop in a file that will not play. The container is read in the browser and every finding says what broke, how it was detected, and the ffmpeg command that repairs it.

Open Corruption Check
Corruption Check/broken-export.mkvcheck complete · 1.9 sRe-run check
Issuesselect one to see its fix

DASH Lab

Steer a real dash.js player by hand. Force a rung, cap the bitrate, change the ABR rule, throttle the network, and watch throughput, buffer and latency respond on the charts.

Open DASH Lab
DASH Lab/Big Buck Bunnydash.js 4.7 · MSELesson
—rebuffering
0:00
Rung
—
Representation
Throughput
—
getAverageThroughput
Buffer
—
target 12 s
Position
—
currentTime
Stalls
—
BUFFER_EMPTY events
Dropped
—
0 frames decoded
Switches
—
QUALITY_CHANGE_RENDERED
Downloaded
—
0 media segments
Throughput vs chosen bitratethroughputchosenceiling1000 kbps
Buffer & latencybuffer slatency sstable target15 s
Pick a stream and press Load. Everything below comes from dash.js metrics polled once a second plus the player's own request events.

WebRTC Lab

Two real peer connections in one tab. Start the call, then change bitrate, resolution, loss and codec while it runs and read the SDP, ICE pairs and stats as they change.

Open WebRTC Lab
WebRTC Lab/new
Capture
no track
Encode
VP8
Impair
not supported
DTLS · SRTP
a=fingerprint
ICE · UDP
new
Decode
inbound-rtp
Render
pc2 ontrack
pc1 · sender—
No source yet
Pick Webcam, Screen or Test pattern on the left, or press Connect to start with the webcam.
pc2 · receiver—
Nothing received yet
Press Connect (⌘↵) to negotiate pc1 → pc2 and start receiving SRTP.
Sent
—
outbound-rtp
Received
—
inbound-rtp
FPS enc / dec
—
0×0 sent
RTT
—
candidate-pair
Jitter
—
inbound-rtp
Loss
—
0 pkts · 0 nack
Keyframes
—
0 PLI · 0 freezes
Limit
—
qualityLimitationReason
Bitratesentreceivedcap500 kbps
Latency & lossRTT msjitter msloss %20 ms / %
Pick a source and connect. Everything below is measured with getStats() once a second on the two peers.
New · Labs

Cloud Video Lab

Every managed video product is the same pipeline with different names. Pick a provider and a scenario, then click a stage to see the product that owns it, the real API call, and the ffmpeg command that does the same job.

Provider
Scenario
Google Cloud · VOD
Media services are thin, API-first products around Cloud Storage: Transcoder API for files, Live Stream API for channels, Media CDN on the Google edge, Video Intelligence for ML annotation.
Pipelinemaster-4k.mov · 24 min · ProRes 422 · 38 GB
Transcoder APITranscode
A JobConfig lists elementaryStreams (one per rung) and a muxStreams list that packages them. preset/web-hd is the default 3-rung ladder.
JSON · Google Cloud
{
  "inputUri": "gs://beem-src/input/master-4k.mov",
  "outputUri": "gs://beem-out/hls/",
  "config": {
    "elementaryStreams": [
      { "key": "v1080", "videoStream": { "h264": { "heightPixels": 1080, "bitrateBps": 5000000, "frameRate": 30, "gopDuration": "2s" } } },
      { "key": "v720",  "videoStream": { "h264": { "heightPixels": 720,  "bitrateBps": 2500000, "frameRate": 30, "gopDuration": "2s" } } },
      { "key": "v360",  "videoStream": { "h264": { "heightPixels": 360,  "bitrateBps": 800000,  "frameRate": 30, "gopDuration": "2s" } } },
      { "key": "a128",  "audioStream": { "codec": "aac", "bitrateBps": 128000 } }
    ],
    "muxStreams": [
      { "key": "hls-1080", "container": "fmp4", "elementaryStreams": ["v1080","a128"], "segmentSettings": { "segmentDuration": "6s" } },
      { "key": "hls-720",  "container": "fmp4", "elementaryStreams": ["v720","a128"],  "segmentSettings": { "segmentDuration": "6s" } },
      { "key": "hls-360",  "container": "fmp4", "elementaryStreams": ["v360","a128"],  "segmentSettings": { "segmentDuration": "6s" } }
    ],
    "manifests": [
      { "fileName": "master.m3u8", "type": "HLS",  "muxStreams": ["hls-1080","hls-720","hls-360"] },
      { "fileName": "master.mpd",  "type": "DASH", "muxStreams": ["hls-1080","hls-720","hls-360"] }
    ]
  }
}
The same job in ffmpeg
ffmpeg -i master-4k.mov -filter_complex "[0:v]split=3[a][b][c];[a]scale=-2:1080[v1];[b]scale=-2:720[v2];[c]scale=-2:360[v3]" -map "[v1]" -c:v:0 libx264 -b:v:0 5000k -map "[v2]" -c:v:1 libx264 -b:v:1 2500k -map "[v3]" -c:v:2 libx264 -b:v:2 800k -map 0:a -map 0:a -map 0:a -c:a aac -b:a 128k -g 60 -keyint_min 60 -sc_threshold 0
Open this pipeline in the Cloud Video Lab
02

Learning

Five courses, study sessions and certificates, each pointed at the tools above.

Browse the courses
From the FFMPEG course

Module Quiz

FFMPEG, HLS, MPEG-DASH, WebRTC and Media Pipelines. Read the idea, open the graph it describes, change it, break it, run it. Here is a real question from the FFMPEG course.

FFMPEG · Video processing · Lesson 4
You want to scale a video to 720p without re-encoding the audio. Which command does it?
Free while in early access

Pricing

Every course, every lab, every browser tool and the desktop app are free with a free account. Pro is for keeping your work: 30 GB of cloud storage, unlimited saved pipelines and certificates.

Free
$0forever
All five courses and all five labsEvery browser tool, unlimited useDesktop app with hardware encoding10 files in your library
Start free
ProEarly access price
$12.99per month
30 GB Media Library cloud storageUnlimited saved pipelines and recipesCertificates and course completionCloud sync across your machines
Go Pro
Compare everything
FAQ

Questions

Open a lesson. Change one flag. See what happens.

That is the whole idea, and it costs nothing to try.