Skip to content

Start typing. Errors match on their exact yt-dlp output.

to move, to open esc to close

Why yt-dlp Only Downloads 360p — and How to Get 1080p or 4K

Tested on yt-dlp 2026.07.28 Updated
No error is printed at all — that is the problem
[download] Destination: Some Video [dQw4w9WgXcQ].mp4
[download] 100% of 24.31MiB in 00:00:03
# …and the file is 640x360

Quick answer

yt-dlp defaulting to 360p is a symptom with four possible causes, and there is no error message to tell them apart. One command distinguishes them: if -F lists formats above 360p, the problem is local. If it does not, the formats are being withheld.

run this first
yt-dlp -F "URL"

Why 360p specifically

Format 18 — 360p H.264 with AAC audio, one mp4 file — is the last combined stream YouTube still serves on virtually every video. Everything above it comes as a video-only stream plus a separate audio stream, to be joined after downloading.

So anything that stops yt-dlp from combining two streams, or from seeing them in the first place, lands on format 18. It is not a setting. It is what remains.

Cause 1 — ffmpeg is not installed

Most common by a distance. yt-dlp needs ffmpeg to merge, and without it silently declines to pick any format that would require merging. Check:

bash
ffmpeg -version

"not recognized" or "command not found" is your answer — install it and the same command that gave you 360p will give you 1080p. If it prints a version but yt-dlp still will not merge, the problem is that yt-dlp cannot see it: ffmpeg not found.

Cause 2 — the format selector says 360p

-f best does not mean best quality. It means "the best single file that already contains video and audio", which is exactly format 18. This is the most-copied wrong command in the entire ecosystem:

SelectorWhat it actually gets
-f bestBest pre-merged file — 360p on YouTube
-f bSame thing, shorter
-f bv*+ba/bBest video + best audio, merged
(nothing)yt-dlp's default, which already merges

If you have -f best anywhere — in the command, in a script, in a config file — remove it. yt-dlp's default is better than the thing people replace it with.

bash
yt-dlp -f "bv*+ba/b" --merge-output-format mp4 "URL"

Cause 3 — the formats are being withheld

If -F lists nothing above 360p on a video you can watch in 1080p in a browser, nothing is broken locally. YouTube is not offering the higher formats to this request, because it carries no proof-of-origin token.

ask as a client that is not gated
yt-dlp --extractor-args "youtube:player_client=tv" -F "URL"

Formats reappear, and the download works. The mechanism, and what to do when the TV client stops working too, is on the PO token page.

Cause 4 — a stale build

An older yt-dlp may fail to parse the current player and silently drop the formats it cannot sign. Sometimes it says so, via nsig extraction failed; sometimes it does not:

bash
yt-dlp -U && yt-dlp --rm-cache-dir

Deciding in thirty seconds

  1. Run yt-dlp -F "URL".
  2. Formats above 360p listed? The problem is local: ffmpeg missing, or your selector. Causes 1 and 2.
  3. Nothing above 360p listed? The problem is upstream: token gating or a stale build. Causes 3 and 4.

Making it permanent

Once it works, put it in the config file so you never diagnose this twice:

yt-dlp.conf
-f bv*+ba/b
--merge-output-format mp4
--embed-metadata
--embed-thumbnail

Where that file lives on each platform, and which settings win when two disagree, is in the config file guide.

If it still fails

  • 1080p downloads but looks soft. Check the codec. A 1080p AV1 or VP9 stream at low bitrate can look worse than 720p H.264. -S "res:1080,vcodec:h264" asks for the codec as well as the resolution.
  • Two files instead of one. The merge failed after the download succeeded — ffmpeg exited with code 1.
  • Only on some videos. Not every upload has a 1080p version. Check what YouTube itself offers in the quality menu before assuming yt-dlp is at fault.
  • Only inside a playlist. A per-playlist format constraint, or one entry lacking the format. -i plus a looser selector.

Frequently asked

Why is 360p the number it falls back to?
Because format 18 — 360p H.264 with AAC audio in a single mp4 — is the one combined stream YouTube still serves on essentially every video. Everything above it is split into separate video and audio streams. When yt-dlp cannot merge, format 18 is the best thing left that needs no merging.
Does -f best get the best quality?
No, and the name is genuinely misleading. best means "the best single file that already contains both video and audio", which on YouTube is 360p. bv*+ba/b is what most people mean when they type best.
It downloads 1080p in a browser extension but not in yt-dlp.
Browser extensions run inside a real browser session, so they get the proof-of-origin token for free. yt-dlp does not, which is what withholds the higher formats. Switching client with --extractor-args "youtube:player_client=tv" closes most of that gap.
How do I always get the best quality without thinking about it?
Put -f "bv*+ba/b" and --merge-output-format mp4 in your config file, and make sure ffmpeg is installed. After that every command gets it by default.