使用FFmpeg同步文件时间戳:多HDMI相机采集存图时间标记需求
解决方案:多相机HDMI采集并按采集时间命名JPEG文件
首先,先修正你当前单相机命令里的几个小问题,再扩展到4台相机的并行采集方案,同时实现按采集时间命名文件的需求。
一、单相机的正确命令(按时间戳命名)
你的原命令存在几个需要调整的细节:
-I应该是小写的-i(FFmpeg的输入参数是小写)-c:a jpeg是错误的,我们处理的是视频流,应该指定视频编码器为MJPEG,或者直接用image2格式输出图片- 要稳定实现每秒30张图,需要明确设置输入/输出帧率
-r 30 - 要按采集时间命名,FFmpeg支持通过
strftime格式生成文件名,需启用-strftime 1参数
修正后的单相机命令如下:
ffmpeg -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video0 -f image2 -strftime 1 -r 30 camera0-%Y%m%d-%H%M%S-%3N.jpeg -t 60
参数说明:
-r 30:强制输入和输出帧率为30fps,确保每秒生成30张图片-f image2:明确使用image2格式输出图片序列-strftime 1:开启时间戳命名功能camera0-%Y%m%d-%H%M%S-%3N.jpeg:文件名格式,%Y%m%d是年月日,%H%M%S是时分秒,%3N是毫秒(避免同一秒内的30张图重名)-t 60:指定采集时长为60秒
二、4台相机并行采集的实现
要同时采集4台相机,推荐两种可靠的方法:
方法1:Shell脚本并行启动多个FFmpeg进程
这是最稳定的方案,每个相机独立运行FFmpeg进程,互不干扰。创建一个名为capture_all.sh的脚本:
#!/bin/bash # 后台启动相机0的采集任务 ffmpeg -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video0 -f image2 -strftime 1 -r 30 camera0-%Y%m%d-%H%M%S-%3N.jpeg -t 60 & # 后台启动相机1的采集任务 ffmpeg -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video1 -f image2 -strftime 1 -r 30 camera1-%Y%m%d-%H%M%S-%3N.jpeg -t 60 & # 后台启动相机2的采集任务 ffmpeg -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video2 -f image2 -strftime 1 -r 30 camera2-%Y%m%d-%H%M%S-%3N.jpeg -t 60 & # 后台启动相机3的采集任务 ffmpeg -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video3 -f image2 -strftime 1 -r 30 camera3-%Y%m%d-%H%M%S-%3N.jpeg -t 60 & # 等待所有后台采集任务完成 wait
给脚本添加执行权限:
chmod +x capture_all.sh
运行脚本即可同时采集4台相机:
./capture_all.sh
方法2:FFmpeg多输入单进程采集(不推荐)
虽然FFmpeg支持同时处理多个输入,但实时采集场景下,单进程调度多相机流容易出现同步问题,且某一个相机流异常会影响所有任务。如果一定要尝试,命令如下:
ffmpeg \ -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video0 \ -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video1 \ -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video2 \ -f video4linux2 -pixel_format yuv420p -r 30 -i /dev/video3 \ -map 0:v -f image2 -strftime 1 -r 30 camera0-%Y%m%d-%H%M%S-%3N.jpeg \ -map 1:v -f image2 -strftime 1 -r 30 camera1-%Y%m%d-%H%M%S-%3N.jpeg \ -map 2:v -f image2 -strftime 1 -r 30 camera2-%Y%m%d-%H%M%S-%3N.jpeg \ -map 3:v -f image2 -strftime 1 -r 30 camera3-%Y%m%d-%H%M%S-%3N.jpeg \ -t 60
三、额外注意事项
- 设备权限:确保当前用户对
/dev/video0至/dev/video3有读写权限,可将用户加入video组:sudo usermod -aG video $USER,重新登录后生效。 - 性能优化:若出现丢帧,可尝试降低采集分辨率(添加
-s 1280x720参数),或检查采集卡带宽是否支持4台HDMI相机同时传输。 - 时间同步:如需4台相机时间戳严格对齐,需确保系统时间准确,或选用支持硬件同步的采集卡。
内容的提问来源于stack exchange,提问作者Olivier Rivard
相关产品推荐
相关产品推荐

