这个项目我想做好久了,起因是之前看到 @XINGRZ 导演的云监工项目,就也想自己拍点什么东西玩玩。正好买方舟的设定集里面送了一些白晶菊的种子,也是我第一次自己种植花草,就打算做一个延时摄影记录它的生长,顺便在 B 站直播整个过程,想想还是非常有意思的。

设备选择

之前为了做毕设买的树莓派 4B 现在一直在身边闲置着,就想着用它来做为这次的主要直播设备,负责图像采集、推流以及保存延时摄影画面。

Raspberry Pi 4 Model B

摄像头方面,我原本是想用手头的佳能 750D 相机,还找到一个项目叫做 gphoto2,可以通过树莓派来控制相机。至于续航方面,可以在淘宝购买一块 USB 供电的假电池来解决。可是后来继续调研后发现,长时间拍摄以及参差不齐的假电池质量可能会对相机造成损伤,这相机也不是我的,所以还是另寻方案吧。

然后考虑使用可以输出 RTMP 流的监控摄像头,非常适合做长时间拍摄。但是监控摄像头拍远景做云监工还行,拍近物特写好像就有些力不从心了,继续换其他方案。

我手里有一个之前做毕设时购买的 Raspberry Pi Camera Module v2,画质不算好,只能说勉强够用,我当时用它采集人像和车牌做识别也是没有多大问题。

4275760945bb7f2b00766f92384de9124335995e_pi-camera-hero-1-1394x1080

然后我搜索了一下,发现树莓派基金会在去年又推出了一款摄像头模组——Raspberry Pi HQ Camera。

这个模组和之前的摄像头有着很大的区别,使用索尼 IMX477 传感器,以及标准的 C/CS 镜头接口,还需要单独购买镜头才能使用。官方为这个模组出了两支镜头,16mm 10MP 的长焦镜头和 6mm 3MP 的广角镜头。在 YouTube 找了相关视频之后,我对这支长焦镜头相当感兴趣,于是就在淘宝下单了一套,决定本次直播就使用它进行拍摄。

因为这个摄像头模组使用标准的 1/4”-20 螺丝孔位,所以三脚架的选择就相当自由了,一番搜寻之后我看上了影视飓风的三脚架 + 云台组合,价格也不贵,看起来非常可靠。

image-20210823142825978

还有一个需要解决的就是夜晚的照明问题,否则半夜的直播就只有一片漆黑了。这里我选择了一个比较简单粗暴的解决方案:以前在学校宿舍里用的桌面灯管,通过米家智能插座自动控制开关即可。

image-20210823143052356

原本还买了个小米光照传感器来配合控制,后来发现完全不需要,智能插座自己就可以设置定时或者在日出和日落时自动开关了。5W 的功率也比较低,比较省电,而且 LED 灯没有有频闪的问题,不会干扰到夜晚的拍摄质量。

场景搭建

直播场景我选择放在了家里的阳台,光照还算充足,也不会干扰到日常生活。LED 灯用 3M 的胶带粘在了窗台上(顺便安利一下 3M 的胶带,粘性强,而且不留痕迹,真的好用),三脚架因为不能伸缩,所以搬了个凳子过来凑合一下,花盆的后面放了弑君者兔兔和阿米娅的立牌作为背景稍微装饰一下,整个朴实无华的场景就算完成了。

软件配置

录像

本次直播使用 FFmpeg 进行画面的处理以及推流。原本想直接用 FFmpeg 获取 /dev/video0 的视频画面,但是不知道为什么出来的视频帧率非常低,所以最后采用的方法是用 raspivid 获取视频画面,再通过 shell 的管道输出给 FFmpeg。

搭建 RTMP 服务器

因为还需要调试推流的各项参数,但是直接推到 B 站进行调试的话不是很方便,我又不想在自己电脑上装 Nginx,所以借了一台朋友的洋垃圾 Chromebook,装 CentOS 7 临时搭建了一个 RTMP 服务端用于本地测试。

搭建过程非常简单,下载编译安装 Nginx,编译的时候记得带上 --add-module=nginx-rtmp-module --with-http_ssl_module 参数,最后在 conf 里加上 RTMP 的配置就可以了。

#RTMP 服务
rtmp 
{
    server
    {
          #指定服务端口
          listen 1935;
          chunk_size 4096;

          #指定RTMP流应用
          application live
          {
             live on;
          }
      }
}

推流

先用 raspivid 获取视频画面,再通过管道发送给 FFmpeg 编码后推送到 B 站的直播地址。

raspivid -t 0 -w 1280 -h 720 -b 5000000 -o - | ffmpeg -re -i - -vcodec copy -acodec copy -preset veryfast -b:v 5000k -bufsize 5000k -f flv "rtmp://live-push.bilivideo.com/live-bvc/?xxx"

可能是由于树莓派性能不足,推 1080p 的直播画面会时不时卡顿,所以改成 720p,5Mbps 的码率。

定时保存画面

为了后期制作延时摄影,还需要定时保存画面。在 FFmpeg 推流的命令后面再添加一条 -f image2 -r 0.01 -strftime 1 /home/pi/photo/"%m-%d_%H-%M-%S.jpg"

-r 表示每秒保存的帧数,0.01 的意思就每 100 秒保存一张,后面则是输出的路径,使用格式化的日期来作为文件名方便后期检索。

自动重启

由于直播过程中可能会因为网络波动等各种原因导致推流中断,所以还需要让脚本能够自动重启恢复推流。

while true
do
    raspivid -t 0 -w 1280 -h 720 -b 5000000 -o - | ffmpeg -re -i - -vcodec copy -acodec copy -preset veryfast -b:v 5000k -bufsize 5000k -f flv "rtmp://live-push.bilivideo.com/live-bvc/?xxx" -f image2 -r 0.01 -strftime 1 /home/pi/photo/"%m-%d_%H-%M-%S.jpg"
    sleep 10s
done

图片导出

我写了一个简单的脚本。

current=`date "+%m-%d"`
zip /home/pi/output/$current.zip /home/pi/photo/*.jpg
rm /home/pi/photo/*.jpg

再添加一条 crontab 自动执行,就可以每天晚上自动将当天的所有图片打包放在一起。

内网穿透

由于我不可能 24 小时在家维护直播,为了防止出现意外情况导致直播中断,还需要我随时可以连接回家里的树莓派进行配置,这里我选择使用 frp

因为只需要一个最基本的 SSH 内网穿透,所以配置也非常简单,直接复制官方文档里的示例就可以。在树莓派上安装好客户端,在我的博客服务器上装好服务端,就可以正常通过公网连接到家里的树莓派了。

开始直播

image-20210830111418544

所有东西准备就绪,直播正式开始,希望我能顺利完成本次直播吧。

Last modification:August 30th, 2021 at 11:22 am
If you think my article is useful to you, please feel free to appreciate