🍓 第十章 相机模块与视频串流
📄 一句话概括

拍照录像全靠一套命令行工具:rpicam-still 拍照、rpicam-vid 录像、rpicam-hello 预览——raspistill/raspivid 这对老命令已经删除,libcamera- 也已改名 rpicam-,网上的老命令一律要换名字再跑。

📝 本节和前面几节的关系

10-2 确认系统看得见相机,本节正式【开机使用】——全走终端命令,正是本课无头 SSH 环境的主场。4-1/4-2 的命令行常识(参数、路径、Ctrl+C)全要派上用场;【预览窗口需要显示器】这件事和 4-6 的教训同源:会话级的活儿在 SSH 里做不生效。

一、命令换代史:三批名字,只记最后一批

年代 拍照 录像 现状
老系统(Bullseye 之前) raspistill raspivid 已删除,Bookworm 起不存在
Bullseye 过渡期 libcamera-still libcamera-vid 已改名,当前系统用不了
现在(Bookworm 起) rpicam-still rpicam-vid 本课标准

全套工具叫 rpicam-apps,成员五件套:rpicam-hello(预览)、rpicam-jpeg(快照)、rpicam-still(拍照全家桶)、rpicam-vid(录像)、rpicam-raw(原始数据)。

判断技巧:网上教程命令以 raspi- 或 libcamera- 开头的,一律先在心里替换成 rpicam- 再跑;参数大体通用,个别要查 --help。

二、拍照:rpicam-still 与它的常用参数

# 最简拍照:默认先显示 5 秒预览再拍(要有显示器/VNC)
rpicam-still -o photo.jpg

# 无头环境(本课):--immediate 立即拍,不弹预览
rpicam-still --immediate -o photo.jpg

# 指定分辨率(Module 3 全尺寸 4608×2592)
rpicam-still --immediate --width 4608 --height 2592 -o full.jpg

# JPEG 之外再存一份 RAW(10-2 算过:约 14 MiB)
rpicam-still --immediate -o photo.jpg --raw

# 翻转画面(相机装倒了的救急)
rpicam-still --immediate --hflip -o photo.jpg   # 水平翻
rpicam-still --immediate --vflip -o photo.jpg   # 垂直翻

Module 3 专属——对焦:

rpicam-still --immediate --autofocus-mode auto -o a.jpg    # 拍前自动对一次焦
rpicam-still --immediate --lens-position 0.5 -o b.jpg      # 手动:0=无穷远,越大越近

rpicam-jpeg -o x.jpg 是【快枪手】版本(参数少、更快),日常用 rpicam-still 就够。

三、录像:rpicam-vid

# 录 10 秒视频(-t 单位毫秒,也可写 10s)
rpicam-vid -t 10s -o video.h264

# 直接出 MP4(封装成 mp4 容器,新版系统支持)
rpicam-vid -t 10s --codec libav -o video.mp4

# 全高清 30 帧
rpicam-vid -t 10s --width 1920 --height 1080 --framerate 30 -o hd.h264

两个理解要点:

四、预览与无头环境的相处之道

rpicam-hello 会弹一个实时预览窗口——它要显示器或 VNC。本课的 SSH 无头环境里:

这不是相机坏了——4-6 的教训原样适用:图形界面的活儿别指望 SSH 会话。

五、延时摄影:一条命令拍一小时

# 每 2 秒拍一张,总共拍 60 秒,文件名自动编号
rpicam-still -t 60000 --timelapse 2000 -o frame_%04d.jpg

# 之后用 ffmpeg 把照片合成视频(25 帧每秒)
ffmpeg -framerate 25 -i frame_%04d.jpg -c:v libx264 timelapse.mp4

%04d 是编号占位:frame_0001.jpg、frame_0002.jpg……延时摄影的原理就是把【慢变化】用【定间隔拍照+快放】压成【快变化】——种子发芽、日出日落都是这么拍的。

六、动手 Demo:拍照三连+一段小视频

cd ~
# ① 快照
rpicam-jpeg -o snap.jpg
# ② 全尺寸照(Module 3)
rpicam-still --immediate --width 4608 --height 2592 -o full.jpg
# ③ 录 5 秒 MP4
rpicam-vid -t 5s --codec libav -o clip.mp4
# 验收
ls -lh snap.jpg full.jpg clip.mp4

看到什么算成功:三个文件都在,snap.jpg 约几百 KB 到几 MB,full.jpg 明显更大(全尺寸像素多),clip.mp4 按秒数大小合理。把 jpg 拷回 Windows(3-6 的 scp 还记得吗)打开看内容。

读结果:full.jpg 与 snap.jpg 的体积差就是【分辨率决定数据量】的实物证据;clip.mp4 能播放说明编码器正常工作——这颗芯片里有专门的硬件编码器,10-5 串流就靠它。

七、30 秒实验:延时摄影的账

用 rpicam-still -t 60000 --timelapse 2000 拍:

  1. 一共拍几张?
  2. 想拍 30 分钟、最终合成 25 帧每秒、播放 30 秒的延时视频——拍照间隔该设多少?

参考答案:1. 60000 ms ÷ 2000 ms = 30 张。2. 需要 30 × 25 = 750 张;30 分钟 = 1800 秒,间隔 = 1800 ÷ 750 = 2.4 秒(即 -t 1800000 --timelapse 2400)——先定【最终视频要多长】,倒推【要几张】,再算【间隔】,这个顺序别倒。

八、常见误区

  1. 【照抄教程里的 raspistill】 —— 命令已删除,换 rpicam-still;同理 raspivid → rpicam-vid。
  2. 【在 SSH 里跑 rpicam-hello 报错,以为相机坏了】 —— 预览窗口要显示器/VNC;无头环境用 --immediate/-n。
  3. 【-t 5000 是【5 秒后拍】的意思】 —— 它是【预览 5 秒再拍】(总耗时 5 秒);要立即拍用 --immediate。
  4. 【h264 文件改名成 .mp4 就能播】 —— 改名只换名字不换封装;要真转:ffmpeg -i video.h264 -c copy video.mp4(-c copy 表示不重新编码、只重新打包)。
  5. 【--raw 拍出来的照片更清晰】 —— RAW 只是信息更全(方便后期),看起来未必更漂亮;而且一张约 14 MiB,连拍很快塞满卡。
自测三问(点开对答案) 1. 网上教程写 `libcamera-still -o x.jpg`,在当前系统怎么跑? 2. 无头 SSH 环境拍一张全尺寸照片的命令? 3. `-t 0 -o live.h264` 会发生什么? **参考答案** 1. 换名:`rpicam-still -o x.jpg`——libcamera-* 在 Bookworm 起已改名 rpicam-*。 2. `rpicam-still --immediate --width 4608 --height 2592 -o x.jpg`(Module 3;`--immediate` 免去预览窗口)。 3. **无限录像**直到 Ctrl+C——`-t 0` 表示不限时;硬盘会被慢慢写满,别忘了停。

相关笔记