音视频图片压缩

不一定"必须压缩",但实际项目里,视频/图片经常需要压缩;音频看场景,很多时候可以不压缩

核心判断标准只有一个:

采集数据量 ≤ 传输带宽 / 存储速度 / MCU处理能力

能扛住就不用压缩,扛不住就必须压缩。


1. RGB Image Sensor 采集到的数据是什么?

摄像头出来的原始数据可能是:

text 复制代码
RAW Bayer     // 传感器最原始数据,常见于摄像头内部
YUV422        // 很多摄像头模块直接输出
RGB565        // 16bit 像素,常用于 MCU / LCD
RGB888        // 24bit 像素,数据量更大
JPEG          // 有些摄像头模块内部自带 JPEG 压缩

注意:
摄像头采集到的是一帧一帧的图像。连续很多帧,才叫视频。

text 复制代码
1 张图片 = 1 帧
30 张图片 / 秒 = 30fps 视频

2. 视频数据不压缩有多大?

假设摄像头是 480×800,RGB565,30fps

text 复制代码
一帧大小 = 480 × 800 × 2 字节
        = 768000 字节
        ≈ 750 KB

30fps = 750 KB × 30
      ≈ 22.5 MB/s
      ≈ 180 Mbps

这还只是 RGB565。如果是 RGB888:

text 复制代码
480 × 800 × 3 × 30 ≈ 34.5 MB/s
≈ 276 Mbps

所以如果你想把 RGB 图像实时传到遥控器、手机、上位机:

text 复制代码
不压缩 RGB 视频:数据量非常大
压缩后视频:数据量会小很多

比如压成 MJPEG、H.264、H.265 之后,可能从几百 Mbps 降到几 Mbps,甚至更低。


3. 什么时候可以不压缩视频?

可以不压缩的情况:

text 复制代码
摄像头 → MCU/SoC → 本地 LCD 显示

例如:

text 复制代码
Camera RGB/YUV → ESP32-P4 / STM32 / Linux板 → LCD屏幕

这种场景数据不走无线网络,只在板子内部走并口、MIPI、DMA、PSRAM、显存,就可以不压缩。

但是如果是:

text 复制代码
Camera → Wi-Fi → 遥控器/手机/电脑

那通常就要压缩。


4. 图片数据必须压缩吗?

单张图片也不一定必须压缩。

比如 480×800 RGB565:

text 复制代码
一张图片 ≈ 750 KB

如果你只是偶尔拍一张,通过 Wi-Fi 发出去,可以不压缩,但是比较慢。

如果压缩成 JPEG,可能变成:

text 复制代码
50 KB ~ 200 KB

这就小很多。

所以:

场景 是否建议压缩
拍一张图,存在本地 Flash/SD 卡 建议 JPEG
拍一张图,通过串口发 强烈建议压缩
拍一张图,通过 Wi-Fi 发 建议压缩
摄像头直接给 LCD 显示 可以不压缩
连续视频传输 基本需要压缩

5. 音频数据必须压缩吗?

音频数据比图像小很多,所以很多嵌入式场景可以不压缩

比如语音识别常用:

text 复制代码
16kHz 采样率
16bit
单声道

数据量是:

text 复制代码
16000 × 16bit × 1
= 256 kbps
= 32 KB/s

这个数据量对 Wi-Fi 来说很小。

如果是高质量音频:

text 复制代码
48kHz
16bit
双声道

数据量是:

text 复制代码
48000 × 16bit × 2
= 1.536 Mbps
= 192 KB/s

也不算特别大。

所以音频一般分情况:

场景 建议格式
在线语音识别 PCM 16k/16bit/mono,通常不用压缩
对讲机/远程语音 Opus / AAC / PCM 都可以
音乐播放/传输 AAC / MP3 / Opus 更合适
蓝牙耳机音乐 SBC / AAC / LDAC / LC3 等编码
本地录音短时间保存 PCM/WAV 可以
长时间录音存储 建议压缩

