如何使用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
相关产品推荐
相关产品推荐

