【K230/K230D 新技能点亮】K230 CanMV MJPEG 能力解锁,局域网浏览器实时预览摄像头画面

Viewed 61

问题描述


各位开发者朋友们,CanMV又迎来实用能力更新🎉!
本次正式上线 MJPEGEncoder 硬件JPEG编码模块,依托K230/K230D内置VENC硬件编码器,结合配套Web视频流例程,无需安装任何播放器,局域网内浏览器即可直接查看摄像头实时画面,快速实现嵌入式Web摄像头、远程预览、截图抓拍等场景。
image.png

一、什么是MJPEGEncoder

MJPEGEncoder 直接调用芯片VENC硬件编码单元,支持将Sensor输出YUV视频帧、image.Image图像编码为完整JPEG字节流。

✅ 硬件编码,不占用CPU,兼顾性能与功耗;
✅ 优先直接编码Sensor VB视频帧,避免图像内存拷贝,高分辨率下性能更优;
✅ JPEG质量可配置,范围1‑99,灵活平衡画质与带宽;
✅ 自动管理VENC通道与VB缓冲区,资源按需申请,使用完毕调用close()即可释放硬件资源。

导入方式

from media.mjpeg import MJPEGEncoder

开箱即用:MJPEG网页视频流例程

SDK内置完整Web MJPEG图传例程mjpeg_web_server.py,基于HTTP multipart/x‑mixed‑replace协议,手机、电脑浏览器直接访问即可预览实时画面,不用部署流媒体服务、不用安装VLC等播放器。

文件位置

开发板固件路径:/sdcard/examples/02‑Media/mjpeg_web_server.py
SDK源码路径:src/canmv/resources/examples/02‑Media/mjpeg_web_server.py

核心配置项

脚本头部可直接修改网络、分辨率、编码质量、帧率等参数:

  • 支持WiFi‑STA / WiFi‑AP / LAN有线网络;
  • FRAME_ALIGNMENT=12,适配VENC硬件4096字节对齐要求;
  • JPEG_QUALITY调节图片压缩质量;
  • STREAM_FPS设置视频流帧率上限。

接口能力

例程内置3个HTTP接口,开箱可用:

访问路径 功能说明
/ Web实时预览主页,内置JS断线自动重连
/stream MJPEG视频流数据流接口
/snapshot.jpg 获取当前时刻单帧截图JPEG

运行脚本后,串口打印访问地址,同局域网设备浏览器打开地址即可查看画面。网页内置异常重连逻辑,流断开后自动重试,无需手动刷新页面。

大帧网络发送优化

针对1080P大尺寸JPEG传输容易超时断开的痛点,例程做了专门优化: Socket设置为非阻塞模式,JPEG数据包按16KiB分块发送;遇到EAGAIN临时阻塞会持续重试;连续5秒无发送进度才关闭客户端,有效解决TCP回压导致画面只出一帧就断开的问题。

使用注意要点

  1. Sensor输出YUV帧务必设置 alignment=12,保证图像平面4096字节对齐,否则VENC编码会报错;高分辨率场景务必开启USE_VIDEO_FRAME=True,直接使用Sensor视频帧,减少内存拷贝开销。

  2. 当前例程为单客户端同步模型,同一时刻仅支持一个浏览器连接视频流。

  3. 实际帧率受WiFi带宽、编码质量、浏览器消费速度影响;画面延迟高可以降低分辨率、降低JPEG质量、下调目标帧率。

  4. 脚本退出会自动关闭Socket、编码器、Sensor,防止VENC通道、VB缓冲池资源泄漏。

简单编码示例

from media.mjpeg import MJPEGEncoder
from media.sensor import Sensor

sensor = Sensor()
encoder = None
try:
    sensor.reset()
    sensor.set_framesize(width=1920, height=1080, alignment=12)
    sensor.set_pixformat(Sensor.YUV420SP)
    sensor.run()

    encoder = MJPEGEncoder(quality=50)
    frame = sensor.snapshot(dump_frame=True)
    jpeg_data = encoder.encode(frame, timeout_ms=1000)

    # 可写入文件 / 通过socket发送
    with open("/sdcard/snapshot.jpg","wb") as f:
        f.write(jpeg_data)
finally:
    if encoder is not None:
        encoder.close()
    sensor.stop()

适用场景

  • AI项目调试远程预览摄像头画面;
  • 简易嵌入式Web监控、无线图传;
  • 抓拍截图,本地保存JPEG图像;
  • 与K230 NPU推理结合,实现AI识别结果网页可视化。

参考文档

快去更新固件,上手体验硬件MJPEG编码,欢迎在评论区分享你的项目作品

1 Answers