6. 视频、图片、音频对比

类型 原始数据量 是否经常压缩 常见压缩格式
图片 中等 经常压缩 JPEG、PNG、WebP
视频 非常大 基本必须压缩 MJPEG、H.264、H.265
音频 较小 看场景 Opus、AAC、MP3、SBC、LC3
语音识别音频 很小 不一定 PCM / Opus

7. 嵌入式项目里怎么选?

如果你做的是"小车/平衡车图传"

比如:

text 复制代码
摄像头 → 主控 → Wi-Fi → 遥控器

建议:

text 复制代码
低难度方案:MJPEG
效果更好方案:H.264
高级低延迟方案:H.264 + RTP/RTSP/WebRTC

如果你只是"拍照上传"

建议:

text 复制代码
JPEG

如果你做"在线语音识别"

建议:

text 复制代码
PCM 16kHz / 16bit / 单声道

因为很多语音识别服务本来就喜欢 PCM 原始音频。

如果你做"语音对讲"

建议:

text 复制代码
Opus

Opus 对语音延迟和码率控制比较好。


8. 很关键的一点:压缩也要算力

压缩不是白送的。

text 复制代码
不压缩:
优点:简单,延迟低
缺点:带宽大,存储大

压缩:
优点:数据小,适合传输/存储
缺点:占 CPU/硬件编码器,增加延迟,代码复杂

所以 MCU 项目里要看芯片有没有硬件编码能力。

比如:

text 复制代码
普通 ESP32 / ESP32-S3:
不适合做高分辨率实时 H.264 编码

ESP32-P4:
图像能力更强,但是否能做你需要的编码,要看外设和 SDK 支持

RV1103 / RV1106 / RK3568:
更适合做摄像头视频采集、ISP、H.264/H.265 编码、AI视觉

结论

你可以这样记:

text 复制代码
图片:可以不压缩,但上传/存储建议 JPEG
视频:实时传输基本必须压缩
音频:数据量小,语音识别可以直接 PCM,不一定压缩

对于你的图像采集传输项目,更现实的方案是:

text 复制代码
摄像头采集 YUV/RGB
↓
本地显示可以不压缩
↓
远程传输要压缩成 MJPEG / H.264
↓
通过 Wi-Fi / UDP / RTP / RTSP / WebRTC 发出去

音频识别则可以:

text 复制代码
I2S 麦克风 / Codec
↓
PCM 16kHz 16bit 单声道
↓
WebSocket / HTTP / UDP / TCP 上传到云端识别

视频压缩的必要性远远大于音频压缩。




对,无线传输前压缩,接收端通常还要解压/解码,否则接收端拿到的只是"压缩码流",不能直接当 RGB 图像、PCM 音频来用。

更准确地说:

text 复制代码
压缩 / 编码  →  无线传输  →  解压 / 解码
Encode       →  Transmit  →  Decode

1. 视频图像的典型流程

比如摄像头采集到 RGB/YUV 数据:

text 复制代码
摄像头
  ↓
RGB565 / RGB888 / YUV422 原始图像
  ↓
JPEG / MJPEG / H.264 压缩编码
  ↓
Wi-Fi / 4G / 以太网 / 图传
  ↓
接收端收到压缩数据
  ↓
JPEG / H.264 解码
  ↓
RGB / YUV
  ↓
LCD 显示 / APP显示 / 算法处理

也就是:

text 复制代码
发送端:原始图像 → 压缩数据
接收端:压缩数据 → 原始图像

2. 举个具体例子:MJPEG 图传

假设你的小车摄像头每秒采集 30 张图。

发送端:

text 复制代码
Camera 输出 YUV/RGB
↓
每一帧压缩成 JPEG
↓
通过 Wi-Fi 发出去

接收端:

text 复制代码
收到一张 JPEG
↓
JPEG 解码
↓
变成 RGB565 / RGB888
↓
显示到 LCD 或手机屏幕

