You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FFmpeg为HLS TS分片动态添加时间戳元数据

核心原因

FFmpeg 全局的-metadata参数只会在命令启动时解析一次,HLS 分片文件名的strftime格式替换是 HLS 封装器单独实现的逻辑,不会同步作用到全局元数据配置上,所以你直接在-metadata里写时间格式符不会被动态替换。

方案1:分片生成后异步添加元数据(最稳定,不会影响直播实时性)

你已经在分片文件名里写入了准确的UTC时间戳,只要监控分片输出目录,新分片写入完成后自动提取文件名中的时间戳,重写元数据即可,全程不需要重编码音视频,执行速度极快:

  • Linux环境可以用inotifywait实现目录事件监听,避免轮询浪费资源
  • 新分片生成后执行以下命令更新元数据:
# 示例新生成的分片文件名为 2024-05-20T12-30-00Z_133.ts
ts_file="2024-05-20T12-30-00Z_133.ts"
# 从文件名提取时间戳,把时间部分的横杠替换为冒号
time_str=$(echo $ts_file | grep -oP '^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}Z' | sed 's/\(T[0-9][0-9]\)-/\1:/' | sed 's/\(:[0-9][0-9]\)-/\1:/')
# 重写元数据,用临时文件替换保证原子操作,不会影响HLS拉流
ffmpeg -y -i "$ts_file" -c copy -metadata service_name="dipoza--1330:${time_str}" -metadata service_provider=mydata "tmp_${ts_file}"
mv "tmp_${ts_file}" "$ts_file"

这个方案兼容性最好,不会对HLS直播的稳定性产生任何影响,也不需要修改你现有的FFmpeg推流命令。

方案2:使用segment muxer的回调机制动态写入

如果你需要在分片生成的同时写入元数据,可以把HLS输出替换为segment muxer + 手动维护m3u8的方式,通过-segment_list参数绑定外部回调脚本,每次生成分片时触发元数据写入,不过这种方式需要自己处理m3u8列表的更新、过期分片删除等逻辑,复杂度比方案1高,非必要不推荐。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:00:01