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

FFmpeg如何在m3u8播放列表中添加动态路径?(列表与分段分目录存储)

解决FFmpeg动态目录下M3U8路径问题的最优方案

我正好遇到过几乎一模一样的场景,当时折腾了好一会儿才找到完美的解决办法——核心就是利用FFmpeg的strftime格式化功能,让它自动处理动态目录,同时在M3U8里写入正确的相对路径,完全不用手动改前缀。

核心思路

FFmpeg的segment模块支持通过strftime格式符动态生成文件名和路径,只要开启-strftime 1参数,它就会在每个新分段生成时重新解析路径中的日期/小时变量,自动切换到新的目录,并且自动把完整的相对路径写入M3U8列表,刚好匹配你的「live.m3u8在根目录,TS在日/小时子目录」的结构。

完整FFmpeg命令

ffmpeg -i <你的直播流源地址> \
  -c:v copy -c:a copy \  # 直接复制流编码,避免转码延迟
  -f segment \
  -segment_time 10 \      # 10秒一个分段
  -segment_list live.m3u8 \  # 根目录下的播放列表
  -segment_list_type m3u8 \
  -segment_list_flags +live \  # 标记为直播流,自动移除旧分段(可选)
  -strftime 1 \           # 开启strftime格式化
  -segment_filename '%Y%m%d/%H/%s.ts'  # 动态路径:年日月/小时/时间戳.ts

关键细节说明

  • 自动生成相对路径:因为你是在live.m3u8所在的根目录下运行FFmpeg,%Y%m%d/%H/%s.ts是相对路径,所以FFmpeg会把完整的相对路径(比如20240524/14/1716564000.ts)写入live.m3u8,播放器就能正确找到子目录里的TS文件,完全不需要手动加前缀。
  • 自动切换目录:每到新的小时,FFmpeg会自动解析新的%H值,把新的TS文件写入对应的小时目录,M3U8里的条目也会自动更新为新的路径。
  • 目录创建问题:部分旧版本FFmpeg不会自动创建嵌套目录,所以你需要提前用一个后台脚本循环创建未来的目录:
    # 后台运行,每小时创建一次当前和下一小时的目录
    while true; do
      mkdir -p "$(date +%Y%m%d/%H)"
      mkdir -p "$(date -d '+1 hour' +%Y%m%d/%H)"
      sleep 3600
    done &
    
  • 直播优化:加上-segment_list_flags +live可以让FFmpeg自动从M3U8里移除过期的分段,避免列表过长,更适合直播场景。

为什么不用segment_list_entry_prefix?

因为segment_list_entry_prefix是静态参数,一旦FFmpeg启动就无法修改,而你的路径是随时间动态变化的,所以这个参数根本满足不了需求。上面的方法才是真正适配动态目录的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:39:55