<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tvbjack (tvbjack)</title>
    <link>https://pixman.io/tvbjack</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>发布 mpd 转换 hls 推流程序  V1.1（20260413）</title>
      <description>&lt;ul&gt;
&lt;li&gt;加入启停功能，完善 api 接口，优化断流&lt;/li&gt;
&lt;li&gt;jackTV 出品，欢迎测试反馈，TG 群组：&lt;a href="https://t.me/jacktvb" rel="nofollow" target="_blank"&gt;https://t.me/jacktvb&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一键安装脚本（支持 amd64/arm64）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://php.946985.filegear-sg.me/mpd-hls/install.sh -o install.sh &amp;amp;&amp;amp; chmod +x install.sh &amp;amp;&amp;amp; ./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="MPD-HLS"&gt;MPD-HLS&lt;/h2&gt;
&lt;p&gt;这是一个独立的 &lt;code&gt;DASH / ClearKey / CENC -&amp;gt; HLS&lt;/code&gt; Rust 项目。&lt;/p&gt;

&lt;p&gt;当前版本已经可以处理这类直播源：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;输入：动态 &lt;code&gt;MPD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;加密：&lt;code&gt;ClearKey&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;视频/音频：&lt;code&gt;cenc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;输出：

&lt;ul&gt;
&lt;li&gt;视频：HLS fMP4&lt;/li&gt;
&lt;li&gt;音频：HLS fMP4&lt;/li&gt;
&lt;li&gt;字幕：TTML/stpp 适配为 WebVTT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;项目运行模式是：&lt;/p&gt;

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

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

&lt;hr&gt;
&lt;h3 id="二. API 调用"&gt;二。API 调用&lt;/h3&gt;&lt;h4 id="1. 创建频道"&gt;1. 创建频道&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "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"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回中会包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;stream_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;playlist_path&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;playlist_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_mode&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其中：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_mode="persistent"&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;持续运行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_mode="on_demand"&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;按需启停&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2. 启用某条频道"&gt;2. 启用某条频道&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/enable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回会是这条频道最新的 &lt;code&gt;ChannelView&lt;/code&gt;，其中 &lt;code&gt;enabled&lt;/code&gt; 会变成 &lt;code&gt;true&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id="3. 停用某条频道"&gt;3. 停用某条频道&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/disable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回会是这条频道最新的 &lt;code&gt;ChannelView&lt;/code&gt;，其中 &lt;code&gt;enabled&lt;/code&gt; 会变成 &lt;code&gt;false&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id="4. 切换某条频道运行模式"&gt;4. 切换某条频道运行模式&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx/run-mode &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "run_mode":"on_demand"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可选值：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;persistent&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;持续运行&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;on_demand&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;按需启停&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;返回会是这条频道最新的 &lt;code&gt;ChannelView&lt;/code&gt;，其中 &lt;code&gt;run_mode&lt;/code&gt; 会更新。&lt;/p&gt;
&lt;h4 id="5. 删除某条频道"&gt;5. 删除某条频道&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/stream-xxxxxxxxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回会是被删除频道最后一次的 &lt;code&gt;ChannelView&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id="6. 全部启动"&gt;6. 全部启动&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/enable-all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;items&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;当前全部频道列表&lt;/li&gt;
&lt;li&gt;其中所有频道的 &lt;code&gt;enabled&lt;/code&gt; 都会是 &lt;code&gt;true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="7. 全部停止"&gt;7. 全部停止&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/disable-all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;items&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;当前全部频道列表&lt;/li&gt;
&lt;li&gt;其中所有频道的 &lt;code&gt;enabled&lt;/code&gt; 都会是 &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="8. 导出全部频道 M3U 列表"&gt;8. 导出全部频道 M3U 列表&lt;/h4&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/export.m3u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果播放器支持在 URL 中直接携带 Basic Auth，也可以直接请求：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://admin:change-this-password@127.0.0.1:9100/api/channels/export.m3u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你的服务没有开启后台认证，也可以直接用：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:9100/api/channels/export.m3u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你想直接保存成文件：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; admin:change-this-password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; channels.m3u &lt;span class="se"&gt;\&lt;/span&gt;
  http://127.0.0.1:9100/api/channels/export.m3u
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回内容类似：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#EXTM3U
#EXTINF:-1,Test Channel
http://127.0.0.1:9100/live/stream-xxxxxxxxxxxxxxxx/index.m3u8
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tvbjack</author>
      <pubDate>Mon, 13 Apr 2026 16:19:30 +0800</pubDate>
      <link>https://pixman.io/topics/736</link>
      <guid>https://pixman.io/topics/736</guid>
    </item>
    <item>
      <title>发布 mpd 转换 hls 推流程序</title>
      <description>&lt;p&gt;欢迎测试 MPD 转 HLS 管理后台 V1.0（20260411）
