一、这个项目解决什么问题

周末想找个外国频道看球赛,打开电视发现都要付费。作为后端工程师,我第一反应是去 GitHub 搜搜有没有公开的 IPTV 源。iptv-org/iptv 是我见过最全的——超过 30000 个频道,覆盖全球 200+ 国家,按语言、类别(新闻、体育、电影等)分类。它不提供视频流,而是维护一个 M3U 播放列表仓库,任何播放器(VLC、Kodi、PotPlayer)导入列表就能直接播放。

二、核心功能与数据解析

频道数量与分类

官方 README 说共有 30000+ 频道。我实际 clone 后发现,真正的可用的(能连上服务器)大概只有 60-70%。列表按国家组织,比如 channels/ 下每个国家一个 JSON 文件,列出频道名称、logo、流URL、分类等。同时提供 iptv.m3uiptv.m3u8 两个聚合文件,直接打开就是所有频道。

分类很细:

  • 按区域:亚洲、欧洲、非洲…
  • 按语言:中文、英语、法语…
  • 按内容:体育、新闻、纪录片、儿童…

country channel list M3U structure
上图是 cloned 仓库的 channels 目录结构,每个国家一个 JSON,包含频道元数据和多个流来源。

更新频率与质量

项目使用 GitHub Actions 每天自动扫描所有来源,检测流是否在线,然后更新 playlists。根据我的观察,每天约有 5-10% 的链接会失效,新源也会被添加。质量参差不齐:BBC、CNN 这种大型频道稳定,但很多小国频道时断时续。测速我写过一个小脚本(下文给代码),平均延迟在 2-5 秒左右,码率从 480p 到 1080p 都有。

三、动手解析:Python 读取 M3U 并检测可用性

光看不练假把式。写个 Python 脚本,下载 iptv.m3u,提取频道名和 URL,并测试每个流能否连接。这才是开发者该干的事。

安装依赖

bash
1
pip install requests m3u8

下载并解析 M3U

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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 手工解析。

手动解析并检测连通性

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
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-Playlistsfree-iptviptv-list。我自己都试过,iptv-org 胜在三点:

  1. 组织规范:频道元数据全 JSON 格式,带分类、logo、语言。其他项目经常是乱糟糟的纯 M3U。
  2. 自动化 CI:每天跑检测,失效链接会在下一次更新中移除或标记。质量有底线保障。
  3. 社区活跃: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 中使用

  1. 打开 VLC Media Player
  2. 菜单 MediaOpen Network Stream
  3. 输入 https://iptv-org.github.io/iptv/index.m3u(官方 CDN 地址,比 GitHub raw 更快)
  4. 点击 Play,VLC 会加载所有频道到播放列表

在 PotPlayer 中使用

  1. 右键 → 打开打开链接
  2. 粘贴上面 URL
  3. 回车即可

用 Docker 自建代理(高级)

如果你想在国内访问,可以用 nginx 反向代理转发:

dockerfile
1 2
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf

nginx.conf:

nginx
1 2 3 4 5 6 7 8
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 播放 IPTV 截图
上图是我在 VLC 中加载 index.m3u 后看到的一堆频道,虽然 logo 不太全,但能播。

最后,如果你真的需要高质量免费源,建议去研究数字电视标准(DVB-T/C/S)抓本地直播源,或者用合法渠道的流媒体平台。公开 IPTV 只能当小玩具。

延伸阅读

bash
1 2
# 用 curl 快速获取所有中国频道
curl -s https://iptv-org.github.io/api/v1/channels.json | jq '.[] | select(.country.code=="CN") | {name, url}'