DASH Player Online and MPD Analyzer

Paste an .mpd URL. Play the stream and see every quality, language and subtitle it holds. See which DRM it uses, then copy the ffmpeg command for the tracks you pick.

Analyze and play a DASH manifest

Free. Your browser reads the manifest from the stream's server directly: the URL is never sent to Vidora.

Tip: in Chrome DevTools, open the Network tab, filter on mpd, play the video and copy the request URL.

Try:

Loads Shaka Player (about 500 KB) only when you press Play.

Diagnosis

    A DASH stream is described by an .mpd manifest: an XML file that lists every video quality, every audio language and every subtitle track as separate Representations. This page reads that file, plays the stream when it is not DRM-protected, and turns the tracks you pick into an ffmpeg command that saves them together as one MP4 file.

    Play a DASH stream online

    Press Analyze, then Play preview. The page loads Shaka Player 5.2.12, Google's open source DASH player (Apache 2.0 license), served from getvidora.com and fetched only when you press Play. The player switches quality on its own as your bandwidth changes; when you pick a video quality and an audio track in the lists, the preview switches to that pair if the player offers it.

    The preview plays what your browser can decode. H.264 and AAC play in every current browser; H.265 plays in Chrome and Edge only with hardware decoding, and older devices skip VP9 or AV1. A quality the browser cannot play is still listed and can still be downloaded, because ffmpeg copies it without decoding.

    No .mpd address yet? Record the page's network traffic as a HAR file in DevTools and drop it into the M3U8 and MPD link sniffer: it lists every manifest the player loaded, with the Referer it sent.

    Live stats and player errors

    While the preview plays, the Live stats panel refreshes every second and pauses with the video. It reads Shaka Player's own counters: the real picture size, the bitrate the manifest declares for the pair playing, the bandwidth the player measures, the seconds buffered ahead, dropped and decoded frames, the time spent playing and waiting for data, the codecs and, on a live stream, the latency. Two graphs follow the buffer and the bandwidth estimate over the last 60 seconds of playback. A bandwidth estimate below the variant bitrate, with a buffer that keeps falling to zero, means the connection cannot hold that quality: pick a lower one in the Video quality list.

    The Player events log under the diagnosis records quality switches, buffering and every Shaka error, translated into a probable cause and a next step. The codes you will meet most often:

    Shaka codeUsual cause
    1001 BAD_HTTP_STATUSA server answered with an error: 403 for an expired signed URL or a missing Referer or cookie, 404 or 410 for a removed file or a segment already out of the live window
    1002 HTTP_ERRORNo answer could be read: the segment server does not allow other sites (CORS), or the network failed
    1003 TIMEOUTThe server did not answer in time
    4001 DASH_INVALID_XMLThe URL returned something other than an MPD, often a web page
    4012 and 4032No quality uses a codec this browser can decode (RESTRICTIONS_CANNOT_BE_MET, CONTENT_UNSUPPORTED_BY_BROWSER)
    6000 to 6999DRM: the stream needs a license, and this page never requests one

    Copy share link puts the manifest URL in a link to this page, so someone else can open the same analysis and run the same preview.

    What the MPD analyzer reads

    Part of the MPDWhat you learn
    <MPD type>On-demand (static) or live (dynamic), total duration, buffer and rewind window
    <Period>How many Periods there are and how long each one is: several Periods often mean inserted ads
    <AdaptationSet> and <Representation>Each video quality (resolution, bitrate, codec, frame rate), each audio track (language, codec, channels, sample rate) and each subtitle track. The track type is read from contentType, then mimeType, then the codec name, at both levels
    <ContentProtection>The DRM system, the encryption scheme (cenc or cbcs) and the default key ID. One such element anywhere in the file (MPD, Period, AdaptationSet or Representation, or a ref to one) marks the stream as encrypted
    SegmentTemplate, SegmentTimeline, SegmentBase, SegmentList, BaseURLHow the video is cut: the number and length of segments, or one file read with byte ranges, and the resolved URL of the first segment

    Convert MPD to MP4 with ffmpeg

    In DASH, picture and sound are always separate tracks, and each audio language is a track of its own. ffmpeg reads the manifest and fetches the segments itself, but it has to be told which tracks to keep. The command this page prints names them by their Representation id:

    ffmpeg -i "https://storage.googleapis.com/shaka-demo-assets/angel-one/dash.mpd" -map 0:v:m:id:14 -map 0:a:m:id:19 -c copy angel-one.mp4

    0:v:m:id:14 means "the video stream of input 0 whose id tag is 14": ffmpeg's DASH reader copies each Representation id into that tag. -c copy keeps the original encoding, so the conversion takes as long as the download and loses nothing. When ids are missing, repeated or contain characters that break the specifier (such as :), the page falls back to m:variant_bitrate (the declared bandwidth) or to the position of the track. By default it picks the best video up to 1080p and the audio in your browser's language; 4K and the other qualities stay in the list.

    Why not a plain ffmpeg -i manifest.mpd -c copy out.mp4? Without -map, ffmpeg keeps one video stream and one audio stream that it picks itself. On the multi-language sample above it kept the Spanish track. With the mapping, the file has the language you chose.

    We ran the printed commands with ffmpeg 6.1 (limited to 6 seconds with -t 6) and checked each file with ffprobe:

    Sample and picksFileffprobe
    Big Buck Bunny, default pick (1920x1080) and the AAC track.mp4H.264 1920x1080, HE-AAC 48 kHz stereo
    Angel One, 600x480 and French AAC.mp4H.264 600x480, AAC; the mapped input stream is the one tagged fr
    Angel One, VP9 720x576 and German Opus.mkvVP9 720x576, Opus, language de
    DASH-IF live simulator.tsH.264 640x360, AAC, 6.2 s recorded

    Tracks in WebM (VP9 video, Opus audio) are written to .mkv, which holds any codec found in DASH. The same pick works with yt-dlp: for a direct .mpd URL its format ids are the Representation ids, so yt-dlp -f 14+19 --merge-output-format mp4 URL downloads the same pair. yt-dlp needs ffmpeg installed to merge them. The guide to downloading DASH MPD streams compares these methods with the others.

    Manifests with several Periods

    ffmpeg's DASH reader keeps a single Period. On a two-Period test manifest it started at the second, longer Period and skipped the 250 seconds of the first one. The analyzer warns about it and lists the qualities of the Period ffmpeg will read. yt-dlp joins Periods whose formats match, which is why the yt-dlp line uses -f "bv*+ba" for those manifests.

    DRM in DASH: what the KID and pssh tell you

    An encrypted stream declares <ContentProtection> elements. The one with schemeIdUri="urn:mpeg:dash:mp4protection:2011" gives the encryption scheme: cenc (AES-CTR, the common one for Widevine and PlayReady) or cbcs (AES-CBC with a pattern, used by FairPlay and more and more by the others). Its cenc:default_KID attribute is the identifier of the key, not the key itself.

    The other elements name a DRM system by its UUID and often carry a <cenc:pssh> box: data the player sends to the license server to ask for the key. The analyzer recognizes these systems:

    SystemUUID in schemeIdUri
    Widevine (Google)edef8ba9-79d6-4ace-a3c8-27dcd51d21ed
    PlayReady (Microsoft)9a04f079-9840-4286-ab92-e65be0885f95
    FairPlay (Apple)94ce86fb-07ff-4f43-adb8-93d2fa968ca2
    ClearKeye2719d58-a985-b3c9-781a-b030af78d30e or 1077efec-c0b2-4d02-ace3-3c1e52e2fb4b

    The key is delivered by the license server to a licensed module inside the browser and never leaves it. A web page, ffmpeg or yt-dlp never sees it. That is why the analyzer stops at naming the system: it never contacts a license server, does not play encrypted streams and prints no command. Circumventing DRM is illegal in most countries.

    Live MPD streams

    A manifest with type="dynamic" is live. It changes while you watch: minimumUpdatePeriod says how often the player reloads it, and timeShiftBufferDepth how far back you can rewind. The preview starts near the live edge. The printed ffmpeg command records from now until you press q, into a .ts file that stays playable even if the recording is cut. Nothing older than the rewind window can be recovered. We checked it on the DASH-IF live simulator, which the Live sample uses.

    Limits

    For HLS streams (.m3u8), use the M3U8 tester, which plays them and reads their first segment.

    Prefer one click to typing commands?

    Vidora is a Chrome extension. On the page where the video plays, it finds the DASH manifest, downloads one video and one audio track and merges them into a single file, up to 1080p unless you choose another quality. It refuses DRM-protected streams.

    Frequently asked questions

    How do I play an MPD file online?
    Paste the .mpd URL in the tool, press Analyze, then Play preview. The page loads Shaka Player, an open source DASH player, and plays the stream in your browser. It works when the stream has no DRM and its server allows other websites to read it (CORS).
    How do I convert an MPD to MP4?
    Analyze the manifest, pick a video quality and an audio track, and copy the ffmpeg command. It looks like: ffmpeg -i URL -map 0:v:m:id:VIDEO_ID -map 0:a:m:id:AUDIO_ID -c copy video.mp4, where the ids are the Representation ids of the manifest. The segments are copied without re-encoding. WebM tracks (VP9, Opus) go into an .mkv file instead.
    Why does my MPD download have the wrong language or no sound?
    In DASH, sound is always a separate track and each language is its own track. Without -map, ffmpeg keeps one audio track of its own choosing: on our multi-language test stream it kept Spanish. Map the audio Representation you want explicitly, as the generated command does. A download that keeps only the video URL has no sound at all.
    Can it play or download DRM-protected DASH streams?
    No. It names the DRM system (Widevine, PlayReady, FairPlay, ClearKey), the encryption scheme and the key ID, then stops: it never requests a license, does not play encrypted streams and prints no command. ffmpeg and yt-dlp cannot decrypt DRM, and circumventing it is illegal in most countries.
    Why does the tool say the browser could not read the manifest?
    A web page can only read a file from another site if that site sends an Access-Control-Allow-Origin header. When the request fails, the tool sends a second request that does not need that header: if the server answers it, CORS is the cause and the stream may be fine; if not, the server is unreachable. You can paste the XML from DevTools instead, or run ffmpeg in a terminal, where CORS does not apply.
    Is the MPD URL sent to Vidora?
    No. The manifest is read by your browser directly from the stream's server and analyzed on the page. The player script is served by getvidora.com, but the stream itself goes from its server to your browser.
    Can I see the bitrate, buffer and dropped frames of a DASH stream?
    Yes. Once the preview plays, the Live stats panel shows the real picture size, the bitrate of the variant playing, Shaka Player's bandwidth estimate, the buffer ahead, dropped and decoded frames, the time spent playing and buffering, the codecs and, for a live stream, the latency. Two graphs show the buffer and the bandwidth estimate over the last 60 seconds of playback.
    What do Shaka Player errors 1001, 1002 or 4032 mean?
    The Player events log translates them. 1001 (BAD_HTTP_STATUS) means a server answered with an error status: 403 is often an expired signed URL or a missing Referer, 404 a removed file. 1002 (HTTP_ERROR) means no answer could be read, usually CORS on the segment server or a network failure. 4032 (CONTENT_UNSUPPORTED_BY_BROWSER) means this browser cannot decode any quality of the stream. Codes from 6000 to 6999 are DRM errors.
    How do I share a DASH stream test?
    After analyzing a URL, press Copy share link. The link opens this page with the manifest URL after #url= and runs the same analysis. Browsers do not send the part after # to the server, and the page removes it from the address bar once it has read it. A signed manifest URL may expire before the other person opens the link.

    Romain Gouraud, RGC Digital LLC

    Updated 2026-10-09. Tested on the four sample streams and on public DASH test vectors (multi-period, SegmentTimeline, PlayReady and Widevine): the printed commands were run with ffmpeg 6.1 and yt-dlp, and the files checked with ffprobe.