jackTV 出品，欢迎测试反馈，TG 群组：&lt;a href="https://t.me/jacktvb" rel="nofollow" target="_blank"&gt;https://t.me/jacktvb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一键安装脚本（支持 amd64/arm64）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://php.946985.filegear-sg.me/mpd-hls/install.sh -o install.sh &amp;amp;&amp;amp; chmod +x install.sh &amp;amp;&amp;amp; ./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="MPD-HLS程序简介"&gt;MPD-HLS 程序简介&lt;/h2&gt;
&lt;p&gt;这是一个独立的 &lt;code&gt;DASH / ClearKey / CENC -&amp;gt; HLS&lt;/code&gt; Rust 项目。&lt;/p&gt;

&lt;p&gt;当前版本已经可以处理这类直播源：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;输入：动态 &lt;code&gt;MPD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;加密：&lt;code&gt;ClearKey&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;视频/音频：&lt;code&gt;cenc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;输出：

&lt;ul&gt;
&lt;li&gt;视频：HLS fMP4&lt;/li&gt;
&lt;li&gt;音频：HLS fMP4&lt;/li&gt;
&lt;li&gt;字幕：TTML/stpp 适配为 WebVTT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="当前版本已实现能力"&gt;当前版本已实现能力&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Basic Auth 后台管理页面&lt;/li&gt;
&lt;li&gt;频道新增、批量导入、启用、禁用、删除&lt;/li&gt;
&lt;li&gt;每频道支持独立的上游 SOCKS5、User-Agent 和 Referer&lt;/li&gt;
&lt;li&gt;MPD 入口地址自动跟随跳转&lt;/li&gt;
&lt;li&gt;解析 DASH &lt;code&gt;AdaptationSet / Representation / SegmentTemplate / SegmentTimeline&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;自动选择最高分辨率视频轨&lt;/li&gt;
&lt;li&gt;自动选择默认音频轨和字幕轨，可以手动选取指定音轨&lt;/li&gt;
&lt;li&gt;校验你提供的 &lt;code&gt;KID:KEY&lt;/code&gt; 与 MPD 中的 &lt;code&gt;default_KID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;拉取最近 &lt;code&gt;N&lt;/code&gt; 片直播分片&lt;/li&gt;
&lt;li&gt;解密视频/音频 &lt;code&gt;cenc&lt;/code&gt; 分片&lt;/li&gt;
&lt;li&gt;输出 HLS Master Playlist&lt;/li&gt;
&lt;li&gt;输出视频/音频 live fMP4 Playlist&lt;/li&gt;
&lt;li&gt;将 TTML/stpp 字幕片段转换为 WebVTT 片段&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.m4s/.mp4&lt;/code&gt; 媒体片支持单区间与多区间 &lt;code&gt;Range&lt;/code&gt; 请求&lt;/li&gt;
&lt;li&gt;预发布热备下一片，准备好后再统一写入 &lt;code&gt;hls/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;已发布媒体片按静态文件直接读取并返回，减少取片路径和会话状态的耦合&lt;/li&gt;
&lt;li&gt;检测到时间轴跳变时，会在 media playlist 中输出 &lt;code&gt;#EXT-X-DISCONTINUITY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;playlist&lt;/code&gt; 内容未变化时不重写，减少临时文件和磁盘抖动&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="WEB管理页面截图"&gt;WEB 管理页面截图&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://img.pixman.cloud/photo/tvbjack/bbbcf678-1ec8-49f6-bcb4-6dda0323efc1.png?x-oss-process=image%2Fresize%2Cw_1920" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>tvbjack</author>
      <pubDate>Sat, 11 Apr 2026 13:29:52 +0800</pubDate>
      <link>https://pixman.io/topics/735</link>
      <guid>https://pixman.io/topics/735</guid>
    </item>
  </channel>
</rss>
