Back to Blog
ComparisonsTech

Reels vs Threads vs IG Stories Quality Test 2026: 4 Upload Paths SSIM Compared

Published on10 min read
Share

I Ran 40 Tests So You Don't Have To

One clip. 1080x1920, 30fps, 12 Mbps. Four upload paths: iPhone app, desktop web, Meta Business Suite, and Buffer scheduled post. I downloaded every output and ran ffprobe on each file.

Bitrates ranged from 3.4 Mbps to 8.1 Mbps. SSIM scores from 0.912 to 0.967.

That's not normal variance. That's different engineering decisions at each stage of the pipeline.

Most guides just tell you to turn on "Upload at highest quality" and call it a day. What they don't mention is that even with that toggle on, your video can still get re-encoded one, two, or even three times depending on how it reaches Meta's servers. I tested all the combinations and wrote up what I found.

Test Setup and Source Material

Numbers without methodology are worthless, so here's exactly what I used.

Source clip

  • Resolution: 1080x1920 (9:16 vertical)
  • Frame rate: 30fps (CFR, not VFR)
  • Codec: H.264 High Profile Level 4.2
  • Bitrate: 12 Mbps CBR
  • Audio: AAC 128kbps 44.1kHz stereo
  • Duration: 30 seconds
  • Content: gradient sky, text overlays, and fast-moving person (three scenes with different compression sensitivity)

The clip was encoded from a ProRes master using FFmpeg. Every upload path got the identical file, verified by MD5 checksum.

Probe command

This is the first thing I run on every downloaded file:

ffprobe -v error \
  -select_streams v:0 \
  -show_entries stream=codec_name,width,height,r_frame_rate,bit_rate,profile,level,pix_fmt \
  -show_entries format=duration,bit_rate,size \
  -of default=noprint_wrappers=1 \
  sample.mp4

Typical output looks like this:

codec_name=h264
profile=High
level=40
width=1080
height=1920
r_frame_rate=30/1
pix_fmt=yuv420p
bit_rate=4238912
duration=30.033000
size=15912104

SSIM command

To compare the downloaded file against the source (you need to match the resolution first):

ffmpeg -i downloaded.mp4 -i source.mp4 \
  -lavfi "[0:v]scale=1080:1920:flags=lanczos[a];[1:v]scale=1080:1920:flags=lanczos[b];[a][b]ssim=stats_file=ssim.log" \
  -f null -

SSIM of 1.0 means identical to the original. Below 0.95, compression artifacts become visible to the naked eye. One gotcha: if you don't match frame rates before computing SSIM, the scores will be garbage. Add an fps=30 filter if needed.

Bitrate Results Across All Four Upload Paths

Four paths, three products, twelve combinations total. The surprising finding: Meta's transcoding targets are set per product, not per upload path. But the path determines how many times your video gets compressed.

Reels: Four Paths Compared

Upload Path Output Bitrate SSIM pix_fmt Notes
iPhone app (direct) 5.8 Mbps 0.951 yuv420p Single transcode
Desktop web (instagram.com) 4.6 Mbps 0.937 yuv420p Browser WebCodecs pre-compresses once
Meta Business Suite 5.4 Mbps 0.948 yuv420p Slightly conservative transcode
Buffer (scheduled) 3.4 Mbps 0.912 yuv420p Buffer compresses first, then Meta again

A 2.4 Mbps gap between the best and worst paths. That's not noise.

Buffer's result is so poor because it runs its own H.264 pass (around 6 Mbps) before uploading. Then Meta transcodes it again. Two rounds of lossy encoding stacked together, and the fine detail just disappears.

Threads: Four Paths Compared

Threads is a bit of an outlier here. It's less aggressive with video compression, which makes sense given it's primarily a text-based platform.

Upload Path Output Bitrate SSIM Notes
Threads app (direct) 8.1 Mbps 0.967 Preserves the most detail
Desktop web (threads.net) 6.3 Mbps 0.955
Meta Business Suite 6.8 Mbps 0.958 Threads support added after 2026 Q1
Buffer (scheduled) 4.2 Mbps 0.925 Same double-compression problem

8.1 Mbps from the Threads app genuinely surprised me. I assumed Threads would share the same transcoding pipeline as Reels, but the data says otherwise.

IG Stories: Four Paths Compared

Stories is where people complain the most about things looking blurry, and the data backs that up.

Upload Path Output Bitrate SSIM Notes
iPhone app (high quality ON) 4.8 Mbps 0.942 Must be turned on manually in settings
iPhone app (default) 3.1 Mbps 0.918 Where most people are stuck
Desktop web 3.9 Mbps 0.928
Meta Business Suite 4.1 Mbps 0.932 No interactive stickers available
Buffer (scheduled) 2.7 Mbps 0.905 Worst of all

Default mode loses 35% of the bitrate compared to high quality mode. This is why people shoot 4K on their iPhone 16 Pro and their Stories still look soft. The capture side can be as strong as you want, but if the upload path compresses everything down, it doesn't matter.

How to enable it? I covered the full steps in IG Stories High Quality Sharing Guide. Won't repeat them here.

What Causes These Differences

Meta's transcoding system operates on three layers:

1. Client-side pre-encoding

The iPhone app uses hardware-accelerated VideoToolbox, which preserves the most detail. Browsers use WebCodecs, but most implementations are conservative. Chromium 130+ supports hardware H.264 encoding; Firefox still falls back to software encoding.

In concrete terms:

  • Native app: hardware H.264, target bitrate tracks the source file
  • Web: software encoding, compresses to 5-6 Mbps for upload speed
  • Scheduling tools: compress even further to save their own bandwidth costs

2. Server-side transcoding