MJPEG 本质上就是:

text 复制代码
JPEG图片 + JPEG图片 + JPEG图片 + JPEG图片 ...

所以接收端要一帧一帧解 JPEG。


3. 举个具体例子:H.264 视频

H.264 更像真正的视频压缩。

发送端:

text 复制代码
Camera YUV
↓
H.264 编码器
↓
H.264 码流
↓
网络发送

接收端:

text 复制代码
收到 H.264 码流
↓
H.264 解码器
↓
YUV/RGB 图像
↓
显示

H.264 压缩率比 MJPEG 高很多,但是解码复杂度也更高。


4. 音频也是一样

比如麦克风采集到 PCM 原始音频:

text 复制代码
I2S 麦克风 / Codec
↓
PCM 16kHz 16bit 单声道

如果你用 Opus 压缩:

发送端:

text 复制代码
PCM 原始音频
↓
Opus 编码
↓
无线传输

接收端:

text 复制代码
收到 Opus 数据
↓
Opus 解码
↓
PCM 音频
↓
播放 / 语音识别 / 保存

但是如果你本来就直接传 PCM,那接收端就不需要解压,只需要按 PCM 格式播放或处理。


5. 什么时候不需要解压?

有几种情况可以不解压:

场景 1:只是保存文件

比如接收端收到 JPEG 图片后只是保存:

text 复制代码
收到 JPEG → 存到 SD 卡

这种不用解压。

如果收到 H.264 视频流只是保存成文件:

text 复制代码
收到 H.264 → 存成 .h264 / .mp4

也可以不立即解码。


场景 2:继续转发

比如:

text 复制代码
摄像头设备 → 遥控器 → 手机

遥控器只是中转,不显示画面,那遥控器可以不解码,直接转发压缩码流。


场景 3:云端 API 支持压缩格式

比如某些语音识别服务支持 Opus、AAC、MP3,那你上传压缩音频后,云端自己解码,你的设备就不需要解码。


6. 如果要显示,就一定要解码

LCD 屏幕不能直接显示 JPEG/H.264。

LCD 最终需要的是像素数据,例如:

text 复制代码
RGB565
RGB888
ARGB8888
YUV转RGB后的数据

所以:

text 复制代码
JPEG/H.264/PNG/WebP 这些压缩格式
不能直接刷到 LCD
必须先解码成像素点

例如:

text 复制代码
JPEG 文件
↓
JPEG 解码
↓
RGB565
↓
SPI / RGB / MIPI / DMA
↓
LCD 显示

7. 压缩和解压谁更耗性能?

通常:

text 复制代码
编码压缩 > 解码解压

也就是说,压缩端压力一般更大

特别是 H.264/H.265:

text 复制代码
H.264编码:很吃算力,最好有硬件编码器
H.264解码:也吃算力,但很多芯片/手机/电脑都有硬件解码

所以做图传时,发送端芯片很关键。

例如:

芯片/平台 适合做什么
普通 MCU 低分辨率 JPEG / 原始小图
ESP32-S3 小分辨率 JPEG/MJPEG 勉强可以
ESP32-P4 图像采集和显示更强,但要看编码支持
RV1103/RV1106 更适合摄像头 + H.264/H.265 + AI
RK3568 Linux多媒体能力强,适合复杂应用
手机/电脑 解码能力很强

8. 你可以这样理解

压缩就像把一大箱衣服抽真空:

text 复制代码
原始图像/音频 = 一大箱衣服
压缩编码 = 抽真空
无线传输 = 搬运
解码解压 = 打开真空袋
显示/播放 = 正常使用衣服

如果你只是运输和保存,可以不打开。

如果你要看、听、播放、分析,一般就要打开,也就是解码。


结论

你的理解是对的:

text 复制代码
无线传输前压缩,收到后通常要解压/解码。

但要分用途:

