全部指南

九千个频道,你看的只有二十个

iPhone 和 CarPlay 上的 IPTV 频道分组。 是二十个频道,不是九千个。

iPhone 和 CarPlay 上的 IPTV 频道分组来自播放列表文件本身:#EXTINF 行上的 group-title 属性,或者它下面的一行 #EXTGRP。Dashow 在 iPhone 上用这些值搭出电视直播的分组菜单。两者都不声明的播放列表进来是平的,这时把你常看的频道添加到收藏。

即将上线 App Store使用方法
产品示意图。使用体验取决于 App 与显示设备的兼容性。
  • 01

    分组写在播放列表里:#EXTINF 行上的 group-title,或者单独一行的 #EXTGRP。

  • 02

    group-title 是事实上的 M3U 扩展,所以同一个文件在每个播放器里的排法都不一样。

  • 03

    文件里没有分类时,“收藏”和“最近观看”是最快找到 IPTV 频道的路。

使用方法

快速上手

  1. 01

    在“浏览”里打开电视直播

    “浏览”从位置开始,电视直播里放着你的 IPTV 频道。

  2. 02

    用分组菜单

    先选来源,再用分组菜单把频道范围缩小。

  3. 03

    把常看的添加到收藏

    把你常看的频道标记一下,它们就聚到“收藏”里。

  4. 04

    打开播放列表文件看看

    没有分组菜单时,打开那个 .m3u,搜索 group-title 和 #EXTGRP。

一列到底的频道列表,是文件的属性。

你缺的那份分组,不是播放器里的一个设置。它是播放列表里的数据。M3U 是一个文本文件,每个频道至少占两行:一行 #EXTINF 带着这个频道的元数据,紧接着下面是流媒体地址。分类就写在那个地址上面。

所以装着同样频道的两份播放列表,在同一部 iPhone 上表现不同。一份打开时带着新闻、体育、电影这几个分组菜单。另一份打开是九千行排成一列。手机这边没有任何差别。差别在文件。

读一行 #EXTINF,再看看有没有 #EXTGRP。

这是一条完整的频道条目:#EXTINF:-1 tvg-id="123" tvg-name="Channel Name" tvg-logo="http://example.com/logo.png" group-title="News", Channel Name。时长和逗号之间的全部内容是键值元数据,逗号后面的文字是播放器显示的名称。时长写 -1 或 0,表示这是一路没有预定长度的流媒体。

多数播放列表里会出现四个属性,其中一个做出了分类。分组也可以写在单独一行上。#EXTINF 行上的 group-title 优先;它不存在时,下面那一行 #EXTGRP 为紧随其后的条目指定分组。用纯文本编辑器把 .m3u 里这两样都搜一遍,因为一个文件可以带着分类,却全文没有 group-title。

  1. tvg-id,服务商分配给这条频道条目的标识符。
  2. tvg-name,来源那边写法的频道名称,和逗号后面的显示名称分开存放。
  3. tvg-logo,频道台标图片的 HTTP 地址。
  4. group-title,分类名称。搭出分组的就是这个属性。

group-title 是事实上的扩展,不是规范。

RFC 8216 把 #EXTINF 规定为 HTTP 实时流媒体的一部分,定义的是时长和逗号后面的标题文字。它对 tvg-id, tvg-logo, group-title 和 #EXTGRP 只字未提。这些属性是在播放列表工具和播放器的实际使用中长出来的,没有任何标准组织批准过它们。

没有裁判。这就解释了为什么一个播放器能从播放列表搭出分类树,另一个把同一个文件显示成一长列:各自决定了读哪些属性。这也解释了为什么服务商改一个属性,就能把你的分类重新排一遍。

在 Dashow 里穿过 IPTV 频道分组。

电视直播待在“浏览”里,和“收藏”“已保存的视频”以及你的各个连接排在一起。打开它,来源菜单给出播放列表的名字,分组菜单里放着文件提供的那些分类。两个菜单都记得你上次的选择,所以周二缩小过的频道范围,周三打开还是那样。

版式会自己适应。iPad 一屏显示的分类内容比 iPhone 多。如果记住的选择在刷新后的文件里消失了,它会恢复到一个有效的选择,而不是留给你一块空屏。搜索在你当前所在的位置内进行,所以从电视直播发起的搜索,返回的是频道。

用“收藏”建一份短名单。

播放列表里完全没有 IPTV 频道分组时,答案是“收藏”。把一个直播频道标记一下,它就进了“浏览”里的“收藏”位置,这份名单由你自己拟,而不是服务商写好的。标记二十个频道,效果就像一个没有任何 #EXTINF 行声明过的分类。

其余的交给“最近观看”。你打开过的直播频道会按观看顺序留下来,用的是设备本地记录的观看时间。一份短短的“收藏”加上“最近观看”,午饭时间 iPhone 打开就是新闻,而不是九千行。

刷新会带来新文件声明的那些分类。

播放列表刷新是事务性的:新列表完整到达时才替换旧的,刷新失败则设备上已有的频道原样保留。刷新成功之后,分类就是新文件声明的那些。服务商把 Sports 改名成 SPORT,你的分组就跟着改名。

这一页停在列表这里。添加播放列表是 M3U 播放列表那篇指南,列表加载不出来或播不了属于播放列表排查指南,直播频道上车载显示屏则是 CarPlay 看 IPTV 那一页。文件不声明任何分类时,可以请来源加上 group-title。

IETF:RFC 8216,HTTP 实时流媒体M3U 扩展指令,含 #EXTGRPApple:HTTP 实时流媒体(HLS)

常见问题

你可能还想了解。

为什么我的播放列表把所有频道排成一列?

因为文件没有为它们声明分类。M3U 有两种方式命名分组:#EXTINF 行上的 group-title 优先,这个属性不存在时,用它下面的一行 #EXTGRP。把 .m3u 里这两样都搜一遍;两样都没有,就该去问来源。

能把从来不看的分类隐藏掉吗?

电视直播里的分组菜单一次选中一个分类,其余的就不在屏幕上了。想更快一点,把你常看的 IPTV 频道添加到收藏,再在“浏览”里打开那个位置。

播放列表刷新之后,我收藏的频道还在吗?

还在。新列表替换旧列表之前,刷新会先收集你标记过的那些频道的地址,然后在地址匹配的每条新条目上把标记恢复回去。只要服务商保留这个地址,频道就一直待在“收藏”里,而它的名称、分组和台标来自新文件。

服务商更新列表时,我的分组会怎么样?

变成新文件说的那样。分类在每一次刷新时都从文件里读取,所以服务商文件里改过名或合并过的分类,就以那个样子出现在菜单里。记住的选择如果不存在了,会恢复到一个有效的选择。