如何实现每日指定时间点自动停止ffmpeg流传输
使用-t参数配置时,流会在运行指定秒数后自动停止,比如下面的示例命令配置了流运行3600秒(1小时)后自动终止:
ffmpeg -f dshow -i video="Virtual-Camera" -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k \ -f mpegts -t 3600 udp://10.1.0.102:1234
原生功能可行性
无法仅依靠ffmpeg原生功能实现“指定时刻自动停流”的需求:
- ffmpeg的时长参数不支持表达式计算,类似
-t (1+1)的写法不会被解析为-t 2,参数只会按照固定的时长语法规则解析。 - ffmpeg自带的表达式求值能力仅在滤镜场景下生效,无法作用于
-t这类控制运行时长的全局参数。
替代实现方案
可以通过bash脚本提前计算当前时间到目标停止时刻的剩余秒数,再将计算结果传入-t参数,即可实现指定时刻自动停流。以下是配置流在凌晨01:00自动停止的示例脚本:
# 当日时间基准,固定为当日最后一秒 time_to_stop="23:59:59" # 次日时间偏移:凌晨1点距离0点为3600秒,加1秒做冗余,合计3601秒 # 若要设置当日时刻停止,将该值设为0,同时修改time_to_stop为目标时间即可 offset_tomorrow=3601 # 计算距离目标停止时刻的剩余运行秒数 seconds_to_stop=$((`date -d$time_to_stop '+%s'`-`date '+%s'` + $offset_tomorrow)) # 启动推流,到达计算时长后自动停止 ffmpeg -f dshow -i video="Virtual-Camera" -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k \ -f mpegts -t $seconds_to_stop udp://10.1.0.102:1234
脚本适配提示:如果需要设置当日15:30停止推流,只需把
time_to_stop改为"15:30:00",offset_tomorrow设为0即可;如果需要设置次日凌晨3点停止,保持time_to_stop为"23:59:59",将offset_tomorrow改为10801(3小时对应10800秒+1秒冗余)即可。
内容的提问来源于stack exchange,提问作者drake7
相关产品推荐
相关产品推荐