text 复制代码
要显示图像/播放声音/算法处理 → 必须解码
只是保存文件 → 可以不解码
只是中转转发 → 可以不解码
云端能识别压缩格式 → 设备端可以不解码

对于你这种"小车/平衡车图像传输到遥控器"的场景,典型流程是:

text 复制代码
车端摄像头采集
↓
车端压缩成 MJPEG 或 H.264
↓
Wi-Fi 发送
↓
遥控器接收
↓
遥控器解码
↓
遥控器屏幕显示



图片需要压缩,本质原因是:原始图片其实就是一大堆像素点,数据量很大。

比如一张 480×800 的图片:

text 复制代码
分辨率 = 480 × 800 = 384000 个像素点

如果是 RGB565

text 复制代码
每个像素 2 字节
图片大小 = 480 × 800 × 2
        = 768000 字节
        ≈ 750 KB

如果是 RGB888

text 复制代码
每个像素 3 字节
图片大小 = 480 × 800 × 3
        = 1152000 字节
        ≈ 1.1 MB

这还只是一张图。如果你要无线传输、存储、上传,就会很占带宽和存储空间。


1. 为什么图片要压缩?

原因一:减少传输时间

比如你用 Wi-Fi、串口、蓝牙、4G 传图片。

一张原始 RGB565 图片大约:

text 复制代码
480×800 RGB565 ≈ 750 KB

压缩成 JPEG 后可能只有:

text 复制代码
50 KB ~ 200 KB

也就是说,数据量可能减少到原来的:

text 复制代码
1/5、1/10,甚至更小

原来要传 750 KB,现在只传 100 KB,速度当然快很多。


原因二:减少存储空间

比如你存到 Flash、SD 卡、文件系统里。

如果不压缩:

text 复制代码
1000 张 480×800 RGB565 图片
≈ 750 MB

如果压缩成 JPEG,每张 100 KB:

text 复制代码
1000 张
≈ 100 MB

差距很大。


原因三:方便网络传输

网络上传输的不是"图片概念",而是一堆字节。

原始图片:

text 复制代码
RGB565 RGB565 RGB565 RGB565 ...

数据很大。

压缩图片:

text 复制代码
JPEG 文件数据

数据小,适合通过:

text 复制代码
TCP
UDP
HTTP
MQTT
WebSocket
RTSP

这些协议传输。


原因四:很多应用本来就需要 JPEG/PNG 格式

比如手机、电脑、网页、服务器常用:

text 复制代码
.jpg
.png
.webp

如果你直接传 RGB565,接收端还得知道:

text 复制代码
宽度是多少?
高度是多少?
每个像素几个字节?
RGB565 是大端还是小端?
一行有没有对齐填充?

而 JPEG、PNG 是标准图片格式,接收端更容易处理。


2. 图片不压缩可以吗?

可以。

比如下面这种场景就可以不压缩:

text 复制代码
摄像头采集 RGB565
↓
MCU / SoC
↓
DMA 直接刷 LCD

这种是本地显示,不经过无线传输,也不长期存储,直接把像素刷到屏幕上。

例如:

text 复制代码
Camera → RGB565 → LCD

这种情况下,压缩反而麻烦,因为 LCD 不能直接显示 JPEG,你压缩完还得解码回来。

所以记住:

text 复制代码
本地显示:可以不压缩
无线传输:建议压缩
存储图片:建议压缩
上传服务器:建议压缩

3. 图片压缩流程是什么样的?

以最常见的 JPEG 压缩 为例。

原始流程大概是:

text 复制代码
摄像头采集
↓
得到 RGB / YUV 原始图像
↓
颜色空间转换
↓
图像分块
↓
DCT 变换
↓
量化
↓
熵编码
↓
生成 JPEG 文件

看起来复杂,我给你按嵌入式角度拆开讲。


4. JPEG 压缩详细流程

第一步:摄像头输出原始图像

摄像头可能输出:

text 复制代码
RGB565
RGB888
YUV422
YUV420
RAW Bayer

例如 RGB565:

