850kbps 离线文件传输:libcimbar 把屏幕和摄像头变成信道
2026/9/24 17:24:23 网站建设 项目流程

850kbps 离线文件传输:libcimbar 把屏幕和摄像头变成信道

【免费下载链接】libcimbarOptimized implementation for color-icon-matrix barcodes项目地址: https://gitcode.com/GitHub_Trending/li/libcimbar

libcimbar 是一款做离线文件传输的 C++ 库:编码端把文件渲染成在屏幕上翻动的彩色矩阵条形码动画,接收端用手机摄像头逐帧拍摄还原,全程不碰网络、蓝牙和 NFC,实测稳定在 850kbps(约 106KB/s)。发送端有命令行工具,也有能在任何现代浏览器里跑的 wasm 构建;接收端是 Android 应用。

它到底在干什么

输入是一个文件,输出是一串 1024×1024 像素的彩色条码帧,可以在显示器上滚动播放;接收端摄像头逐帧拍摄,凑够足够多的帧后重建出原文件。相当于用闪光灯发莫尔斯电码,只是信道换成了屏幕光,密度高了几万倍。

原理拆解:数据是怎么传过去的

编码:一格瓦片装 6 比特

整张条码是 1024×1024 像素的方格阵,每格画一个符号:16 种符号占 4 比特,再选 4 种颜色之一占 2 比特,每格共 6 比特,上限 9300 字节/帧。符号是 8×8 像素的手绘小图案,挑选标准是任意两格的像素指纹(图像哈希,即把像素黑白化后得到的 64 位二进制)汉明距离足够大——隔着镜头拍糊一点,依然能认出"最像哪一个"。

纠错:给"拍糊了"预留冗余

隔着镜头读屏幕天然有损:模糊、曝光不足、镜头畸变都会混进来。默认用 Reed Solomon 纠错(一种按块补冗余、能修掉一定数量坏字节的编码),参数 30/155:每 125 字节真实数据附加 30 字节纠错码,所以每帧实际只承载 7500 字节。作者实测错误率低于 1%,且能被完全修正;纠错块还按"跳 N 格"交错铺满全图,手指或遮挡造成的局部连片错误不会一次毁掉一整段数据。

文件协议:fountain 码解决无网络传大文件

单帧只有 7500 字节,大文件先经 zstd 压缩,再用 fountain 码(wirehair 库实现,一种"收到任意足够多分片就能拼回原件"的编码)切成独立编码块:不挑顺序、允许缺帧,乱序、损坏、丢失都能拼回原文件,这也是无网络传大文件成立的根本。代价是压缩后文件上限 33.55MB,因为解码端要把内容放进内存。

解码:先找锚点,再按置信度读格

解码端先找四角的方形锚点确定四个角(和 QR 码定位同理),做透视变换把歪斜画面拉正,再逐格识别符号。它不按固定顺序硬读,而是从置信度高的格子先解起,并把局部形变(漂移)记录下来指导下一个格子——某处拍糊时,错误被压到低置信度区域,纠错码兜底的成功率更高。

跑起来有多快:离线文件传输实测 ⚡

来源 PERFORMANCE.md,解码端是一台老款骁龙 625 手机(4 线程),发送端是浏览器 wasm 构建:

  • mode B(8×8 符号、4 色):4,689,084 字节(压缩后)44 秒传完,852 kbit/s(≈106 KB/s)
  • 每帧纠错后承载 7500 字节真实数据,上限 9300 字节
  • 错误率低于 1%,Reed Solomon 可完全修正(见 README.md)
  • 单文件上限 33.55MB(压缩后)
  • 格式支持低至 700×700 分辨率的拍摄画面

和蓝牙、NFC 比,它不需要配对也不需要近场;代价是必须"脸对脸"——摄像头正对屏幕、环境光好、条码占满取景框,实测更稳。

上手路径 📦

装什么:一条 apt 装齐解码依赖

解码端依赖 OpenCV 和 GLFW,其余依赖都已包含在源码树里:

sudo apt install libopencv-dev libglfw3-dev libgles2-mesa-dev

apt 报告安装成功即可,没有其他输出。

怎么编:clone 后三条命令出可执行文件

git clone https://gitcode.com/GitHub_Trending/li/libcimbar cd libcimbar cmake . && make -j7 && make install

跑完构建产物落在./dist/bin/,能看到cimbarcimbar_send等可执行文件。

怎么用一次:编码、解码、实时播放

./cimbar --encode -i inputfile.txt -o out # 编码出一串 png ./cimbar out*.png -o /tmp # 从 png 解回文件 ./cimbar_send inputfile.pdf # 窗口里实时播放动画条码

第三条会弹出窗口滚动播放动画条码,用手机解码 App 对着拍即可;解码out*.png/tmp里能看到还原出来的 inputfile.txt。Windows(MSVC+vcpkg,尽力支持)与 Android(仅解码)的构建差异见 README.md 和 WASM.md。

气隙数据交换:谁会在什么场景下真的用它 🔒

  • 气隙机房交接:运维在禁止 U 盘、断网的隔离环境里,把配置文件从办公终端传到产线设备
  • 无网应急联络:断网无信号场合,把一段文本或联系方式从笔记本传进手机
  • 洁净区作业:不想让存储介质进出洁净区的人,拿摄像头当传输介质
  • 现场演示:展会或课堂网络不稳时,不依赖任何连接把演示文件送到观众手机
  • 离线备份:给重要小文件建一份"拍进手机"的气隙数据交换副本

项目现状与下一步

当前测试覆盖 amd64+linux、arm64+android(仅解码)、emscripten+WASM(仅编码),Windows 为尽力支持。TODO.md 列出的近期方向包括:换用更强的纠错码(预期吞吐提升 6–15%)、多帧联合解码以提高静态图成功率,以及把方形网格改成 4:3 形状。

850kbps 不算快,但它的信道只是一块屏幕加一个摄像头——离线文件传输从此不需要任何线缆和协议栈。

【免费下载链接】libcimbarOptimized implementation for color-icon-matrix barcodes项目地址: https://gitcode.com/GitHub_Trending/li/libcimbar

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询