直播配置 / Live Stream Reference

FongMi /TV 直播接口
编写完全指南

涵盖 M3U、TXT(#genre#)、JSON 三种直播订阅格式,EPG 节目单,多线路与 DRM 高级用法,附大量可运行示例。

Based on FongMi/TV · 2026
目录 · Table of Contents
01 · 直播配置入口(lives[]) 02 · TXT(#genre#)格式 03 · M3U / M3U8 格式 04 · JSON 直播格式 05 · EPG 节目单配置 06 · 多线路 / 多源切换 07 · DRM 加密播放 08 · 最佳实践
01

直播配置入口(lives[])

直播订阅通过主配置 JSON 文件中的 lives 字段引入。每个元素对应一个直播订阅源,App 中可以切换不同源。

JSON config.json — lives 字段骨架
{
  "lives": [
    {
      "name": "我的直播源",          // 显示名称
      "type": 0,                    // 0=默认 (M3U/TXT/JSON)
      "url":  "https://example.com/live.txt", // 订阅地址
      "epg":  "https://epg.example.com/e.xml", // 节目单地址(可选)
      "logo": "https://img.example.com/logo/"  // 台标前缀(可选)
    }
  ],

  // ── 全局 EPG(所有直播源共用)
  "epg": "https://epg.example.com/e.xml",

  // ── 台标库前缀
  "logo": "https://gitcdn.example.com/logos/"
}

lives 数组字段详解

字段 类型 必填 说明 示例值
name string 必填 在 App 内的显示名称 "我的直播"
url string 可选* 直播订阅地址(HTTP/HTTPS 或本地路径);与 api / groups 三选一 "https://example.com/live.m3u"
api string 可选* 爬虫脚本 API 地址(JS 脚本驱动的直播解析);与 url / groups 三选一 "csp_LiveTV"
ext string 可选 传递给 api 脚本的扩展参数(URL 或 JSON 字符串) "https://example.com/ext.json"
jar string 可选 Spider 所在 JAR/DEX 文件地址,供 api 调用 "https://example.com/spider.jar"
groups array 可选* 直接内嵌频道分组列表(替代 url),格式见第 04 节 JSON 格式章节;与 url / api 三选一 [{"name":"央视","channel":[…]}]
epg string 可选 源专属 EPG(覆盖全局),多个地址逗号分隔;支持 {id} / {name} / {epg} 占位符 "https://epg.example.com/e.xml"
logo string 可选 台标 URL 前缀;支持 {id} / {name} / {logo} 占位符 "https://img.example.com/logos/{name}.png"
ua string 可选 全局 User-Agent,注入旗下所有频道(频道级同名字段优先) "Mozilla/5.0 (Linux; Android 12)"
referer string 可选 全局 Referer 请求头 "https://www.example.com/"
origin string 可选 全局 Origin 请求头 "https://www.example.com"
header object 可选 全局自定义请求头键值对,频道未设置时从此继承 {"Cookie":"token=abc"}
click string 可选 全局播放跳转解析 URL(处理需要二次解析的流) "https://parse.example.com/live"
timeout number 可选 请求超时秒数,默认使用全局播放超时配置 10
timeZone string 可选 EPG 时区标识 "Asia/Shanghai"
catchup object 可选 全局回看(时移)配置;格式见第 04 节 {"type":"append","days":"7",…}
boot boolean 可选 启动时自动激活此直播源(默认 false) true
pass boolean 可选 跳过该源,不加载内容;用于临时禁用(默认 false) true
ℹ️ 格式自动识别
FongMi/TV 会根据文件内容自动识别直播格式(M3U / TXT / JSON)。若订阅地址需要爬虫脚本解析,则改用 api 字段代替 url

api / ext / jar —— 脚本驱动直播源

当直播源需要动态解析时,不写 url ,改用 api + ext + jar 组合:

JSON 脚本驱动直播源示例
{
  "lives": [
    {
      "name":  "动态解析源",
      "api":   "csp_LiveTV",         // jar 内爬虫的类名,或完整 JS URL
      "jar":   "https://example.com/spider.jar",  // 爬虫包 URL
      "ext":   "https://example.com/ext.json",   // 传给脚本的外部数据
      "epg":   "https://epg.example.com/e.xml"
    }
  ]
}
02

TXT(#genre#)格式

最简单的国产直播格式。规则是:每行 频道名,URL ;分组用一行 分组名,#genre# 开头标注。

基础语法

TXT live.txt — 最简结构
# 格式:频道名称,直播地址
# 分组行:分组名称,#genre#

央视频道,#genre#                           
CCTV-1 综合,http://pull.example.com/cctv1.m3u8
CCTV-2 财经,http://pull.example.com/cctv2.m3u8
CCTV-5 体育,http://pull.example.com/cctv5.m3u8

卫视频道,#genre#                           
湖南卫视,http://pull.example.com/hunan.m3u8
浙江卫视,http://pull.example.com/zhejiang.m3u8
东方卫视,http://pull.example.com/dragon.m3u8

港澳台,#genre#                             
TVB 翡翠,http://hk.example.com/tvb.m3u8
凤凰卫视,http://phx.example.com/live.m3u8

多线路语法(同一频道多个地址)

# 分隔同一频道的多个流地址;在每段地址末尾追加 $线路名 可给该线路命名:

TXT 多线路 — # 分隔,$名称
央视频道,#genre#

# 单地址(基础写法)
CCTV-1 综合,http://line1.example.com/cctv1.m3u8

# 多线路:地址1#地址2#地址3
CCTV-4 中文国际,http://line1.example.com/cctv4.m3u8#http://line2.example.com/cctv4/live.m3u8#rtmp://backup.example.com/live/cctv4

# 带线路名称:地址$线路名#地址$线路名
CCTV-5 体育,http://line1.example.com/cctv5.m3u8$电信线路#http://line2.example.com/cctv5.m3u8$联通线路#http://line3.example.com/cctv5.m3u8$移动线路

行内请求头注入(URL 管道语法)

在 URL 后追加 |键=值&键=值 可为该频道注入 HTTP 请求头,无需额外指令行:

TXT URL 管道注入请求头
体育频道,#genre#

# 格式:频道名,url|Header1=value1&Header2=value2
咪咕体育,http://live.migu.cn/xxx.m3u8|Referer=https://www.migu.cn/&User-Agent=Mozilla/5.0

# 多线路 + 请求头(每段 URL 各自注入)
腾讯体育,http://line1.v.qq.com/live.m3u8|Referer=https://sports.qq.com/#http://line2.v.qq.com/live.m3u8|Referer=https://sports.qq.com/

每频道设置指令

在频道 URL 行上方可放置设置指令行,作用于后续所有频道(遇 #genre# 新分组时自动重置):

TXT 指令行 — 影响后续所有频道直到下一个 #genre#
付费频道,#genre#

# 设置指令行(写在频道 URL 之前)
ua=Mozilla/5.0 (Linux; Android 12; Pixel 6) AppleWebKit/537.36
referer=https://www.example.com/
origin=https://www.example.com
header={"Cookie":"token=abc123","X-Token":"xyz"}
parse=1
click=https://parse.example.com/live
format=hls

CCTV-1 加密,http://line1.example.com/cctv1.m3u8
CCTV-5 加密,http://line1.example.com/cctv5.m3u8

# 新分组:以上指令自动重置
普通频道,#genre#
TVB 翡翠,http://hk.example.com/tvb.m3u8
指令前缀 说明 示例
ua= User-Agent 请求头 ua=Mozilla/5.0
referer= Referer 请求头 referer=https://example.com/
origin= Origin 请求头 origin=https://example.com
header= JSON 格式自定义请求头对象 header={"Cookie":"token=abc"}
parse= 解析标志; 1 =走解析, 0 =直接播放 parse=1
click= 二次解析跳转 URL click=https://parse.example.com/
format= 强制 MIME: hlsmpd / dash 或完整 MIME 字符串 format=hls
forceKey= DRM 强制密钥;true/false forceKey=true
ℹ️ EPG 匹配
TXT 格式不支持行内声明 tvg-id。EPG 节目单匹配依次尝试频道的 tvgIdtvgNamename 三个值,直接把频道名命名为 XMLTV 中的 channel id 即可自动绑定。
⚠ 注意
TXT 格式中频道名后必须紧跟英文逗号( , ),分组行末尾必须是 ,#genre# 。中文逗号或空格会导致解析失败。文件编码请使用 UTF-8 + LF(不要 CRLF)。
03

M3U / M3U8 格式

国际 IPTV 标准格式,两行为一个频道条目: #EXTINF 元信息行 + 流 URL 行。

基础 M3U 结构

M3U live.m3u — 标准结构
#EXTM3U                                         

# 格式:#EXTINF:时长 [属性键="值" ...],频道名
#       URL

#EXTINF:-1 tvg-id="CCTV1" tvg-name="CCTV-1 综合" tvg-logo="https://img.example.com/cctv1.png" group-title="央视频道",CCTV-1 综合
http://pull.example.com/cctv1.m3u8

#EXTINF:-1 tvg-id="CCTV5" tvg-name="CCTV-5 体育" tvg-logo="https://img.example.com/cctv5.png" group-title="央视频道",CCTV-5 体育
http://pull.example.com/cctv5.m3u8

#EXTINF:-1 tvg-id="HunanTV" tvg-logo="https://img.example.com/hunan.png" group-title="卫视频道",湖南卫视
http://pull.example.com/hunan.m3u8

#EXTINF 属性全表

属性 类型 说明 示例
tvg-id string 与 EPG 中 channel id 匹配 CCTV1
tvg-name string 频道显示名(可与逗号后名称不同) CCTV-1 综合
tvg-logo URL 台标图片完整 URL https://img.ex/cctv1.png
group-title string 频道所属分组名 央视频道
tvg-chno number 频道号,用于排序 1
tvg-shift number EPG 时间偏移(小时) +8

文件头全局参数(#EXTM3U 行)

M3U 文件头全局声明
#EXTM3U x-tvg-url="https://epg.example.com/e.xml" x-tvg-logo-prefix="https://img.example.com/logos/"

# x-tvg-url         → EPG 订阅地址
# x-tvg-logo-prefix → 台标 URL 前缀,tvg-logo 只需写文件名

#EXTINF:-1 tvg-id="CCTV1" tvg-logo="cctv1.png" group-title="央视",CCTV-1
# 实际 logo URL → https://img.example.com/logos/cctv1.png
http://pull.example.com/cctv1.m3u8

自定义 HTTP 请求头(四种方式)

M3U 四种请求头注入方式
#EXTM3U

# ── 方式1:#EXTVLCOPT(每条请求头单独一行)
#EXTINF:-1 group-title="体育",咪咕体育
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)
#EXTVLCOPT:http-referrer=https://www.migu.cn/
#EXTVLCOPT:http-origin=https://www.migu.cn
http://live.migu.cn/xxxxx.m3u8

# ── 方式2:#EXTHTTP(JSON 对象一行写完)
#EXTINF:-1 group-title="体育",腾讯体育
#EXTHTTP:{"Referer":"https://sports.qq.com/","User-Agent":"Mozilla/5.0"}
http://stream.v.qq.com/live.m3u8

# ── 方式3:URL 管道语法(inline,无需额外指令行)
#EXTINF:-1 group-title="体育",优酷体育
http://v.youku.com/live.m3u8|Referer=https://www.youku.com/&User-Agent=Mozilla/5.0

# ── 方式4:设置指令行(将 ua= / referer= / header= 等写在 URL 行之前)
#EXTINF:-1 group-title="体育",爱奇艺体育
ua=Mozilla/5.0 (Linux; Android 12)
referer=https://www.iqiyi.com/
header={"Cookie":"iqiyi_t=abc123"}
http://data.iqiyi.com/live.m3u8

#KODIPROP 完整支持一览

#KODIPROP 键 说明 示例值
inputstream.adaptive.license_type DRM 类型 clearkey / com.widevine.alpha / com.microsoft.playready
inputstream.adaptive.license_key License 服务器 URL(或 ClearKey JSON);远程 URL 支持 url|Headers|R{SSM}| 四段格式 https://lic.ex.com/wv|Content-Type=octet-stream|R{SSM}|
inputstream.adaptive.drm_legacy 类型 + URL 合并写法,格式 type|url ,等价于同时写 license_type + license_key com.widevine.alpha|https://lic.ex.com/wv
inputstream.adaptive.manifest_type 强制 MIME: mpd / dash → DASH, hls → HLS mpd
inputstream.adaptive.stream_headers 流请求头,格式 key=val&key=val ;支持 drmScheme= / drmLicense= 内嵌 DRM Referer=https://ex.com&Origin=https://ex.com
inputstream.adaptive.common_headers 通用请求头,语法同 stream_headers Authorization=Bearer TOKEN
✅ 最佳写法
时长参数建议写 -1 (代表实时流,不限时长),不要写 0 以免部分播放器跳过。
04

JSON 直播格式(FongMi 专属)

JSON 格式是 FongMi/TV 的增强直播格式,支持内嵌分组、多线路、DRM 密钥、自定义请求头等高级功能。可以作为独立 live.json 文件使用,也可以直接内嵌在主配置的 lives 数组里。

完整 JSON 骨架

JSON live.json — 完整骨架
{
  "epg":  "https://epg.example.com/e.xml",
  "logo": "https://img.example.com/logos/",

  "groups": [
    {
      "name": "央视频道",
      "channel": [
        {
          "name":    "CCTV-1 综合",
          "number": "001",
          "logo":   "cctv1.png",
          "epg":    "CCTV1",
          "urls": [
            "http://pull.example.com/cctv1.m3u8"
          ]
        }
      ]
    }
  ]
}

group 对象字段说明

字段 类型 必填 说明 示例值
name string 必填 分组显示名称;若名称含 _ 且同时配置了 pass ,格式为 名称_密码 "央视频道"
channel array 必填 频道对象数组。注意:JSON 键名为单数 "channel" "channels" [{"name":"CCTV-1","urls":[…]}]
pass string 可选 分组访问密码;设置后该分组隐藏,需输入密码才可查看 "1234"
⚠ 常见错误
group 内的频道列表键名必须是 "channel" (单数),写成 "channels" (复数)会导致频道列表无法解析。

channel 对象字段详解

字段 类型 必填 说明 示例值
name string 必填 频道显示名称 "CCTV-1 综合"
urls array 必填 播放地址列表,多元素即多线路;元素格式: urlurl$线路名 ["http://…/cctv1.m3u8$电信","rtmp://…/cctv1$联通"]
number string 可选 频道号(字符串),用于排序与按数字选台 "001"
logo string 可选 台标图 URL(相对台标前缀或完整 URL) "cctv1.png"
epg string 可选 对应 XMLTV 的 channel id,用于匹配节目单 "CCTV1"
tvgId string 可选 TVG ID,用于 logo/EPG 占位符替换;未设置时回退至 tvgName "CCTV1"
tvgName string 可选 TVG 显示名,用于占位符替换;未设置时回退至 name "CCTV-1"
header object 可选 HTTP 请求头键值对(优先级高于直播源级 header) {"Referer":"https://…","User-Agent":"…"}
ua string 可选 User-Agent 快捷字段 "Mozilla/5.0 (Linux; Android 12)"
referer string 可选 Referer 快捷字段 "https://www.migu.cn/"
origin string 可选 Origin 快捷字段 "https://www.migu.cn"
click string 可选 播放跳转解析 URL,频道播放时经此 URL 二次解析 "https://parse.example.com/live"
format string 可选 强制指定 MIME 类型;支持简写: hlsmpd / dash ,或完整 MIME 字符串 "hls" / "mpd" / "video/x-mpegts"
parse number 可选 解析标志; 1 = 强制走解析流程, 0 = 直接播放(默认 0) 1
catchup object 可选 频道级回看配置,覆盖直播源级设置 {"type":"append","source":"?start=…"}
drm object 可选 DRM 加密配置;格式见第 07 节 DRM 章节 {"type":"com.widevine.alpha","key":"https://…"}

catchup 对象字段说明

字段 类型 说明 示例值
source string 必填。回看 URL 模板,支持时间占位符: ${(b)yyyyMMddHHmmss} (开始)、 ${(e)yyyyMMddHHmmss} (结束)、 ${utc:} / ${utcend:} (Unix 时间戳) "?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}"
type string append (默认)= 拼接到直播 URL 尾部; default = 直接用 source 替换 URL "append"
days string 可回看天数 "7"
regex string 用于判断当前 URL 是否支持回看的正则表达式 "/PLTV/"
replace string type=append 时生效,格式 原字符串,替换字符串 ,用于替换 URL 路径片段 "/PLTV/,/TVOD/"

独立 live.json 顶层字段

live.json 作为独立配置文件使用时,支持以下顶层字段对请求层、代理、规则等进行全局控制:

JSON 独立 live.json — 完整顶层结构
{
  // 全局 Spider JAR(所有 lives[] 若未指定 jar 则回退至此)
  "spider": "https://example.com/spider.jar",

  // 直播源列表
  "lives": [ /* ... 同 main config lives[] 结构 */ ],

  // 响应拦截头(注入所有 OkHttp 响应)
  "headers": [
    { "name": "Access-Control-Allow-Origin", "value": "*" }
  ],

  // HTTP 代理配置
  "proxy": [
    { "host": "proxy.example.com", "port": 8080,
      "username": "user", "password": "pass" }
  ],

  // URL 重写规则(正则替换)
  "rules": [
    { "regex": "http://old\\.cdn\\.com", "replace": "https://new.cdn.com" }
  ],

  // 自定义 DNS 主机映射
  "hosts": [
    "192.168.1.1 internal.example.com"
  ],

  // 广告 URL 过滤关键词(匹配到则拦截)
  "ads": [
    "ad.example.com", "tracking.example.com"
  ]
}
05

EPG 节目单配置

EPG(Electronic Program Guide)让观众在直播界面看到节目名称、时间表,支持回看(需直播源本身支持)。FongMi/TV 使用标准 XMLTV 格式,每 6 小时自动刷新一次。

在主配置中设置 EPG

JSON config.json — EPG 配置
{
  // 全局 EPG(所有直播源共用)
    "epg": "https://epg.example.com/e.xml",

  // 支持 .xml.gz 压缩包(自动解压)
  "epg": "https://epg.example.com/e.xml.gz",

  "lives": [
    {
      "name": "我的直播",
      "url":  "https://example.com/live.m3u",
      // 该直播源专属 EPG(优先级高于全局)
            "epg": "https://epg2.example.com/cn.xml"
    }
  ]
}

XMLTV 格式(自定义 EPG 文件)

XML e.xml — XMLTV 最小结构
<?xml version="1.0" encoding="UTF-8"?>
<tv generator-info-name="my-epg">

  <!-- ① 频道定义 ──────────────────────────── -->
    <channel id="CCTV1">
    <display-name lang="zh">CCTV-1 综合</display-name>
    <icon src="https://img.example.com/cctv1.png" />
  </channel>

  <!-- ② 节目表 ────────────────────────────── -->
  <!-- start/stop 格式:YYYYMMDDHHmmss +时区 -->
    <programme start="20260312080000 +0800" stop="20260312090000 +0800" channel="CCTV1">
    <title lang="zh">朝闻天下</title>
    <desc  lang="zh">早间新闻资讯节目</desc>
  </programme>

</tv>
ℹ️ EPG 频道 ID 匹配规则
直播源中每个频道的 tvg-id (M3U)或 epg (JSON格式)必须与 XMLTV 文件中 <channel id="..."> 完全一致(区分大小写)才能匹配节目单。
06

多线路 / 多源切换

FongMi/TV 支持为同一个频道配置多条流地址,播放失败时可手动或自动切换。

TXT
TXT 多线路
# 分隔地址,用 url$线路名 内嵌命名,可与请求头管道语法组合。
M3U
M3U 多线路
重复写同名 #EXTINF 条目,每条 URL 为一路线路。
JSON
JSON 多线路
urls 数组中添加多个元素即为多路。

TXT 多线路详细示例

TXT TXT 多线路三种写法
央视频道,#genre#

# ① 简单多线路(用 # 分隔地址)
CCTV-1,http://line1.ex/cctv1.m3u8#http://line2.ex/cctv1.m3u8

# ② 带线路名(url$线路名 格式)
CCTV-5 体育,http://line1.ex/cctv5.m3u8$电信#http://line2.ex/cctv5.m3u8$联通#http://line3.ex/cctv5.m3u8$移动

# ③ 多线路 + 请求头(管道语法)
CCTV-4 中文,http://line1.ex/cctv4.m3u8$电信|Referer=https://example.com#http://line2.ex/cctv4.m3u8$联通|Referer=https://example.com

M3U 多线路详细示例

M3U 同一频道多条 #EXTINF 条目
#EXTM3U

# 重复同名条目 = 多线路
#EXTINF:-1 tvg-id="CCTV5" group-title="央视",CCTV-5 体育
http://line1.example.com/cctv5.m3u8

#EXTINF:-1 tvg-id="CCTV5" group-title="央视",CCTV-5 体育
http://line2.example.com/cctv5.m3u8

#EXTINF:-1 tvg-id="CCTV5" group-title="央视",CCTV-5 体育
rtmp://backup.example.com/live/cctv5

支持的流协议

协议 URL 前缀示例 说明
HLS http(s)://…/live.m3u8 最常见,点播 / 直播通用
RTMP rtmp://…/live/stream 低延迟直播,需 FFmpeg 软解
RTSP rtsp://…/stream IP 摄像头 / 局域网直播
RTP/UDP rtp://239.x.x.x:port 组播,IPTV 有线环境
FLV http(s)://…/live.flv 常见于国内直播平台
MPEG-TS http(s)://…/live.ts 卫星或有线数字电视流
DASH http(s)://…/manifest.mpd 自适应码率,支持 DRM
07

DRM 加密流播放

FongMi/TV 原生支持 WidevinePlayReadyClearKey 三种 DRM 方案。

⚠ 说明
DRM 解密需要设备具备相应的 DRM 授权(Widevine L1/L3 等)。ClearKey 是最容易测试的方案,因为密钥可以明文声明。

ClearKey(明文密钥)

M3U ClearKey DRM — 标准 JSON 写法与十六进制短格式
#EXTM3U

#EXTINF:-1 group-title="加密频道",付费体育 HD

# 方式1:完整 ClearKey JSON
#KODIPROP:inputstream.adaptive.license_type=clearkey
#KODIPROP:inputstream.adaptive.license_key={"keys":[{"kty":"oct","k":"BASE64URL_KEY","kid":"BASE64URL_KID"}],"type":"temporary"}

# 方式2:十六进制短格式 KID:KEY(App 自动转换为标准 JSON)
#KODIPROP:inputstream.adaptive.license_type=clearkey
#KODIPROP:inputstream.adaptive.license_key=a0b1c2d3e4f50001a0b1c2d3e4f50001:deadbeef01020304deadbeef01020304
# 多组密钥用逗号分隔:kid1:key1,kid2:key2

http://encrypted.example.com/channel.mpd

Widevine(License 服务器)

M3U Widevine DRM — License Server
#EXTM3U

#EXTINF:-1 group-title="加密频道",NBA 直播

#KODIPROP:inputstream=inputstream.adaptive
#KODIPROP:inputstream.adaptive.license_type=com.widevine.alpha
#KODIPROP:inputstream.adaptive.license_key=https://widevine.example.com/license|Content-Type=application/octet-stream|R{SSM}|

# license_key 格式:URL|Headers|Request|Response
# R{SSM} = 将 DRM 请求 body 原样转发

http://protected.example.com/nba.mpd

在 JSON 格式中声明 DRM

JSON JSON live 内嵌 DRM 配置
{
  "groups": [{
    "name": "加密频道",
    "channel": [{
      "name": "付费 4K 体育",
      "urls": ["https://protected.example.com/4k.mpd"],
            "drm": {
        "type":     "com.widevine.alpha",
        "key":      "https://lic.example.com/widevine",
        "forceKey": false,
        "header": { "Authorization": "Bearer YOUR_TOKEN" }
      }                                     
    }]
  }]
}

drm 对象字段说明

字段 类型 说明 示例值
type string DRM 类型 "com.widevine.alpha" / "com.microsoft.playready" / "clearkey"
key string License 服务器 URL(Widevine/PlayReady),或 ClearKey 的内联 JSON 密钥字符串,或 kid:key 十六进制短格式 "https://widevine.example.com/license"
forceKey boolean true = 强制使用 key 中的地址作为默认 License URI false
header object License 请求附加的 HTTP 请求头(如 Authorization) {"Authorization":"Bearer TOKEN"}
08

最佳实践 & 常见问题

编写流程建议

常见错误排查

现象 可能原因 解决方案
频道列表空白 URL 不可访问 / 格式错误 用浏览器打开 URL 确认内容可见;检查逗号是否为英文
无法播放(卡死) 流地址失效 / 编码不支持 切换备用线路;尝试切换播放器类型(EXO↔IJK)
节目单不显示 EPG URL 错误 / tvg-id 不匹配 检查 EPG URL;核对 tvg-id 与 XMLTV channel id 是否完全一致
台标不显示 logo URL 失效 / 前缀配置错误 检查台标 URL 是否可访问;确认相对路径 + 前缀拼接结果正确
TXT 解析只有一行 换行符问题(\r\n vs \n) 用 UTF-8 + LF 保存文件,避免 Windows CRLF
DRM 流黑屏 设备 Widevine 等级 L3 / 密钥错误 先用 ClearKey 测试调试;检查 License URL 和请求头
JSON 频道不显示 键名写成 "channels"(复数) 改为 "channel" (单数)

格式对比总结

维度 TXT (#genre#) M3U JSON
上手难度 ⭐ 最简单 ⭐⭐ 适中 ⭐⭐⭐ 较复杂
跨软件兼容 国产软件为主 ✅ 最广泛 FongMi 专属
多线路命名 支持 url$名称 重复条目 ✅ 最清晰(urls 数组)
DRM 支持 ✅ #KODIPROP ✅ drm 对象
请求头控制 指令行 / 管道语法 4 种方式 ✅ header 对象
EPG 绑定 频道名匹配 tvg-id 属性 epg 字段
回看(Catchup) 有限支持 ✅ catchup 对象