text 复制代码
像素1 像素2 像素3 像素4 ...

每个像素都是真实颜色数据。


第二步:RGB 转成 YCbCr

JPEG 一般不是直接压 RGB,而是转成:

text 复制代码
Y  = 亮度
Cb = 蓝色色度
Cr = 红色色度

也就是:

text 复制代码
RGB → YCbCr

为什么要这样?

因为人眼对亮度变化敏感 ,对颜色细节没那么敏感

也就是说,人眼更容易看出:

text 复制代码
亮不亮
清不清楚
边缘锐不锐

但对颜色的小细节不太敏感。

所以 JPEG 会利用这个特点压缩颜色信息。


第三步:色度降采样

常见有:

text 复制代码
4:4:4  不降采样,质量高,数据大
4:2:2  水平方向颜色减半
4:2:0  水平和垂直方向颜色都减半,常见

比如 4 个像素本来都有自己的颜色信息:

text 复制代码
Y1 Cb1 Cr1
Y2 Cb2 Cr2
Y3 Cb3 Cr3
Y4 Cb4 Cr4

压缩时可能变成:

text 复制代码
Y1 Y2 Y3 Y4  都保留
Cb / Cr      减少一部分

亮度信息多保留,颜色信息少保留。

这就是 JPEG 能压缩的原因之一。


第四步:分成 8×8 小块

JPEG 会把图片切成很多个:

text 复制代码
8×8 像素块

比如:

text 复制代码
整张图片
↓
8×8 小块
↓
8×8 小块
↓
8×8 小块
...

后面的压缩就是对每个 8×8 小块处理。


第五步:DCT 变换

DCT 叫做离散余弦变换

你可以先不用纠结数学细节,它的作用是:

text 复制代码
把像素数据
变成
低频信息 + 高频信息

低频信息大概代表:

text 复制代码
整体颜色
整体亮度
大面积平滑变化

高频信息大概代表:

text 复制代码
细小纹理
边缘
噪声
很细的颜色变化

人眼对高频细节没那么敏感,所以 JPEG 后面会重点压缩这些高频信息。


第六步:量化

这是 JPEG 最关键、也是最容易损失画质的一步。

量化的意思是:

text 复制代码
不重要的细节,直接减少精度,甚至丢掉

比如 DCT 后有一堆数:

text 复制代码
120, 25, 8, 3, 1, 0, 0, 0

量化后可能变成:

text 复制代码
12, 2, 1, 0, 0, 0, 0, 0

很多小细节被变成 0。

这一步之后,数据就非常容易压缩了。

JPEG 的"质量等级"主要就是控制量化强度:

text 复制代码
质量高:丢得少,文件大
质量低:丢得多,文件小,但画质差

第七步:Zigzag 扫描

经过量化后,8×8 块里面很多高频数据变成 0。

JPEG 会按一种"之字形"顺序扫描:

text 复制代码
从低频 → 高频

这样可以把很多 0 集中到后面,方便继续压缩。


第八步:RLE + Huffman 编码

这一步属于真正的"编码压缩"。

比如一串数据:

text 复制代码
5, 0, 0, 0, 0, 0, 0, 0

可以表示成:

text 复制代码
5 后面跟 7 个 0

这叫 RLE 游程编码

然后再用 Huffman 编码,把常见的数据用短码表示,不常见的数据用长码表示。

最后生成:

text 复制代码
JPEG 压缩数据

5. JPEG 总流程图

text 复制代码
原始 RGB / YUV 图片
        ↓
颜色空间转换:RGB → YCbCr
        ↓
色度降采样:4:2:2 / 4:2:0
        ↓
切成 8×8 小块
        ↓
DCT 变换:空间像素 → 频率信息
        ↓
量化:丢掉不重要的高频细节
        ↓
Zigzag 扫描
        ↓
RLE 游程编码
        ↓
Huffman 熵编码
        ↓
JPEG 图片文件

6. 接收端解压缩流程

