Bitrate starvation in the bottom stops
A night exterior that read beautifully in the suite arrives on the client's laptop looking like a video game: flat squares where the falloff should be, crawling as the camera moves. That is not your grade. It is a quantiser deciding, correctly by its own rules, that your shadows were the cheapest thing in the frame to throw away.
No credit card required. Cancel any time.
Updated September 2026
What you are actually seeing
Every modern codec cuts the frame into blocks, turns each block into a set of frequency coefficients, and then divides those coefficients by a step size before rounding. That division is the quantiser, and it is the only place in the chain where information is deliberately destroyed.
The first coefficient of a block, the DC term, is its average brightness. Everything after it describes how the block varies inside itself: the gradient, the edge, the texture. When the step size gets large enough, every one of those later coefficients rounds to zero and only the average survives. The decoder then has nothing to draw but a rectangle of one flat value. Put a few hundred of those side by side across a falling gradient and you get the staircase of squares people call macroblocking, with edges that line up with the codec’s grid rather than with anything in the photograph.
Dark areas lose that fight first, for two reasons that compound. The first is perceptual. Rate control is steered by a model of what a viewer notices, and that model says shadow detail is cheap: a viewer will forgive a soft corner of a night frame long before they forgive a smeared face. So the encoder is instructed, quite deliberately, to raise the step size where the picture is dark. The second reason is arithmetic. There is genuinely less signal down there. A slow falloff from near-black to slightly-less-black produces small coefficients to begin with, so it takes very little coarsening to round the whole set to zero. The bright half of your frame has to be starved hard before it visibly breaks. The bottom two stops break at the first sign of pressure.
This is also why the problem shows up in motion and not on the frame you exported as a still. Between the full frames, the codec is coding differences, and in a dark scene those differences are tiny. Coarse quantisation zeroes them, the block holds its old value for a few frames, then updates all at once. What you see is not a static pattern but a crawl.
Hard-edged squares that follow the encoder's block grid, not the picture. A block that should carry gradation carries one flat value because every coefficient except the average was rounded away. Worst in dark, slowly changing areas, and worst of all in motion.
Contour lines that follow the shape of the gradient itself, a sky or a wall falling off in visible steps. The cause is too few code values to describe the ramp, not the transform. It often exists in the master before anyone uploaded anything, and 8-bit delivery makes it worse.
A shimmering halo around high-contrast edges, titles and subtitles most obviously. Quantising the high-frequency coefficients that describe a sharp edge leaves ringing, and because it re-forms differently each frame, it appears to swarm around the edge as it moves.
Naming it correctly saves a wasted evening. If the artifact follows a grid, work on the encode. If it follows the gradient, work on bit depth and dither, which is a different guide: see what happens to film grain after upload for the noise side of the same problem. If it swarms around your lower third, your titles are being encoded at the same starved bitrate as everything else.
What the platform adds
Your export was already quantised once, by your encoder, with your settings. Upload it to a platform and it is quantised again, by a machine tuned for average delivery cost across millions of files. The two passes do not cancel out. They stack.
Vimeo states it plainly: during transcoding, your file “is re-encoded into several formats that will be available to view on Vimeo”. It then publishes the maximum video bitrate for each of those formats, which is unusually candid and extremely useful. On the H.264 ladder the ceilings are 0.3 Mbps at 240p, 0.5 at 360p, 1.5 at 540p, 2.5 at 720p, 7 at 1080p60, 12 at 2K and 22 Mbps at 4K. On the HDR and above-4K HEVC ladder they are 2.2 at 720p, 5 at 1080p, 10 at 2K and 16 Mbps at 4K. Vimeo also attaches the qualifier that matters most here: those figures are a maximum, and “your video could transcode at a lower bitrate depending on the complexity of the image”.
A night exterior with grain is, by any encoder’s definition, a complex image. So the published ceiling is the best case for the scene least likely to reach it.
YouTube is the opposite kind of problem. It says outright that it “always re-encodes videos to optimize their playback quality”, and that processing starts in low quality with the higher resolutions finishing later, which is why a 4K upload can look coarse for hours after it goes live. What YouTube does not publish, anywhere, is the bitrate it delivers at any resolution. You cannot plan against a number that does not exist.
22 Mbps
Vimeo 4K ceiling, H.264
a maximum, lower on a complex image
16 Mbps
Vimeo 4K ceiling, HDR ladder
same maximum-not-guarantee rule
None
YouTube delivery figures
nothing published at any resolution
0
re-encodes here
the bytes you upload are the bytes served
Vimeo, 1080p60, H.264 ladder
Vimeo, 2K, H.264 ladder
Vimeo, 4K, HDR ladder
Vimeo, 4K, H.264 ladder
Here, a 150 Mbps export of the same night exterior
Vimeo's published maximum delivery bitrates per rendition, fetched 4 September 2026. Vimeo states the listed bitrates are a maximum and that a video can transcode lower depending on the complexity of the image, which is exactly the case for a grainy night exterior. The 150 Mbps bar is an example export, not a product specification: the player here streams the exact file you upload, so that bar is whatever you set in your encoder. Playback of a high-bitrate file depends on the viewer's hardware decoder.
For scale outside this argument, Apple’s own HLS authoring specification, the document the streaming industry builds ladders against, tops out its 4K HEVC example rung at 16,800 kbps SDR. Streaming as a discipline is built around a ceiling in that region. That is not a failure of Vimeo or YouTube. It is what adaptive delivery is for, and it is why a master that carries its shadow gradation comfortably at 150 Mbps has to give most of it up to fit through the door.

