全志开发板

登录信息

  • 本地 IP:192.168.0.104
  • SSH 用户名:root
  • SSH 密码:root
  • 登录命令:ssh root@192.168.0.104

注意:此文件包含明文密码,不要上传到公开仓库或发送给无关人员。

外设

  • USB 摄像头:VGA Webcam: HGX Camera
  • 驱动:Linux UVC (uvcvideo)
  • 设备节点:/dev/video0
  • 支持格式:
    • YUYV:640×480 / 480×480,标称 25 fps
    • MJPEG:640×480 / 480×480,标称 25 fps
  • 摄像头没有枚举出 USB 麦克风

学习目标

  • 全志平台音视频开发
  • 摄像头采集、编码、传输与播放
  • 网络摄像头 / 视频监控应用

2026-08-16 现场探测

SSH 已成功登录,当前环境如下:

  • 开发板:野火鲁班猫 A1(设备树 sun50iw9-lubancat-a1.dtb)
  • SoC:全志 H616(allwinner,h616 / sun50iw9)
  • CPU:4 核 Cortex-A53,最高 1.512 GHz,AArch64
  • 内存:约 4 GB
  • 系统:Ubuntu 22.04.4 LTS
  • 内核:Linux 5.4.125,全志 BSP 内核
  • 视频硬件设备:存在 /dev/cedar_dev
  • 已安装:v4l-utils、GStreamer 核心库
  • 尚未安装:FFmpeg、GStreamer 命令行工具和常用插件
  • ALSA 当前只有板载音频设备,没有可直接使用的真实录音输入;学习音频采集时可加一个 USB 麦克风或 USB 声卡

摄像头已通过 v4l2-ctl 连续抓取 50 帧,数据流可以正常启动。虽然设备标称 25 fps,本次实测约 13~14 fps;后续需要从光照/自动曝光、USB 链路和驱动参数三个方向确认瓶颈。

常用检查命令:

v4l2-ctl --all -d /dev/video0
v4l2-ctl --list-formats-ext -d /dev/video0
v4l2-ctl -d /dev/video0 \
  --set-fmt-video=width=640,height=480,pixelformat=MJPG \
  --set-parm=25 --stream-mmap=3 --stream-count=100 --stream-to=/dev/null

推荐学习路线

第一阶段:先弄懂 Linux 通用音视频接口

先不要碰全志私有库,掌握这些概念:

  1. V4L2 的设备、格式、分辨率、帧率和 controls。
  2. YUYV、NV12、MJPEG、H.264 的区别;原始帧与压缩码流的区别。
  3. REQBUFS、mmap、QBUF/DQBUF、poll,以及每帧的时间戳。
  4. ALSA 的声卡、PCM、采样率、采样格式、period/buffer。

第一个小项目:用 v4l2-ctl 抓一张 MJPEG 图片;然后用 C 写一个 V4L2 mmap 程序,连续取帧并统计真实 fps。

第二阶段:跑通第一条网络视频链路

建议安装:

apt update
apt install ffmpeg gstreamer1.0-tools \
  gstreamer1.0-plugins-base gstreamer1.0-plugins-good \
  gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

优先使用摄像头原生 MJPEG,不做二次编码。开发板发送 RTP/JPEG(把接收端 IP 换成电脑 IP):

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \
  'image/jpeg,width=640,height=480,framerate=25/1' ! \
  rtpjpegpay ! udpsink host=192.168.0.103 port=5000

电脑接收:

gst-launch-1.0 -v udpsrc port=5000 \
  caps='application/x-rtp,media=video,encoding-name=JPEG,payload=26' ! \
  rtpjpegdepay ! jpegdec ! autovideosink

这个阶段重点理解 RTP 包、UDP 丢包、延迟和接收端抖动缓冲,不要急着做网页播放器。

第三阶段:H.264、RTSP 与浏览器观看

先用软件 x264 在 640×480 下学习编码参数:码率、GOP、关键帧、低延迟和码率控制。然后引入 MediaMTX 一类现成服务器:

/dev/video0 -> V4L2 -> H.264 编码 -> RTSP/MediaMTX
                                    -> VLC
                                    -> WebRTC/HLS -> 浏览器

RTSP 适合 VLC/监控客户端,但浏览器一般不能直接播放 RTSP;需要转换为 WebRTC 或 HLS。把“采集/编码”和“流媒体服务器”拆开学习,比从零实现 RTSP 服务器更合适。

第四阶段:用 C/C++ 做应用

建议按这个顺序写:

  1. V4L2 mmap 抓帧器。
  2. libjpeg-turbo 解 MJPEG,或直接转交压缩帧。
  3. GStreamer appsink/appsrc 接入自己的业务代码。
  4. 增加断线重连、帧率统计、队列上限和丢帧策略。
  5. 接入 USB 麦克风,用 ALSA 采集 PCM,再编码 Opus/AAC。
  6. 用 PTS 做音画同步;不要依靠“每秒固定多少帧”推算时间。

开发依赖可按需安装:

apt install build-essential cmake pkg-config libv4l-dev libturbojpeg0-dev \
  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libasound2-dev

第五阶段:全志 H616 硬件编解码

当前 /dev/cedar_dev 只说明 BSP 内核提供了 Video Engine 接口;系统里没有发现配套的 CedarX/VideoEngine 用户态库,不能仅凭这个设备节点直接让 Ubuntu 自带 FFmpeg 硬编。

这一步应使用与鲁班猫 A1 当前 BSP/内核匹配的野火或全志 SDK,重点找这些内容:

  • CedarX / VideoEngine / VEncoder 示例和库
  • H.264 编码示例、DMA/物理连续内存分配方式
  • 摄像头帧到编码器的零拷贝路径
  • 编码器输出 Annex-B H.264 后交给 GStreamer/FFmpeg/MediaMTX 推流

不要混用其他 H616 镜像里的二进制库,也不要把主线 Linux 的 Cedrus 解码接口和厂商 BSP 的 CedarX 接口当成同一套 API。先确认官方 SDK 与 5.4.125 内核、AArch64 用户态完全匹配。

建议的练手项目

按完成顺序:

  1. camera-info:打印摄像头能力、格式和 controls。
  2. v4l2-capture:mmap 取帧并计算 fps,保存单帧 JPEG。
  3. rtp-mjpeg-camera:把原生 MJPEG 通过 RTP 发到电脑。
  4. rtsp-h264-camera:软件 H.264 + MediaMTX,VLC 可观看。
  5. av-camera:USB 麦克风 + 摄像头,完成时间戳和音画同步。
  6. h616-hw-camera:把软件 H.264 替换为全志硬件编码,比较 CPU、延迟、功耗和画质。