接收端刚好反过来:

text 复制代码
JPEG 文件
↓
Huffman 解码
↓
RLE 解码
↓
反 Zigzag
↓
反量化
↓
IDCT 反变换
↓
YCbCr 转 RGB
↓
得到 RGB565 / RGB888
↓
LCD 显示 / 图像处理

也就是:

text 复制代码
压缩:RGB/YUV → JPEG
解压:JPEG → RGB/YUV

7. PNG 压缩和 JPEG 有啥区别?

JPEG 是有损压缩

text 复制代码
压缩后图片会丢一些细节
适合照片、摄像头图像

PNG 是无损压缩

text 复制代码
压缩后可以完全恢复原图
适合图标、UI、截图、文字图片

简单对比:

格式 是否有损 适合场景
JPEG 有损 摄像头照片、图传、自然图像
PNG 无损 图标、UI、截图、透明背景
BMP 不压缩 简单但文件大
WebP 可有损/无损 Web 图片
RAW/RGB 不压缩 本地显示、算法处理

8. 嵌入式里图片压缩怎么做?

方案一:摄像头模块自己输出 JPEG

这是最省事的。

比如一些摄像头模组内部带 JPEG 编码器:

text 复制代码
摄像头
↓
直接输出 JPEG 数据
↓
MCU 只负责接收和发送

典型例子:

text 复制代码
OV2640 可以直接输出 JPEG

这种对 MCU 压力小,非常适合 ESP32-CAM 这种方案。


方案二:主控芯片软件压缩 JPEG

流程:

text 复制代码
摄像头输出 RGB/YUV
↓
MCU/SoC 内存保存一帧
↓
CPU 软件 JPEG 编码
↓
发送 / 存储

缺点是:

text 复制代码
占 CPU
占 RAM
速度慢
功耗高

普通 MCU 做高分辨率 JPEG 软件编码会比较吃力。


方案三:主控有硬件 JPEG 编码器

一些 SoC 有硬件 JPEG 编码模块:

text 复制代码
Camera → DMA → JPEG Encoder → Memory → Wi-Fi/SD

这种效率高,适合实时图像传输。


9. 压缩图片和压缩视频区别

图片压缩,比如 JPEG:

text 复制代码
每张图片单独压缩

视频压缩,比如 H.264:

text 复制代码
不仅压缩一张图内部
还会压缩前后帧之间的重复内容

比如视频里背景不动,只有人动。

JPEG/MJPEG 会每一帧都完整压缩:

text 复制代码
第1帧 JPEG
第2帧 JPEG
第3帧 JPEG

H.264 会利用前后帧关系:

text 复制代码
第1帧:完整画面
第2帧:只记录变化部分
第3帧:只记录变化部分

所以:

text 复制代码
JPEG/MJPEG:简单,延迟低,压缩率一般
H.264/H.265:复杂,压缩率高,适合视频

10. 对你的项目怎么选?

如果你是做:

text 复制代码
摄像头 → 小车/平衡车 → 无线传输 → 遥控器显示

建议优先级是:

低难度方案

text 复制代码
摄像头直接输出 JPEG
↓
Wi-Fi 发送 JPEG
↓
遥控器接收 JPEG
↓
解码显示

也就是 MJPEG 图传。

优点:

text 复制代码
简单
容易调试
每帧都是独立图片
丢一帧不影响下一帧

缺点:

text 复制代码
码率比 H.264 大
画质/带宽效率一般

更专业方案

text 复制代码
摄像头输出 YUV
↓
H.264 硬件编码
↓
Wi-Fi 发送 H.264 码流
↓
接收端 H.264 解码
↓
显示

优点:

text 复制代码
带宽低
画质更好
适合实时视频

缺点:

text 复制代码
编码复杂
需要硬件编码器
软件开发难度更高

结论

图片要压缩,是因为:

text 复制代码
原始 RGB/YUV 图片太大
无线传输慢
存储占空间
网络带宽吃不消

