直播配置入口(lives[])
直播订阅通过主配置 JSON 文件中的 lives 字段引入。每个元素对应一个直播订阅源,App 中可以切换不同源。
{
"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 |
api
字段代替
url
。
api / ext / jar —— 脚本驱动直播源
当直播源需要动态解析时,不写 url ,改用 api + ext + jar 组合:
{
"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"
}
]
}
TXT(#genre#)格式
最简单的国产直播格式。规则是:每行 频道名,URL ;分组用一行 分组名,#genre# 开头标注。
基础语法
# 格式:频道名称,直播地址
# 分组行:分组名称,#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
多线路语法(同一频道多个地址)
用 # 分隔同一频道的多个流地址;在每段地址末尾追加 $线路名 可给该线路命名:
央视频道,#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 请求头,无需额外指令行:
体育频道,#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# 新分组时自动重置):
付费频道,#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:
hls
、
mpd
/
dash
或完整 MIME 字符串
|
format=hls |
| forceKey= | DRM 强制密钥;true/false | forceKey=true |
tvgId
→
tvgName
→
name
三个值,直接把频道名命名为 XMLTV 中的 channel id 即可自动绑定。
,
),分组行末尾必须是
,#genre#
。中文逗号或空格会导致解析失败。文件编码请使用 UTF-8 + LF(不要 CRLF)。
M3U / M3U8 格式
国际 IPTV 标准格式,两行为一个频道条目: #EXTINF 元信息行 + 流 URL 行。
基础 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 行)
#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 请求头(四种方式)
#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
以免部分播放器跳过。
JSON 直播格式(FongMi 专属)
JSON 格式是 FongMi/TV 的增强直播格式,支持内嵌分组、多线路、DRM 密钥、自定义请求头等高级功能。可以作为独立 live.json 文件使用,也可以直接内嵌在主配置的 lives 数组里。
完整 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" |
"channel"
(单数),写成
"channels"
(复数)会导致频道列表无法解析。
channel 对象字段详解
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| name | string | 必填 | 频道显示名称 | "CCTV-1 综合" |
| urls | array | 必填 |
播放地址列表,多元素即多线路;元素格式:
url
或
url$线路名
|
["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 类型;支持简写:
hls
、
mpd
/
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 作为独立配置文件使用时,支持以下顶层字段对请求层、代理、规则等进行全局控制:
{
// 全局 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"
]
}
EPG 节目单配置
EPG(Electronic Program Guide)让观众在直播界面看到节目名称、时间表,支持回看(需直播源本身支持)。FongMi/TV 使用标准 XMLTV 格式,每 6 小时自动刷新一次。
在主配置中设置 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 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>
tvg-id
(M3U)或
epg
(JSON格式)必须与 XMLTV 文件中
<channel id="...">
完全一致(区分大小写)才能匹配节目单。
多线路 / 多源切换
FongMi/TV 支持为同一个频道配置多条流地址,播放失败时可手动或自动切换。
#
分隔地址,用
url$线路名
内嵌命名,可与请求头管道语法组合。
#EXTINF
条目,每条 URL 为一路线路。
urls
数组中添加多个元素即为多路。
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 多线路详细示例
#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 |
DRM 加密流播放
FongMi/TV 原生支持 Widevine 、 PlayReady 、 ClearKey 三种 DRM 方案。
ClearKey(明文密钥)
#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 服务器)
#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
{
"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"} |
最佳实践 & 常见问题
编写流程建议
-
1确认流地址是否可访问用 VLC、PotPlayer 或 curl 先验证 URL 能正常播放,再写入订阅文件。
-
2选择合适格式简单场景用 TXT 或 M3U;需要精细控制 Header、DRM、多线路命名时用 JSON 格式。
-
3配置 EPG确保 tvg-id(M3U)或 epg(JSON)与 XMLTV 文件中的 channel id 完全一致,注意区分大小写。
-
4托管到可访问的 URL推荐 GitHub Raw、Gitee、Cloudflare Pages 或私有服务器。文件必须可以被设备直接 HTTP 访问。
-
5在 FongMi/TV 中填入订阅地址进入 App → 设置 → 直播配置,填入文件 URL 或把链接写入主配置的 lives[].url 字段。
常见错误排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 频道列表空白 | 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 对象 |