如何用ffprobe/ffmpeg判断视频流为直播流还是固定录制流?
如何用ffprobe/ffmpeg区分直播流与固定录制流
当然可以做到!作为经常和流媒体打交道的开发者,我常用ffprobe和ffmpeg的几个实用技巧来判断给定的流是实时直播还是预录制的固定流,下面给你拆解具体方法:
方法一:用ffprobe分析流元数据(最直接高效)
ffprobe专门用来提取媒体流的元数据,咱们可以通过几个关键字段快速判断:
- 检查流时长
直播流没有固定的结束时间,所以元数据里的duration字段通常会显示N/A或者0.000000;而录制流会有明确的时长数值(比如3600.000000代表1小时)。
执行命令:
ffprobe -v quiet -print_format json -show_format -show_streams 你的流地址(如http://server/stream或rtmp://server/stream)
查看输出里的format.duration字段就能快速区分。
- 查找直播专属标识
很多直播协议(比如RTMP、HLS)会在元数据里标记直播状态:
- 部分流会在
format.tags里包含live、Streaming这类关键词; - HLS直播流的播放列表(.m3u8)不会包含
#EXT-X-ENDLIST标签(这个标签代表流已结束,是录制流的典型标志),你可以直接用ffprobe分析HLS的playlist:
ffprobe -v quiet -print_format json -show_format http://server/stream.m3u8
如果输出里找不到EXT-X-ENDLIST相关内容,大概率是直播流;
- 部分RTMP流会在
streams字段里出现is_live: 1的明确标记。
方法二:用ffmpeg持续监控流的时间戳变化
如果元数据不够明确,咱们可以让ffmpeg短时间读取流,观察时间戳的动态变化:
执行命令:
ffmpeg -i 你的流地址 -t 10 -f null -
这个命令会读取流10秒然后丢弃输出,你可以看终端的输出日志:
- 如果是直播流,日志里的时间会持续递增(比如
time=00:00:01.23→time=00:00:09.87),而且不会提前结束; - 如果是录制流,可能很快就会显示
frame=xxx达到总帧数,或者时间戳直接停在流的总时长位置。
注意事项
- 有些特殊场景下,比如循环播放的录制流,可能会让时间戳看起来像直播,这时候结合元数据里的固定时长字段就能轻松区分;
- 部分CDN或流媒体服务器可能会修改元数据,所以最好结合两种方法交叉验证,结果会更准确。
内容的提问来源于stack exchange,提问作者David




