用 iptv-org 免费获取全球直播源,省去手动找源的痛苦

背景:找直播源有多烦

如果你像我一样偶尔想看看海外新闻、体育直播或一些冷门频道,通常只有两条路:

  1. 买付费 IPTV 服务——每个月几十块,频道还经常不稳定。
  2. 上各种论坛、百度云搜“直播源.m3u”——结果 80% 过期,剩下 20% 是盗链,播两分钟就断。

直到我发现了 iptv-org/iptv。这个项目在 GitHub 上每天稳定更新,今天刚破了 120k stars。它其实就是一个大仓库,收录了全球各地公开的 IPTV 频道(注意,是公开的,不是盗版),以标准的 m3u 格式提供。你不需要注册账号,直接复制链接就能用 VLC、Kodi、PotPlayer 播放。

核心功能:比你想象的更全

这个项目不只有一个 m3u 文件。它按频道分类生成了多个子列表,你在 https://iptv-org.github.io/iptv/ 上看一眼就知道:

  • 按语言index/english.m3uindex/chinese.m3u 等。
  • 按国家index/us.m3uindex/cn.m3u
  • 按类型categories/news.m3ucategories/sports.m3u
  • 组合languages/chinese.m3u 同时包含中国大陆、台湾、海外华语频道。

每个频道条目包含:频道名称、logo(可选)、tvg-id、group-title(用于 EPG 导视)。

举个例子,打开 https://iptv-org.github.io/iptv/index/english.m3u,你会看到类似这样:

text
1 2 3
#EXTM3U
#EXTINF:-1 tvg-id="BBCWorldNews.uk" tvg-name="BBC World News" tvg-logo="https://logoUrl" group-title="News",BBC World News
http://example.com/stream.m3u8

重点来了:这个项目还提供了 REST API,你可以用编程方式查询频道信息,而不是直接解析 m3u 文件。

代码示例:用 Node.js 获取中文频道并输出可用的流地址

很多开发者想把这些频道集成到自己应用里(比如做个自定义电视墙、监控大屏)。直接拿整个 m3u 文件解析太慢,而且很多流已经过期。推荐用 iptv-org 的 API 配合请求重试找出可用的。

先安装依赖:

bash
1
npm install axios

然后写一个简单的脚本 fetch-iptv.js

javascript
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
const axios = require('axios');

// 从 iptv-org API 获取中文频道列表
// 文档:https://github.com/iptv-org/api
async function getChineseChannels() {
  const response = await axios.get('https://iptv-org.github.io/iptv/index/chinese.m3u');
  // 解析 m3u 格式
  const lines = response.data.split('\n');
  const channels = [];
  let current = {};
  for (const line of lines) {
    if (line.startsWith('#EXTINF:')) {
      // 提取 tvg-name 和 group-title
      const nameMatch = line.match(/tvg-name="([^"]+)"/);
      const groupMatch = line.match(/group-title="([^"]+)"/);
      current.name = nameMatch ? nameMatch[1] : 'Unknown';
      current.group = groupMatch ? groupMatch[1] : 'Other';
    } else if (line.startsWith('http')) {
      current.url = line.trim();
      channels.push({...current});
      current = {};
    }
  }
  return channels;
}

// 测试:过滤出新闻类频道
(async () => {
  const all = await getChineseChannels();
  const newsChannels = all.filter(ch => ch.group && ch.group.toLowerCase().includes('news'));
  console.log(`共找到 ${all.length} 个中文频道,其中新闻类 ${newsChannels.length} 个`);
  console.log(newsChannels.slice(0, 3));
})();

运行 node fetch-iptv.js 会输出类似:

text
1 2 3 4 5 6
共找到 168 个中文频道,其中新闻类 12 个
[
  { name: 'CCTV-13', group: 'News', url: 'http://...' },
  { name: 'Phoenix Infonews', group: 'News', url: 'http://...' },
  { name: 'Xinhua TV', group: 'News', url: 'http://...' }
]

注意:上面的 url 只是示例,实际项目中很多流是来自中国公开直播(比如央视官网的 hls),但因为版权原因,部分国内频道可能被剥离。如果你要找的是中国大陆频道,建议直接使用 iptv-org 的 index/cn.m3u,但很大概率只能拿到海外华语频道。

和同类项目的区别

市面上还有几个类似的开源项目:

  • epg.pw / freesat.cn:单个网站维护,更新不及时,经常死链。
  • tv.garden:界面好看,但数据量小(几千个频道),且没有 API。
  • iptv-org:数据来自社区+爬虫,每天 CI 自动验证链接有效性,有详细的分类和 API。

我的实际体验:iptv-org 的中文频道数量在 150-200 之间,比 tv.garden 多 3 倍。但它的缺点也很明显——链接验证只是简单的 HTTP 响应码检查,很多流返回 200 但实际内容无法解码(比如加密的 HLS 或需要 referer)。所以你要用的话,最好跑一个二次验证(比如用 ffprobe 检查能否解码)。

适用场景与局限

适合这样用

  • 个人看新闻/体育:直接用 VLC 打开 https://iptv-org.github.io/iptv/index/chinese.m3u,选你感兴趣的。
  • 学习流媒体开发:拿来当测试数据,解析 m3u 格式,练习播放器集成。
  • 做数字标牌/大屏:像上面代码一样,用 Node.js 过滤后嵌入到自己的网站里。

千万别这么用

  1. 商用直播服务:所有频道都是第三方公开流,随时可能失效或变更域名。你拿来卖给客户,明天就可能被投诉。
  2. 需要稳定高清源的场景:iptv-org 的很多流是 480p 甚至更低,而且可能有缓冲。如果要做电视直播应用,建议购买正规 IPTV 服务商接口。
  3. 中国大陆内网环境:部分海外 ISP 的流被 GFW 屏蔽,你用国内服务器抓取会直接超时。

快速上手步骤

如果只是想立刻看,不用写一行代码:

  1. 打开 VLC 媒体播放器(免费,支持 Windows/Mac/Linux)。
  2. 菜单:媒体 -> 打开网络串流。
  3. 输入以下任意一个 URL(注意区分语言):
    • 全量:https://iptv-org.github.io/iptv/index.m3u
    • 中文:https://iptv-org.github.io/iptv/languages/chinese.m3u
    • 美国:https://iptv-org.github.io/iptv/countries/us.m3u
  4. 点击播放,等几秒缓冲,你就可以开始换台了。

如果你是开发者,想手动验证链接有效性,可以用 ffmpeg:

bash
1
ffmpeg -i "http://streamUrl" -t 5 -f null - 2>&1 | grep -i "error"

没有报错说明流可用。

总结(严格来说不是总结)

iptv-org 是寻找免费公开直播源的绝佳起点。它最大的价值不是提供稳定服务,而是节省你全网搜索直播源的时间。拿到列表后,你还需要自己做二次验证和过滤。如果你希望一步到位、即开即用,那它不合适;但如果你像我一样喜欢折腾,愿意用一个周末写个脚本把可用源挑出来,那它值得你 star。