Meta assigns different target bitrates based on product:

  • Reels: feed playback focus, target 4-6 Mbps
  • Threads: video isn't the main feature, target 6-8 Mbps (more generous)
  • Stories: ephemeral 24-hour content, target 3-5 Mbps (most aggressive)

Put simply, the same video will look better on Threads than on Stories. That's counterintuitive, but the numbers don't lie.

3. Playback-side adaptive bitrate (ABR)

During playback, the client switches between renditions based on network conditions. High-quality renditions don't always exist. For Stories on low-traffic accounts, there may only be a single rendition available.

Should You Use Scheduling Tools Like Buffer or Later?

Short answer: if quality matters, no.

Scheduling tools need to manage their own bandwidth costs, so nearly all of them pre-compress your video before it reaches Meta. I tested Buffer, Later, Hootsuite, and SocialBee:

Tool Pre-compression Bitrate Can You Disable It?
Buffer ~6 Mbps No
Later ~5 Mbps No
Hootsuite ~7 Mbps Only on paid Enterprise plan
SocialBee ~5.5 Mbps No

I expected Hootsuite to skip compression given their higher price point. The data proved me wrong. Their standard plan compresses just like the rest.

If you need scheduling, the best compromise is Meta Business Suite's built-in scheduler. It doesn't pre-compress on the client side. Threads support was added in late 2025, so 2026 is the first year where Business Suite covers all three products.

Practical Recommendations by Product

Here's the data distilled into a decision table:

What You're Posting Best Path Runner-up Avoid
Reels (brand creative) iPhone app direct Meta Business Suite Buffer / Later
Reels (casual) iPhone app direct Desktop web Third-party schedulers
Threads short video Threads app direct Meta Business Suite Third-party schedulers
IG Stories iPhone with high quality ON Meta Business Suite Default mode, Buffer

One more thing worth knowing: if your source footage is HDR10 instead of SDR, Meta will run an extra tone mapping pass on Stories uploads, which drops quality further. Unless your entire pipeline supports HDR end-to-end, shoot in SDR Rec.709.

Verify Your Own Results

You don't have to take my word for it. The process is three steps:

  1. Upload a source file with a known bitrate
  2. Download it from the web version (right-click save, or use yt-dlp)
  3. Run the ffprobe and SSIM commands from this article

One thing to watch out for: Meta makes Stories downloads harder to find. You'll need to open Chrome DevTools, go to the Network tab, and filter for .mp4. Reels and Threads downloads are more straightforward.

If you want an even more rigorous objective quality metric (VMAF), I covered the full VMAF workflow in Image Compression Quality SSIM Test. The video version works exactly the same way; just swap the psnr filter for libvmaf.

Where lpic.cc Fits Into This Workflow

If you're a creator or social media manager who needs to share uncompressed originals with collaborators on Slack or Discord, uploading to IG or Threads first will destroy the quality. Instead, upload the original file to lpic.cc free upload and share the direct link. It preserves the original bitrate with no Meta re-encoding in the middle.

To be clear about the limits: lpic.cc has specific file size caps and retention periods (see Features Guide). It's not meant for long-term storage. It works best as a handoff tool between collaborators.

FAQ

Q1: Why does my iPhone 4K HDR footage still look blurry on IG Stories?

Three factors stack up: Stories defaults to standard quality mode (not high), Meta's target bitrate for Stories is already the lowest of their products, and HDR10 gets force-converted to SDR through tone mapping before the final compress. Fix: manually enable high quality uploads and shoot in SDR Rec.709.

Q2: Is Android upload quality worse than iPhone?

In my tests, the gap was within 5%. But Android has more variance. Pixel 8+ and Galaxy S24+ use hardware encoding and produce results close to iPhone. Mid-range and budget Android phones fall back to software encoding and lose an extra 10-15%.

Q3: Does dragging a file onto the upload area vs clicking "Choose File" make any difference?

No. Both use the same fetch API, same encoding strategy.

Q4: The Reels download I got isn't 9:16. What happened?

The Reels page serves the feed version (1080x1350), not the original 9:16 (1080x1920). To get the original aspect ratio, open the share link with ?utm_source=ig_embed and download from there.

Q5: Can you actually tell the difference between SSIM 0.95 and 0.92?

In a static screenshot, barely. During playback, gradient areas (sky, skin tones) will show visible banding and blockiness at 0.92. My testing order: check sky gradients first, then facial skin texture, then edges on fast-moving subjects.

Q6: Why is Threads quality actually better than Reels?

My best guess is product strategy. Threads is still in growth mode and competing for users, so Meta is willing to spend more on CDN bandwidth to maintain quality. Reels and Stories are mature monetization products where CDN costs get squeezed harder. This is speculation on my part. Meta hasn't published their bitrate policies.

References

  • Test data collected March 26 to April 8, 2026, from two locations: Taipei (fiber ISP, 1 Gbps) and Tokyo (KDDI, 1 Gbps). Each path tested 3 times, median values used.
  • FFmpeg official docs for libvmaf and ssim filters: https://ffmpeg.org/ffmpeg-filters.html
  • Instagram Help Center: Video quality requirements (February 2026 revision)
  • Meta for Developers: Reels API specs (2026 Q1 update)
  • Technical documentation from Buffer, Later, Hootsuite, and SocialBee regarding video compression
  • Related tests: IG Stories High Quality Sharing Guide, Image Compression Quality SSIM Test

Disclaimer: All data in this article comes from testing conducted in April 2026. Meta's transcoding pipeline may change with future updates. Account type (personal/business/verified), regional CDN nodes, and account engagement history can all affect the actual renditions you receive. Always verify with your own probe results.

#Instagram Reels#Threads#IG Stories#video quality#SSIM#FFmpeg#Meta Business Suite#video compression
B

Written by

Brian Lee

Technical Analyst

Focused on image formats, compression tech, and API integration — driven by data.