同 028 移动。
1 、你前面链接中给出的地址已经转成 http 了,如果你直接用的话,肯定是播不了的。
2 、如果你使用了正确的组播地址仍不能播放,有可能是组播代理的问题,可以尝试不经过路由器直接有线接 PC ,用 VLC 播放试试。
3 、以下是我之前自己折腾的记录,你可以参考下。
# 基本背景
- 成都移动 IPTV 使用组播进行播放,使用 IPoE 认证( dhcp option 60 )。
- 抓取直播源的目的是希望可以抛弃机顶盒,直接使用电视、手机、电脑等设备直接观看电视节目。
- 抓取直播源之后可以多台设备同时观看 IPTV (设备间互不干扰),且无需向运营商申请额外的机顶盒。
- 可以使得网络部署更加灵活,不必专门为所有的设备准备单独的 IPTV 网线。
# 抓包
抓取机顶盒正常连接 IPTV 时的所有报文,从机顶盒开机到播放任意频道时止。抓到的报文将用于后续分析。具体抓包过程此处不做赘述。
# 解决 IPoE 认证问题
## 提取认证信息(不确定是否一定需要,后来好像没有这些也能用)
认证信息包含以下三项内容,均可从 dhcp discover 报文中提取
> Vendor class identifier 每次 dhcp 请求都会变,但通过测试发现提取任意一次的数据进行重放也可以通过认证。
- mac
- Host Name: android-xxxxxxxxxxxxxxxx
- Vendor class identifier:(长度为 61 字节,转化为 16 进制文本则长度为 122 ) 00001545acd5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8a9342eac
## 路由器配置
在 openwrt 路由器( MT7621+7530 方案)`/etc/config/network`中添加如下配置
> port 3 原本是在其他 switch_vlan 的配置中,需要将其从中删除。
>
> 在配置之前,需要修改`/lib/netifd/proto/
dhcp.sh`, 找到`${vendorid:+-V "$vendorid"} \`,修改为`${vendorid:+-V '' "-x 0x3c:$vendorid"} \`使得 dhcp vendorid 可以支持 16 进制数据.
```
config switch_vlan
option device 'switch0'
option vlan '3'
option vid '102'
option ports '3 5t'
config interface 'iptv'
option proto 'dhcp'
option hostname 'android-xxxxxxxxxxxxxxxx'
option vendorid '00001545acd5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx8a9342eac'
option macaddr 'xx:xx:xx:xx:xx:xx'
option ifname 'eth1.102'
option delegate '0'
option defaultroute '0'
option peerdns '0'
```
完成以上配置之后,执行`/etc/init.d/network reload`,然后将光猫 iptv 口用网线连接到路由器 port 3 ,此时路由器的 iptv interface 已经可以获取到 IP 。
# 提取直播源
继续分析抓包数据不难发现直播源是通过如下 http 请求明文传输的
```
GET /taipan-search/getChannelIndexs.json?channelIndexUrl=............ HTTP/1.1
Host:
vipersearch.t.taipan.sca.bcs.ottcn.com:8080Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.0
```
提取该 http 请求的响应报文,得到如下 json ,livePlayUrl 即为每个频道的直播地址。
```json
[{
"index": "1",
"uuid": "ysten-cctv-1",
"channelName": "CCTV-1",
"channelIcon": "
http://zbtvlookbackepg.sc.ysten.com:8080/logo/CCTV1.png",
"livePlayUrl": "rtp://239.11.0.65:5140?channelFECPort=5142&ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65",
"isShowBack": 1,
"channel_code_bd": null,
"channelType": "OpenChannel",
"aiChannelUuid": null
}, {
"index": "2",
"uuid": "cctv-2",
"channelName": "CCTV-2",
"channelIcon": "
http://zbtvlookbackepg.sc.ysten.com:8080/logo/CCTV2.png",
"livePlayUrl": "rtp://239.11.0.108:5140?channelFECPort=5142&ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65",
"isShowBack": 1,
"channel_code_bd": "cctv2&CCTV2&cctv-2&CCTV-2",
"channelType": "OpenChannel",
"aiChannelUuid": null
}, {
"index": "3",
"uuid": "cctv-3",
"channelName": "CCTV-3",
"channelIcon": "
http://zbtvlookbackepg.sc.ysten.com:8080/logo/CCTV3.png",
"livePlayUrl": "rtp://239.11.0.101:5140?channelFECPort=5142&ChannelFCCPort=8027&ChannelFCCIP=183.223.164.65",
"isShowBack": 1,
"channel_code_bd": "cctv3",
"channelType": "OpenChannel",
"aiChannelUuid": null
},
......
]
```
> 如果将前面提取到的 mac 地址以及通过 dhcp 获取的 IP/mask 均设置在一台 PC 上,并将 IPTV 网线也接入 PC ,此时 PC 可以通过 VLC 播放器直接播放每个 livePlayUrl 。
# 配置 udpxy
> 使用 udprxy 的目的是将组播流转换为 http 流,使得局域网内的设备可以更方便地播放直播源。理论上,配置好组播代理、igmpsnooping 局域网中的设备也可以直接播放组播源。不过 wifi 对组播支持不好,某些路由器可能无法通过 wifi 播放。
在路由器安装好 udprxy ,并配置如下,然后执行`/etc/init.d/udpxy reload`
```sh
root@Openwrt:~# cat /etc/config/udpxy
config udpxy
option respawn '1'
option verbose '0'
option status '1'
option port '4022'
option disabled '0'
option bind 'br-lan'
option source 'eth1.102'
```
至此,局域网的设备便可以通过`http://<router-ip>:4022/<proto>/<multicast-addr>`播放每个直播源。比如 CCTV1 的播放地址为:`http://192.168.0.1:4022/rtp/239.11.0.65:5140`。
# 生成 m3u8
将前面提取到的 json 保存为文件,通过下面这个脚本(`
gen_m3u8.sh`)可生成 m3u8 文件。
命令格式为:`./
gen_m3u8.sh <json file> <target file>`
```sh
#!/bin/bash
set -e
function clean(){
[ -n "$msg" ] && rm -f $TMPF
[ -n "$msg" ] && {
echo $msg
return
}
echo "Failed"
}
JSON=$1
TARGET=$2
[ -z "$JSON" -o -z "$TARGET" ] && {
echo "$0 <json file> <target file>"
exit
}
[ -r "$JSON" ] || {
echo "Can't open $JSON"
exit
}
trap clean EXIT
TMPF=$(mktemp)
cat $1 | jq . | grep -E "channelName|livePlayUrl" > $TMPF
echo "#EXTM3U" > "$TARGET"
cat $TMPF | while true; do
read name || break
read url
name=$(echo $name | cut -d'"' -f4)
proto=$(echo $url | cut -d'"' -f4 | cut -d':' -f1)
url=$(echo $url | cut -d'"' -f4 | cut -d'/' -f3)
echo "#EXTINF:-1,$name" >> "$TARGET"
echo "http://192.168.0.1:4022/$proto/$url" >> "$TARGET"
done
msg=Success
```
> 将生成的 m3u8 文件上传至[
http://epg.51zmt.top:8000/](
http://epg.51zmt.top:8000/%E5%8F%AF%E8%87%AA%E5%8A%A8%E5%8C%B9%E9%85%8D%E5%8F%B0%E6%A0%87)可自动匹配台标