一、这个项目解决什么问题
周末想找个外国频道看球赛,打开电视发现都要付费。作为后端工程师,我第一反应是去 GitHub 搜搜有没有公开的 IPTV 源。iptv-org/iptv 是我见过最全的——超过 30000 个频道,覆盖全球 200+ 国家,按语言、类别(新闻、体育、电影等)分类。它不提供视频流,而是维护一个 M3U 播放列表仓库,任何播放器(VLC、Kodi、PotPlayer)导入列表就能直接播放。
二、核心功能与数据解析
频道数量与分类
官方 README 说共有 30000+ 频道。我实际 clone 后发现,真正的可用的(能连上服务器)大概只有 60-70%。列表按国家组织,比如 channels/ 下每个国家一个 JSON 文件,列出频道名称、logo、流URL、分类等。同时提供 iptv.m3u 和 iptv.m3u8 两个聚合文件,直接打开就是所有频道。
分类很细:
- 按区域:亚洲、欧洲、非洲…
- 按语言:中文、英语、法语…
- 按内容:体育、新闻、纪录片、儿童…

上图是 cloned 仓库的 channels 目录结构,每个国家一个 JSON,包含频道元数据和多个流来源。
更新频率与质量
项目使用 GitHub Actions 每天自动扫描所有来源,检测流是否在线,然后更新 playlists。根据我的观察,每天约有 5-10% 的链接会失效,新源也会被添加。质量参差不齐:BBC、CNN 这种大型频道稳定,但很多小国频道时断时续。测速我写过一个小脚本(下文给代码),平均延迟在 2-5 秒左右,码率从 480p 到 1080p 都有。
三、动手解析:Python 读取 M3U 并检测可用性
光看不练假把式。写个 Python 脚本,下载 iptv.m3u,提取频道名和 URL,并测试每个流能否连接。这才是开发者该干的事。
安装依赖
pip install requests m3u8
下载并解析 M3U
import requests
import m3u8
# 获取 github 上的 iptv.m3u 原始链接
url = "https://raw.githubusercontent.com/iptv-org/iptv/master/iptv.m3u"
resp = requests.get(url, timeout=30)
if resp.status_code != 200:
raise Exception("下载失败")
# 用 m3u8 库解析
playlist = m3u8.loads(resp.text)
# 提取第一个频道的名字和 URL(示例)
first = playlist.segments[0] if playlist.segments else playlist.keys[0]
print(f"频道名: {first.title}")
print(f"流地址: {first.uri}")
注意:m3u8 库对标准 M3U8 支持好,但 iptv-org 用的是传统 M3U(#EXTINF 格式)。不过 m3u8 也能解析大部分。如果想深入控制,可以用 py310 版本的 re 手工解析。
手动解析并检测连通性
import re
import socket
def parse_m3u(content: str):
lines = content.split("\n")
channels = []
for i, line in enumerate(lines):
if line.startswith("#EXTINF:"):
# 提取频道名(最后一个逗号之后)
name = line.rsplit(",", 1)[-1].strip()
# 下一行就是 URL
if i+1 < len(lines) and not lines[i+1].startswith("#"):
url = lines[i+1].strip()
channels.append((name, url))
return channels
channels = parse_m3u(resp.text)
print(f"共解析到 {len(channels)} 个频道")
# 测试第一个频道的 TCP 连接(非完整检测,快)
def test_reach(url: str, timeout=3):
try:
if url.startswith("rtmp://"):
# RTMP 需要额外库,这里跳过
return False
host, port = "", 80
if url.startswith("http"):
# 提取主机
from urllib.parse import urlparse
parsed = urlparse(url)
host = parsed.hostname
port = parsed.port or (443 if parsed.scheme == "https" else 80)
else:
# 直接 IP:port
host, port = url.split("//")[-1].split(":")
sock = socket.create_connection((host, int(port)), timeout)
sock.close()
return True
except Exception:
return False
name, url = channels[0]
reachable = test_reach(url)
print(f"{name} 可达性: {reachable}")
这只是个快筛。如果你真的要批量验证,建议用 ffprobe 或 requests 完成一次 HTTP GET 返回的媒体类型检查。不过注意:大量请求会 ip 被屏蔽,所以只测 10 个频道即可。
四、竞品对比:为什么要选 iptv-org?
其他公开播放列表仓库也不少,比如 IPTV-Playlists、free-iptv、iptv-list。我自己都试过,iptv-org 胜在三点:
- 组织规范:频道元数据全 JSON 格式,带分类、logo、语言。其他项目经常是乱糟糟的纯 M3U。
- 自动化 CI:每天跑检测,失效链接会在下一次更新中移除或标记。质量有底线保障。
- 社区活跃:Issues 里经常有人汇报失效链接,维护者很快回应。而其他很多项目已经 2 年没更新了。
但如果你需要稳定高质量源(比如给产品用),建议别直接用公开列表。可以拿 iptv-org 作为初始数据源,自己搭监测和抓源引擎。
和商业 IPTV 服务(如 TiviMate 订阅、YouTube TV)比:
- 免费 vs 付费:价格差几十倍。
- 质量:商业服务 UHD、HDR,公用源大多 720p。
- 稳定性:商业 99.9% SLA,公用源可能晚上卡顿。
一句话:开发者尝鲜、临时使用、做实验完美;想当主力电视?做好翻车准备。
五、局限与适用边界
法律风险(必须说)
iptv-org 声明只收录公开的免费流。但很多频道所在国家有法律限制(例如 BBC iPlayer 只限英国 IP,中国某些频道只在境内开放)。你通过 IPTV 播放器访问这些流,可能违反服务条款。虽然不是直接盗播,但风险存在。建议只用在个人测试,不要商用。
稳定性与速度
公开流普遍不如商业 CDN。我测试过晚上 8 点高峰,CNN 要缓冲 10 秒才能播放。而且很多源只有单服务器,一旦 down 就没了。
地域限制
大多数流会检测 IP 地址。如果你在中国大陆,很多国际频道无法直接访问。需要搭配代理或 VPN,但这又涉及更多法律法规。
不适合生产环境
如果你在做一个类似“电视直播”的产品,不要拿这些源直接给用户。因为:
- 链接随时变
- 码率低
- 没有播放授权
- 维护成本高:每天扫描 30000 个链接耗资源
六、快速上手步骤
在 VLC 中使用
- 打开 VLC Media Player
- 菜单
Media→Open Network Stream - 输入
https://iptv-org.github.io/iptv/index.m3u(官方 CDN 地址,比 GitHub raw 更快) - 点击
Play,VLC 会加载所有频道到播放列表
在 PotPlayer 中使用
- 右键 →
打开→打开链接 - 粘贴上面 URL
- 回车即可
用 Docker 自建代理(高级)
如果你想在国内访问,可以用 nginx 反向代理转发:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
nginx.conf:
server {
listen 80;
location / {
proxy_pass https://iptv-org.github.io/;
proxy_set_header Host iptv-org.github.io;
resolver 8.8.8.8;
}
}
然后本地浏览器访问 http://localhost/iptv/index.m3u。
七、个人看法
iptv-org 是我见过维护最勤快的公开 IPTV 列表项目。它的意义不是直接当主力源,而是作为一个数据基础——你拿到它们,可以自己写爬虫抓更稳定的源、可以结合 ffmpeg 转码、可以做网络质量监测。对于想学多媒体流处理的开发者,这是绝佳的实践素材。
另一方面,如果你的老板让你“免费集成电视功能”,请给他泼冷水:这玩意没 SLA,没人给你兜底。用在自己玩项目可以,商业项目不行。

上图是我在 VLC 中加载 index.m3u 后看到的一堆频道,虽然 logo 不太全,但能播。
最后,如果你真的需要高质量免费源,建议去研究数字电视标准(DVB-T/C/S)抓本地直播源,或者用合法渠道的流媒体平台。公开 IPTV 只能当小玩具。
延伸阅读:
- M3U 格式规范
- 使用 ffmpeg 检测 RTMP 流可用性
- iptv-org 官方 API 文档(可以用 JSON 获取频道列表)
# 用 curl 快速获取所有中国频道
curl -s https://iptv-org.github.io/api/v1/channels.json | jq '.[] | select(.country.code=="CN") | {name, url}'