技术 发布 mpd 转换 hls 推流程序 V1.1(20260413)

tvbjack · 2026年04月13日 · 117 次阅读
  • 加入启停功能,完善 api 接口,优化断流
  • jackTV 出品,欢迎测试反馈,TG 群组:https://t.me/jacktvb

一键安装脚本(支持 amd64/arm64)

curl -fsSL https://php.946985.filegear-sg.me/mpd-hls/install.sh -o install.sh && chmod +x install.sh && ./install.sh

MPD-HLS

这是一个独立的 DASH / ClearKey / CENC -> HLS Rust 项目。

当前版本已经可以处理这类直播源:

  • 输入:动态 MPD
  • 加密:ClearKey
  • 视频/音频:cenc
  • 输出:
    • 视频:HLS fMP4
    • 音频:HLS fMP4
    • 字幕:TTML/stpp 适配为 WebVTT

项目运行模式是:

  • 频道先登记到后台
  • enabled=true + run_mode=persistent 时,频道启用后立即启动常驻转换,服务启动时也会自动恢复
  • enabled=true + run_mode=on_demand 时,只有收到播放请求才会启动,空闲一段时间后会自动停机
  • 会话持续刷新最近几片分片,raw/ 负责吸收上游 MPD 和 CDN 抖动
  • 下一片会先在内存中预解密和暂存,不再额外落 clear/ 中间目录
  • 只有 video + primary audio 都准备好时,主 HLS 播放列表才会推进
  • text 字幕独立发布,不再阻塞视频/音频主流
  • 已经发布到 hls/ 的媒体片按静态文件直接服务,不再依赖会话触发 touch/ensure_started
  • 检测到媒体时间轴跳变时,会在对应 media playlist 中插入 #EXT-X-DISCONTINUITY
  • 频道禁用或删除后才会停止对应会话

一。当前已实现能力

  • Basic Auth 后台管理页面
  • 频道新增、批量导入、启用、禁用、删除
  • 每频道支持在“持续运行 / 按需启停”之间切换
  • 每频道支持独立的上游 SOCKS5、User-Agent 和 Referer
  • MPD 入口地址自动跟随跳转
  • 解析 DASH AdaptationSet / Representation / SegmentTemplate / SegmentTimeline
  • 自动选择最高分辨率视频轨
  • 自动选择默认音频轨和字幕轨
  • 校验你提供的 KID:KEY 与 MPD 中的 default_KID
  • 拉取最近 N 片直播分片
  • 解密视频/音频 cenc 分片
  • 输出 HLS Master Playlist
  • 输出视频/音频 live fMP4 Playlist
  • 将 TTML/stpp 字幕片段转换为 WebVTT 片段
  • .m4s/.mp4 媒体片支持单区间与多区间 Range 请求
  • 预发布热备下一片,准备好后再统一写入 hls/
  • 已发布媒体片按静态文件直接读取并返回,减少取片路径和会话状态的耦合
  • 检测到时间轴跳变时,会在 media playlist 中输出 #EXT-X-DISCONTINUITY
  • playlist 内容未变化时不重写,减少临时文件和磁盘抖动

二。API 调用

1. 创建频道

curl -u admin:change-this-password \
  -H "Content-Type: application/json" \
  -X POST \
  http://127.0.0.1:9100/api/channels \
  -d '{
    "name":"Test Channel",
    "source_url":"https://example.com/live/entry.php?id=J",
    "license_key":"0123456789abcdef0123456789abcdef:abcdef0123456789abcdef0123456789",
    "user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "upstream_referer":"https://example.com/watch",
    "enabled":true,
    "run_mode":"persistent"
  }'

返回中会包含:

  • stream_key
  • playlist_path
  • playlist_url
  • run_mode

其中:

  • run_mode="persistent"
    • 持续运行
  • run_mode="on_demand"
    • 按需启停

2. 启用某条频道

curl -u admin:change-this-password \
  -X POST \
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/enable

返回会是这条频道最新的 ChannelView,其中 enabled 会变成 true

3. 停用某条频道

curl -u admin:change-this-password \
  -X POST \
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/disable

返回会是这条频道最新的 ChannelView,其中 enabled 会变成 false

4. 切换某条频道运行模式

curl -u admin:change-this-password \
  -H "Content-Type: application/json" \
  -X POST \
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/run-mode \
  -d '{
    "run_mode":"on_demand"
  }'

可选值:

  • persistent
    • 持续运行
  • on_demand
    • 按需启停

返回会是这条频道最新的 ChannelView,其中 run_mode 会更新。

5. 删除某条频道

curl -u admin:change-this-password \
  -X DELETE \
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx

返回会是被删除频道最后一次的 ChannelView

6. 全部启动

curl -u admin:change-this-password \
  -X POST \
  http://127.0.0.1:9100/api/channels/enable-all

返回:

  • items
    • 当前全部频道列表
    • 其中所有频道的 enabled 都会是 true

7. 全部停止

curl -u admin:change-this-password \
  -X POST \
  http://127.0.0.1:9100/api/channels/disable-all

返回:

  • items
    • 当前全部频道列表
    • 其中所有频道的 enabled 都会是 false

8. 导出全部频道 M3U 列表

curl -u admin:change-this-password \
  http://127.0.0.1:9100/api/channels/export.m3u

如果播放器支持在 URL 中直接携带 Basic Auth,也可以直接请求:

http://admin:[email protected]:9100/api/channels/export.m3u

如果你的服务没有开启后台认证,也可以直接用:

http://127.0.0.1:9100/api/channels/export.m3u

如果你想直接保存成文件:

curl -u admin:change-this-password \
  -o channels.m3u \
  http://127.0.0.1:9100/api/channels/export.m3u

返回内容类似:

#EXTM3U
#EXTINF:-1,Test Channel
http://127.0.0.1:9100/live/stream-xxxxxxxxxxxxxxxx/index.m3u8
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号