You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用ffprobe/ffmpeg判断视频流为直播流还是固定录制流?

如何用ffprobe/ffmpeg区分直播流与固定录制流

当然可以做到!作为经常和流媒体打交道的开发者,我常用ffprobe和ffmpeg的几个实用技巧来判断给定的流是实时直播还是预录制的固定流,下面给你拆解具体方法:

方法一:用ffprobe分析流元数据(最直接高效)

ffprobe专门用来提取媒体流的元数据,咱们可以通过几个关键字段快速判断:

  1. 检查流时长
    直播流没有固定的结束时间,所以元数据里的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字段就能快速区分。

  1. 查找直播专属标识
    很多直播协议(比如RTMP、HLS)会在元数据里标记直播状态:
  • 部分流会在format.tags里包含liveStreaming这类关键词;
  • 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.23time=00:00:09.87),而且不会提前结束;
  • 如果是录制流,可能很快就会显示frame=xxx达到总帧数,或者时间戳直接停在流的总时长位置。

注意事项

  • 有些特殊场景下,比如循环播放的录制流,可能会让时间戳看起来像直播,这时候结合元数据里的固定时长字段就能轻松区分;
  • 部分CDN或流媒体服务器可能会修改元数据,所以最好结合两种方法交叉验证,结果会更准确。

内容的提问来源于stack exchange,提问作者David

火山引擎 最新活动