Troubleshooting · Audio · HLS and DASH
Downloaded Video Has No Sound? Find the Cause, Then Fix It
A silent download is almost never random. The audio was in a separate stream your tool skipped, you saved a muted preview, the audio codec could not be written into an MP4, or the source never had sound. One check tells you which, and each cause has a real fix.
Quick answer
First check whether the file has an audio track: ffprobe -v error -show_entries stream=codec_type,codec_name -of default=nw=1 video.mp4, or VLC > Tools > Codec Information. No audio stream after an HLS or DASH download means the audio was a separate rendition your downloader skipped: merge it with ffmpeg -i video.mp4 -i audio.m4a -c copy -map 0:v:0 -map 1:a:0 out.mp4, or download again with a tool that muxes both, such as ffmpeg on the master playlist, yt-dlp, or the Vidora extension. A file that lasts a few seconds is a muted preview, not the video. An audio track that exists but stays silent is a codec your player cannot decode: open it in VLC or re-encode the audio to AAC.
You waited for the download, opened the file, and the picture moves while the speakers stay quiet. The volume is up, the same video has sound on the website. After "it did not detect anything", this is the most common complaint about video downloaders, and it hits extensions, paste-a-link sites and command-line tools alike.
The good news is that a silent download has a short list of causes, and you can tell them apart in under a minute. This guide is written from the failure patterns we see while maintaining Vidora, our Chrome extension, including two cases we had to fix in the extension itself. Diagnose first, then apply the fix that matches.
1. Check first: does the file have an audio track at all?
Everything below depends on one fact: is there an audio stream inside the file? A track that exists but plays silently is a player problem; no track at all is a download problem. Two free tools answer the question.
With ffprobe (command line)
ffprobe -v error -show_entries stream=index,codec_type,codec_name -of default=nw=1 video.mp4
ffprobe ships with ffmpeg. The output lists each stream. A healthy MP4 shows two blocks, one with codec_type=video (typically codec_name=h264) and one with codec_type=audio (typically codec_name=aac). If only the video block appears, the audio was never written to the file. If the audio block says ac3, eac3, mp3 or opus, keep that name in mind for section 4 and the FAQ.
With VLC (graphical)
Open the file in VLC, then Tools > Codec Information (Ctrl + J, Cmd + J on Mac). The Codec tab lists every stream with its type; no Audio stream means the same as ffprobe's missing block. VLC decodes nearly every codec, so a file that has sound in VLC and none in Chrome or QuickTime is a player problem, not a download problem.
| What you observe | Likely cause | Fix |
|---|---|---|
| No audio stream, full-length file, source was HLS or DASH | Audio was a separate rendition the tool skipped (cause 1) | Merge with ffmpeg, or re-download with a muxing tool |
| File lasts a few seconds, often under 1 MB | You saved a muted preview, not the video (cause 2) | Find the real playlist and download that |
| Source was a .ts stream; audio missing or refused by the tool | MP3 or AC-3 audio in the TS (cause 3) | ffmpeg with -c:a aac |
| No audio stream, and the source page is silent too | The source has no audio (cause 4) | Nothing to fix |
| Audio stream present, VLC plays sound, Chrome or QuickTime does not | Player cannot decode that codec (AC-3, Opus...) | Use VLC, or re-encode audio to AAC |
2. Cause 1: the audio was delivered as a separate rendition (HLS and DASH)
This is the big one. An HLS master playlist lists several video variants (360p, 720p, 1080p) and, on many hosts, declares the audio separately with an #EXT-X-MEDIA:TYPE=AUDIO tag pointing at its own sub-playlist. DASH does the same with separate AdaptationSets in the .mpd manifest. The player fetches a video variant and the audio rendition in parallel; nothing on the wire ever looks like one file with both.
A downloader that grabs "the video variant" and stops has done half the job: a full-length, correctly sized MP4 with one stream. Loom, Vimeo's HLS delivery, Reddit's DASH and most course platforms work this way. If ffprobe shows a single video stream, this is your cause.
Two hosts illustrate it well. Reddit splits every hosted video into a DASH video stream and a DASH audio stream, which is why so many Reddit video downloaders return silent files: they take the first stream and never merge the second. Vimeo lists its audio as an EXT-X-MEDIA group, and the Vimeo HLS download guide shows the two-input ffmpeg command with the Referer header Vimeo's CDN requires.
How Vidora handles it. The extension reads the master playlist or the DASH manifest, downloads the chosen video variant and the audio rendition, and muxes both into one MP4 before writing it. We treat "master declared audio, output has none" as a failure, not a success: a silent file is never reported as a completed download when the manifest promised sound.
3. Cause 2: you downloaded a muted preview, not the video
Some hosts put two video files on the same page. One is the real recording, delivered as an HLS playlist. The other is a short MP4, a few seconds long and under a megabyte, used for social cards, hover previews or thumbnails. It has no audio track by design. A tool that lists "the first .mp4 it sees" hands you the preview, and you get a silent clip that ends after five seconds.
Loom is the textbook case: the share page references a muted MP4 under cdn.loom.com/sessions/thumbnails/ and the actual recording as playlist-multibitrate.m3u8 on luna.loom.com. We hit this trap ourselves while building Vidora's Loom support, and the full story of why Loom downloads come out silent is in the Loom guide, with the DevTools steps to pick the right file.
The tell is duration: a few seconds in ffprobe for a video that runs ten minutes on the site. Look for the .m3u8 (or .mpd) request instead of the .mp4, and use a tool that handles playlists. Vidora's Loom resolver discards anything under a thumbnails or preview path and only offers the playlist.
4. Cause 3: MP3 or AC-3 audio inside a TS segment
Older or unusual HLS streams deliver MPEG-TS segments (.ts) rather than fragmented MP4. Inside a TS container the audio can be AAC, but also MP3, AC-3 (Dolby Digital), E-AC-3 or LATM-wrapped AAC. A browser-based transmuxer typically understands only AAC in ADTS framing: the other codecs are not corrupted, they are simply not carried across, and the MP4 comes out with video only.
To confirm it, download one .ts segment from the Network tab and run ffprobe on it: codec_name=mp3, ac3 or eac3 on the audio stream means a browser-side muxer will not keep it. The fix is an ffmpeg pass with the audio re-encoded to AAC (section 6); the video is copied, not re-encoded.
How Vidora handles it. Until we measured it, the extension could not tell "no audio in the TS" from "audio in a codec the muxer skips", and reported both as a silent file. Since version 1.0.62 the extension reads the TS program map, and when the playlist declared audio but the segments carry MP3, AC-3 or another codec it cannot write into MP4, it stops and names the codec in the error rather than saving a video without sound. You get a clear refusal instead of a file that only looks finished.
5. Cause 4: the source is silent
Sometimes there is nothing to recover. Screen recordings made without a microphone, muted social clips, product loops, surveillance footage and some course slides are uploaded without an audio track. The master playlist lists video variants and no audio group; the DASH manifest has no audio AdaptationSet; the MP4 on the server has a single stream. Every download is silent because the upload was.
The test takes five seconds: play the video on the original page with the volume up. Silent there means silent everywhere. No downloader can add audio that was never uploaded; a tool that claims to "repair" missing sound is re-encoding your file for nothing.
How Vidora handles it. The refusal described in the previous sections applies only when the manifest promised audio. A video-only stream that never declared an audio track is delivered as a normal, silent MP4, because that is the honest result. We do not invent an error where the source is simply mute.
6. The fixes: ffmpeg commands and the one-click route
All of these use -c copy where possible: the video stream is copied bit for bit, no quality loss, done in seconds. Quote URLs on the command line, since playlist URLs contain & characters the shell would otherwise interpret.
You have a video file and an audio file: merge them
ffmpeg -i video.mp4 -i audio.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4
The two -map flags say: take the first video stream from the first input and the first audio stream from the second. Works with .m4a, .aac or .mp4 audio files. If the audio came as a raw AAC stream in .aac and ffmpeg complains about timestamps, add -bsf:a aac_adtstoasc before the output name.
You have the two HLS sub-playlists: merge them straight from the URLs
ffmpeg -i "https://cdn.example.com/video-1080p.m3u8" -i "https://cdn.example.com/audio-128k.m3u8" -c copy output.mp4
Or simpler, when you have the master playlist: ffmpeg -i "MASTER_URL" -c copy output.mp4. ffmpeg reads the EXT-X-MEDIA audio group itself and takes the best video variant plus the audio. If the CDN checks a Referer header, add -headers $'Referer: https://the-site.com/\r\n' before each -i. yt-dlp users: add --merge-output-format mp4 so both tracks end up in one MP4. The general workflow, including AES-128 playlists, is in the M3U8 to MP4 conversion guide.
The TS audio is MP3 or AC-3: convert only the audio
ffmpeg -i "PLAYLIST_OR_FILE.ts" -c:v copy -c:a aac -b:a 160k output.mp4
Video copied, audio re-encoded to AAC, which every browser, phone and editor decodes. The same command fixes a file that has an AC-3 or Opus track your player refuses: run it on the downloaded MP4 instead of the playlist.
The one-click route
If you would rather not touch a terminal, download again with a tool that fetches both renditions and muxes them. Vidora does this on every HLS and DASH download: open the page, click the icon, pick the quality if several are offered, click Download. The output is one MP4 with video and audio, produced locally in your browser, and when the audio cannot be written correctly the extension says why instead of handing you a silent file.
7. Frequently asked questions
How do I check if a video file has an audio track?
Command line: ffprobe -v error -show_entries stream=codec_type,codec_name -of default=nw=1 file.mp4 lists every stream; look for codec_type=audio. Graphical: open the file in VLC, press Ctrl+J (Cmd+J on Mac) for Codec Information and check whether a stream of type Audio is listed. No audio stream means the track was never written, not that the volume is down.
How do I add the audio back to a downloaded video?
If you have the audio as a separate file or playlist, merge it with ffmpeg: ffmpeg -i video.mp4 -i audio.m4a -c copy -map 0:v:0 -map 1:a:0 output.mp4. The -c copy flag means nothing is re-encoded, so it takes seconds and loses no quality. If you do not have the audio, download the stream again with a tool that fetches both renditions.
Why does an m3u8 download have no audio?
In many HLS master playlists the video variants and the audio are separate: audio is declared with an EXT-X-MEDIA tag and lives in its own sub-playlist. A tool that downloads only the video variant produces a silent file. Give ffmpeg the master playlist URL with -c copy, or the video and audio sub-playlists as two inputs, and it merges them. Vidora reads the master, fetches both and muxes them into one MP4.
The file has an audio track but my player stays silent. Why?
Then the download is fine and the player cannot decode that audio codec. Chrome, QuickTime and some smart TVs do not decode AC-3 or E-AC-3; older Windows players do not decode Opus. Open the file in VLC, which decodes almost everything, or convert only the audio: ffmpeg -i input.mp4 -c:v copy -c:a aac output.mp4.
Why does Vidora refuse a download instead of giving me a silent file?
Because a silent file reported as a success is the worst outcome. When a TS stream carries an audio track in MP3, AC-3 or another codec that the extension's muxer cannot write into an MP4, Vidora stops and names the codec in the error rather than saving a video without sound. It only does this when the playlist declared audio; a video-only stream that never promised sound is delivered as is.
About the author
Romain Gouraud is the founder of RGC Digital LLC and the engineer behind Vidora, a privacy-first video downloader Chrome extension for Vimeo, Wistia, Loom, Reddit, HLS and DASH streams and direct MP4 files. The four causes in this guide come from the failure patterns the extension's anonymous, privacy-safe diagnostics surfaced, and two of them (the muted Loom preview and the TS audio codec) led to fixes in the extension itself.
Related reading
- How to download Loom videos as MP4, with the audio
- Vimeo HLS downloader: save Vimeo streams to MP4
- How to convert M3U8 to MP4 with ffmpeg and without re-encoding
- Reddit video downloader with sound: what works
- DASH MPD downloader: save .mpd streams to MP4
- Streamable downloader: save Streamable videos as MP4