图片压缩流程,拿 JPEG 来说就是:

text 复制代码
RGB/YUV 原始图像
↓
颜色转换
↓
分块
↓
DCT 变换
↓
量化丢掉不敏感细节
↓
熵编码
↓
JPEG 文件

嵌入式里你可以这样记:

text 复制代码
本地 LCD 显示:可以不压缩
拍照保存/上传:建议 JPEG
实时无线图传:MJPEG 或 H.264
普通 MCU:尽量用摄像头自带 JPEG
Linux/视频 SoC:优先用 H.264/H.265



不能把 JPEG/MJPEG 压缩数据直接刷到普通 LCD 上显示。

普通 LCD 控制器最终要的是:

text 复制代码
RGB565
RGB888
ARGB8888
YUV 转 RGB 后的数据

而 JPEG/MJPEG 是压缩后的码流,LCD 不认识。


1. JPEG 图片能不能直接显示?

要分"谁来显示"。

情况一:普通 MCU + 普通 LCD

比如:

text 复制代码
ESP32 / STM32 / GD32
↓
SPI LCD / RGB LCD / MIPI LCD

这种情况下,不能直接显示 JPEG

因为你的 LCD 驱动通常是这种方式:

c 复制代码
lcd_draw_bitmap(x1, y1, x2, y2, rgb565_buffer);

它要的是一块像素数据,例如:

text 复制代码
0xF800  // 红色像素 RGB565
0x07E0  // 绿色像素 RGB565
0x001F  // 蓝色像素 RGB565

但是 JPEG 文件里面不是像素点,而是压缩编码数据:

text 复制代码
FF D8 FF E0 ... FF DA ... FF D9

LCD 控制器看不懂这个。

所以 JPEG 显示流程应该是:

text 复制代码
JPEG 文件/数据
↓
JPEG 解码器
↓
RGB565 / RGB888 像素数据
↓
LCD 显示

2. MJPEG 能不能直接显示?

MJPEG 也不能直接刷 LCD。

MJPEG 本质是:

text 复制代码
JPEG 第1帧
JPEG 第2帧
JPEG 第3帧
JPEG 第4帧
...

也就是很多张 JPEG 图片连续播放。

所以 MJPEG 显示流程是:

text 复制代码
收到 MJPEG 数据流
↓
拆出一帧 JPEG
↓
JPEG 解码成 RGB565 / RGB888
↓
刷到 LCD
↓
再拆下一帧 JPEG
↓
再解码
↓
再显示

流程图:

text 复制代码
MJPEG Stream
    ↓
提取 JPEG Frame
    ↓
JPEG Decode
    ↓
RGB565 Framebuffer
    ↓
LCD Display

所以严格来说:

text 复制代码
MJPEG 不能直接显示
MJPEG 要先拆帧,再 JPEG 解码,再显示

3. 为什么电脑/手机好像可以直接打开 JPEG?

因为电脑和手机的软件帮你解码了。

比如你双击一张 .jpg 图片:

text 复制代码
JPEG 文件
↓
Windows 图片查看器 / 浏览器 / 手机相册
↓
软件或硬件 JPEG 解码
↓
显卡/屏幕显示 RGB 像素

你感觉是"直接显示",其实中间已经完成了解码。


4. 哪些设备可以"看起来直接显示 JPEG"?

有些高级显示模块、浏览器、播放器、手机 App 可以直接接收 JPEG/MJPEG。

但本质上是它们内部有解码器。

比如:

设备/软件 能否直接给 JPEG 本质
普通 SPI LCD 不能 只收 RGB 像素
普通 RGB LCD,例如 ST7701S 不能 只收 RGB 数据流
LVGL 普通 image 控件 默认不一定能 需要 JPEG decoder
浏览器 <img src="xxx.jpg"> 可以 浏览器内部解码
手机 App 显示 JPEG 可以 App/系统内部解码
某些智能串口屏 可能可以 模块内部解码
Linux 显示系统 可以 系统/库/硬件解码

