3年素材“缩”为1分钟!低成本、长时间延时摄影小技巧分享
作者 | 廖微奂 刘柯 罗宇琪
订阅 | 010-86092062
延时摄影通常在拍摄城市风光、自然风景、天文现象、城市生活、建筑制造、生物演变等题材 上都有应用。目前大多数摄像机、手机等常见设备均有此功能。
如果一栋大楼从无到有需要3年时间建设,而我们想把整个建设过程通过延时摄影的方式记录成一分钟的素材,该如何实现呢?有没有“第1天 播种、5年后收获”的方案呢?
答案是肯定有的。下面就和大家分享一个简单的、低成本的基于流媒体的延时摄影技术。
重庆广电集团在重庆南岸区炮台山上架设了一个摄像头,它展现了重庆渝中半岛24小时美轮美奂的场景,但用户却很难真正花24小时去欣赏美景的变化过程。
重庆广电“第1眼”APP上设 有日播小版块《一分钟看山城》,每天上午更新,发布前一日的延时摄影素材,使广大用户能够在一分钟的时间里感受到山城美景每天24小时的神奇变幻过程。《一分钟看山城》2017年上线,目前该版块已稳定运行近三年。
《一分钟看山城》示意
每天的延时摄影素材自动生成,不需人为操作,这是如何实现的呢?这归功于强大的FFmpeg。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,是全球应用最广泛的计算机音视频编解码方案,基于FFmpeg开发出的音视频 件不计其数。
对于大部分广电行业的技术人员来说,制作一个计算机程序门槛较高,但好在FFmpeg有编译成Windows版本的程序(互联网上可免费下载),可以在Windows下直接利用批处理命令行的方式来实现音视频编解码、推拉流等功能。
我们就利用FFmpeg来对监控摄像头实现延时摄影,程序逻辑图如下图。下面分步骤详解《一分钟看山城》的实现过程。
程序流程
Windows下安装FFmpeg
我们采用一台Windows server 2012r2操作系 统的服务器,互联网上下载Windows版本的 FFmpeg源程序拷贝至C盘根目录,文件夹命名为ffmpeg,配置Window环境变量path路径为C :\ffmpeg\bin。
打开系统程序cmd.exe, 输入ffmpeg–version,如果显示出程序版本信息和编解码器的版本信息说明安装成功。
获取摄像头流地址
我们采用的一款海康威视的DS-2DE7530IW-A 球形摄像机,用光纤专线的方式接入重庆广电融媒体新闻中心机房,保障了网络的可靠和稳定。
海康威视推荐用户下载iVMS-4200客户端管理摄像头,但在这款软件中只能对摄像头实现云台控制、录制等基本操作,无法获取视频流的地址。
联系其官网,工作人员会提供摄像头流地址拼写教程。我们采用的摄像头流地址拼写规则如下图。
海康威视监控摄像头流地址拼写规则
其它品牌的摄像头可自行搜索拼写规则。比如现在我们的流地址是rtsp://XXX,可以在服务器上安装vlc等播放器拉流观看画面,也可以在服务器cmd.exe中运行ffplay rtsp://XXX, 如果看到摄像头的画面,则表明服务器与摄像头之间网络通畅,自此准备工作就绪。
制作批处理脚本
新建两个文本文档,后缀名改为“bat”就是批处 理脚本了,我们分别制作“录制”和“合成”。
(1)“录制 .bat”代码如下 :
@echo off
① set num=0
② :start
③ set/a num=%num%+1
④ffmpeg -i "rtsp://XXX" –y d:\\test\ A%num%.jpg
⑤ choice/t 58 /d y /n >nul
⑥ if %num%==1410 (goto end)
⑦ goto start
⑧ :end
⑨ Exit
简单的几行代码即可实现每分钟抓取一张图片保 存在D盘test文件夹中,并命名为A1.jpg、A2.jpg…… A1410.jpg,每行程序非常容易理解,下面逐行释义 :
① 设置计数器变量,其初始值为0。
② 设置标号,给⑦中goto语句跳转使用。
③ 计数器自增1。
④ 调用FFmpeg读取流地址,并将当时的画面保存为jpg,命名规则是“A”加上此时的计数器变量。“-y”表示如果文件夹中已存在重名文件,则新文件覆 盖掉旧文件。
⑤ 暂停58秒。此处说明一下为什么是58秒截取 一张图而不是60秒。因为实测每次读取视频流地址并 保存为jpg这个过程需要2秒(服务器配置不同、网络环境不同这个时间也会不同,需要用户以自己的环境设置),所以选择58秒存一次,等存储一次后正好是60秒。
⑥ 判断此时计速器是否等于1410。如果不是,跳回标号“start”,如果是,跳到后面的标号“end”,步骤② ~ ⑥组成一个循环。
⑦ 设置标号,给⑥中的goto语句跳转使用。
⑧ 退出程序。
一个周期结束后计数器变为1410,自动结束此脚本,此时时间大约是23点30分。当然你想记录数十万张照片也是可行的,你可以将保存照片的时间间隔增大,比如每六小时存一张,就能 实现前文提到的3年记录一栋大楼的建设过程了。
(2)“合成 .bat”代码如下 :
@echo off
①set b=%date:~0,4%%date:~5,2%%da te:~8,2%
②ffmpeg -f image2 -i d:\\test\A%%d.jpg -vcodec libx264 d:\\test1\%b%.mp4
下面逐行释义 :
① 获取系统时间的变量,用来给MP4 文件命名,日期格式规定为年月日,比如 20200101。
② 调用FFmpeg将test文件夹中的照片以 A1.jpg 作为第1帧、A2.jpg 作为第2帧……合成为一个H264编码、MP4封装的视频文件(不加帧率参数默认每秒25帧)。
这两个脚本制作好后,重复地执行就能获得每天的延时摄影素材了。
我们使用的服务CPU为 Intel Xeon E5-2630 v3 ,8G内存,执行“合成 .bat”需要1分30秒左右,服务器配置不同,时间也不同,用户最好根据服务器性能来调整程序逻辑。
如果想用显卡或其他专业编码器代替CPU编码,则需要自行编译FFmpeg。
设置自动执行程序
Windows中有个功能叫“任务计划程序”,如下图,可以设置每天0点执行“录制.bat”脚本,每天23点35分执行“合成 .bat”。
Windows计划任务
如果不想当天的照片被第二天的照片覆盖,也可以用此原理另外制作一个批处理脚本把每一天的素材保留起来,比如每天23点45分执行copy d:\test\*.jpg e:\test,即可把每日的照片备份至别处。服务器上另外开一个FTP服务指向视频素材所在的文件夹,其他工作人员即可每日下载前一日的素材了。
该方案仅由一台服务器和一个监控摄像机组成,二者均有UPS保障,服务启动后不需维护,每日都会产生新的素材。如果追求4K等更高的画面质量,可考虑采用4K摄像机直接输出SDI到4K采集卡,FFmpeg从采集卡上抓图的方式,或者直接采用相机拍摄。
但广播级摄像机或者相机要实现持续数年的稳定工作十分困难。所以要长时间稳定拍摄,可采购4K监控级摄像机。
本文只是以重庆广电集团“第1眼”App中《一分 钟看山城》这个小版块的技术实现为案例,分享了一个长时间延时摄影的小技巧。抓图功能只是 FFmpeg的冰山一角,其强大之处不仅于此,深入研究会进入另一片广阔的音视频编解码领域。
END
【推荐阅读】
软硬件+转码/延时+剪辑+调色,纪录片后期制作电影化流程“全套”揭秘
“云录制”是否只是“昙花一现”?
600小时的素材!这样“恐怖”的纪录片素材量怎么管理?
我知道你在看哟