Vimeo and YouTube figures from their own help pages, fetched 4 September 2026. Vimeo's bitrates are published maximums that can come in lower on a complex image. YouTube publishes recommended upload bitrates but no delivery figures at all.
The how-to
These are in order of how much difference they make per minute spent. The first one is free and usually the largest.
An encoder cannot protect gradation that is not in the file. If your darkest sustained area sits flat on the bottom of the waveform, there is nothing there to code and the block collapses to one value the moment bits get tight. Bring the lift up until the shadow occupies a measurable spread on the scope rather than a line on the floor, a few code values above black. It costs you a little contrast in the suite and buys you the difference between a falloff and a staircase on the client's laptop.
Grade in 10-bit and export 10-bit when the delivery codec permits it. HEVC Main 10 is what Apple's HLS authoring specification calls for on the HEVC path, and the extra code values are spent exactly where you need them, on a ramp that 8-bit describes in too few steps. If the deliverable has to be H.264 High Profile, you are working in 8 bits and steps 6 and 1 have to do more of the work.
This is Vimeo's own recommendation on its compression guidelines page, and it is the right one for dark material regardless of destination. A constant rate factor targets quality rather than an average bitrate, so a frame that is expensive to encode, which is precisely your night exterior, is allowed to take the bits it needs instead of being held to the same average as the daylight wide before it.
Both Vimeo and YouTube specify High Profile. It is not a formality: High Profile enables the 8x8 transform and better entropy coding, which is what lets the encoder describe a smooth dark gradient without spending a fortune. YouTube's page also asks for CABAC, two consecutive B frames and a closed GOP. Set all of them. Main Profile on a night scene is a self-inflicted wound.
Vimeo asks for a constant frame rate at 23.98, 24, 25, 29.97, 30, 50, 59.94 or 60 fps. YouTube asks you to encode at the rate you shot and to deinterlace before uploading. Variable frame rate makes rate control guess at how many bits the next second needs, and its guesses are worst on the low-motion, low-signal shots where you can least afford them.
Fine noise in the shadows keeps the high-frequency coefficients non-zero, so a block cannot collapse to its average, and it raises the measured complexity of the region enough that rate control stops treating it as free. Keep it fine and subtle. Heavy grain costs real bitrate, and on a platform that re-encodes, a large part of it is going to be spent and then discarded.
Export once, from the timeline, at the delivery setting. Handing a finished H.264 to another compressor quantises blocks that were already flattened by the first pass, and the artifacts compound rather than average out. That includes the well-meant habit of making a smaller file to upload faster: you are pre-applying the damage you were trying to avoid.
Vimeo generates renditions by pixel dimension, not by intent. A 4K rendition exists only if the larger dimension is at least 3648 px or the smaller at least 2052 px; 2K needs 2432 or 1368; 1080p60 needs 1824 or 1026. A 3840 by 2160 master clears the 4K gate on its larger dimension. An anamorphic 2048 by 858 export clears neither 2K threshold, so it tops out at 1080p and your night scene is judged at a 7 Mbps ceiling. If you are letterboxing, letterbox inside a frame that still clears the gate you want.
The thing that does not work
How to judge the result
Most people check the wrong thing in the wrong conditions and conclude the problem is fixed. Three rules make the test worth doing.
Turn the room lights down. Shadow artifacts are invisible in a bright room and obvious in a dark one, and your client is watching at 11pm with the lights off. Then view at 100 percent, one image pixel to one screen pixel. A 4K file scaled into a half-width browser window is being resampled by the browser, and resampling smooths the block edges you are looking for. Full screen on a 4K display, or a 1:1 window, or you are not measuring anything.
Then, and this is the one people skip, watch a moving shadow rather than pausing on a still. Macroblocking is at its most visible when a block holds a stale value for several frames and then snaps, which a paused frame cannot show you. Find a shot where the camera drifts across a dark wall, or where a figure moves through an unlit part of the frame, and play it at speed. If the shadow appears to be built out of tiles that update on different schedules, you still have work to do.
Last: judge on the rendition your client will actually receive. If you are delivering through an adaptive platform, step the player’s quality selector down to 1080p and look there, because a laptop on hotel wifi is not getting the top rung. Signing off on the 4K rendition and shipping the link is how a scene that passes your review fails theirs. If you are delivering a single file that is not re-encoded, the rendition question does not arise and what you approved is what plays.
The structural fix
Everything above is about surviving a second quantisation pass. The other option is not to have one.
uncompressed.io streams the exact bytes you upload. There is no transcode anywhere in the path, no ladder, and no re-encode of video or audio, so the shadow gradation the viewer sees is the gradation you exported, block for block. If your night exterior is clean at 150 Mbps in the suite, that is the file the client opens. Uploads are MP4 or MOV in H.264, HEVC or AV1, up to 50 GB per file. See video bitrate explained for how to pick the number in the first place.
Two caveats belong on the same page as that claim, because a page that only lists the upside is an advertisement. The first is playback: whether a given file decodes is the viewer’s hardware decoder’s business, and browser vendors document what they accelerate in fairly narrow terms. High-bitrate and high-bit-depth files sit closer to the edge of what consumer hardware handles comfortably, and 10-bit 4:2:2 decode in a browser is not documented by any browser vendor, in either direction. We store and serve the file untouched. We cannot promise you what a stranger’s laptop will do with it.
The second is the missing ladder. Because there is only one rendition, a viewer on a slow connection buffers instead of silently dropping to a softer version. That is the honest trade, and it genuinely cuts both ways: nobody ever sees a mushy rendition of your work, and somebody on bad wifi may see a spinner. If your priority is that every viewer gets something playable immediately, an adaptive platform is doing a job this one deliberately does not do.
When the host is not the answer
Say your delivery target is a public launch film, or a campaign that will be watched on phones on mobile data across a whole country. You want the adaptive ladder. You want the 240p and 540p rungs, and those rungs are low bitrate on purpose, because their job is to play at all rather than to play beautifully. Vimeo publishes 0.3 Mbps at 240p and 1.5 Mbps at 540p on its H.264 ladder. No export setting on earth keeps a grainy night exterior clean at 0.3 Mbps. It will block, and that is the system working as designed.
The fix in that case is not a different host. It is the grade. Lift the floor further than you would for a cinema deliverable, keep the shadows simpler, put less texture and less movement in the parts of the frame that are going to be starved, and light so that the story of the shot survives at low bitrate. Colourists who cut for broadcast and social have done this for years, and they do it in the suite, not in the export dialog.
The same honesty applies to platform choice. If the goal is reach and discovery, YouTube is free, has an audience nobody else has, and no private host competes with it on that. If the goal is a public marketing page with a polished player, marketing tooling and OTT products, Vimeo has an entire product suite that this site has no equivalent to. Where this site is the better answer is narrower and specific: a graded film, going to a named audience, that has to look on their screen exactly the way it looked on yours.
The short version
Questions
Because rate control spends bits where a perceptual model says they will be noticed, and shadow detail scores low on that model. There is also genuinely less signal down there: the residual energy in a dark, slowly falling gradient is small, so it is the cheapest thing in the frame to stop protecting when the encoder needs to hit a target. Your daylight wide has edges, faces and contrast to defend. The night exterior has a gradient nobody is defending.
No, and telling them apart tells you which fix to reach for. Macroblocking follows the encoder's block grid: hard square edges that do not line up with anything in the picture. Banding follows the image: contour lines that trace the shape of the gradient itself, caused by too few code values rather than by quantisation of the transform. Banding often starts in the master and survives upload. Macroblocking is usually created at the last encode.
Only indirectly. Vimeo publishes maximum delivery bitrates of up to 22 Mbps at 4K on its H.264 ladder and up to 16 Mbps on the HDR ladder, and says those are maximums that can come in lower on a complex image. A 200 Mbps upload does not raise that ceiling. What a clean, high-bitrate master does buy you is a better input to their encoder, which is worth having, and a file that streams at its own bitrate on a host that does not re-encode.
Add a small amount, and add it for a specific reason: fine noise keeps the high-frequency coefficients in a dark block non-zero, so the block cannot collapse to a single flat value, and it makes rate control treat the region as worth spending on. Keep it fine and low. Heavy grain is expensive to encode, gets partly eaten by the platform anyway, and can trade a blocking problem for a mushy one.
Yes, up to the point where you hand the file over. A 10-bit chain gives the grade more code values to spread the falloff across and gives the delivery encoder a cleaner input, and Apple's own HLS authoring specification calls for HEVC Main 10 for HEVC delivery. What it cannot do is control the rendition the platform builds from it. On a host that does not re-encode, the 10-bit file you uploaded is the file that streams, subject to the viewer's hardware decoder.
It will look exactly like your export, which is the honest answer rather than a flattering one. If the blocking was introduced by the platform's second encode, it goes away. If your export was itself starved, and a CRF 23 H.264 of a grainy night exterior often is, it will block here too. The steps on this page fix the export first, because no host can put back gradation the file never carried.
On an adaptive platform, partly. Low renditions in a ladder are low bitrate by design, and a dark grainy frame will block there no matter what you export. The realistic fix in that case is in the grade: lift the floor, simplify what is happening in the shadows, and accept that the bottom of the ladder is not where your night exterior is going to be judged. On a host with no ladder, a slow line buffers instead of dropping to a softer rendition, which is a different trade and not always the better one.
uncompressed.io streams the exact bytes you upload. No second encode, no ladder deciding what your shadows are worth. Storage is the only meter.