5. 结合你的 ESP32-S3 / RGB LCD 场景

你之前做的是:

text 复制代码
ESP32-S3
↓
ST7701S
↓
RGB565 / RGB 并口 LCD

这种屏幕不能直接显示 JPEG/MJPEG。

因为 ST7701S 这类 RGB 屏的输入本质是:

text 复制代码
R[0:n]
G[0:n]
B[0:n]
PCLK
DE
HSYNC
VSYNC

它吃的是连续像素流,不吃 JPEG 文件。

所以你要显示 JPEG,应该是:

text 复制代码
SD卡 / 网络 / 摄像头 获取 JPEG
↓
ESP32-S3 软件 JPEG 解码
↓
得到 RGB565 buffer
↓
esp_lcd_panel_draw_bitmap()
↓
ST7701S 显示

6. 如果是摄像头图传到遥控器

发送端:

text 复制代码
摄像头
↓
JPEG/MJPEG 编码
↓
Wi-Fi 发送

接收端:

text 复制代码
Wi-Fi 接收
↓
得到 JPEG/MJPEG 数据
↓
JPEG 解码
↓
RGB565
↓
LCD 显示

也就是:

text 复制代码
压缩是为了传输
解码是为了显示

7. JPEG 解码会占什么资源?

JPEG 解码需要:

text 复制代码
CPU 算力
RAM 缓冲区
解码库
显示帧缓冲

对 MCU 来说,主要压力是:

text 复制代码
分辨率越高,解码越慢
图片越大,RAM 越吃紧
帧率越高,CPU 压力越大

比如 480×800 JPEG:

text 复制代码
解码后 RGB565 大小 = 480 × 800 × 2
                   ≈ 750 KB

如果你的设备没有足够 RAM,就不能一次性解完整帧,可以用分块解码/行解码

text 复制代码
JPEG
↓
每次解码 8 行 / 16 行 / 一小块
↓
立刻刷到 LCD
↓
继续解下一块

这样可以省内存。


8. 总结一句话

你可以这样记:

text 复制代码
JPEG / MJPEG 是压缩格式,适合传输和存储;
RGB565 / RGB888 是像素格式,适合 LCD 显示。

所以:

text 复制代码
JPEG 图片不能直接刷普通 LCD
MJPEG 视频也不能直接刷普通 LCD
必须先解码成 RGB565/RGB888/YUV,再显示

对于你的嵌入式项目,正确流程是:

text 复制代码
JPEG/MJPEG 数据
↓
JPEG 解码
↓
RGB565 图像缓冲
↓
LCD 显示
相关推荐
日取其半万世不竭2 小时前
PeerTube 部署指南:自建视频托管平台
云原生·eureka·音视频
luoqice2 小时前
FLV文件解析
音视频
byte轻骑兵4 小时前
【AVRCP】规范精讲[10]:链路管理器LM互操作规则与场景落地
人工智能·音视频·蓝牙·avrcp·音视频控制
JK Chen5 小时前
faster_whisper,视频转文字,并生成字幕文件
python·whisper·音视频
Prannt1 天前
星朗智能语音——语音合成——上传文件配音
ai·音视频·语音识别
byte轻骑兵1 天前
【AVRCP】规范精讲[7]: 打通AVCTP互操作底层,吃透事务标签与分片规则
人工智能·音视频·avrcp·音视频控制
EasyGBS1 天前
国标GB28181视频平台EasyGBS即将重磅新增WHIP推流功能!低延迟直播体验再升级
音视频
jiejiejiejie_1 天前
Flutter for OpenHarmony 萌系实战合集:地图功能 + 音频播放一站式指南
flutter·音视频
jbk33111 天前
10分钟翻译一条视频,实现语音、字幕翻译后与画面同步对齐,视频翻译助手使用教程
人工智能·音视频·剪辑软件·剪映自动化软件