bfdh 最近的时间轴更新
bfdh
ONLINE

bfdh

V2EX 第 284086 号会员,加入于 2018-01-18 16:03:05 +08:00
今日活跃度排名 923
[2024.6] 求推荐笔记本
计算机  •  bfdh  •  2024-06-20 11:06:13 AM  •  最后回复来自 bfdh
16
求个手机(限 iPhone )控制软件
iPhone  •  bfdh  •  2023-12-29 15:09:24 PM  •  最后回复来自 DogeFlyKite
12
bfdh 最近回复了
2 小时 9 分钟前
回复了 sayoll 创建的主题 宽带症候群 028 用了快一年的 NAT4 电信还是转网到了移动
同 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:8080
Connection: 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)可自动匹配台标
@TANG11 #2 如果请的是病假/事假,公司这个要求并不过分,甚至算是很宽松。如果请的是年假或者调休,那我只能骂一句公司有病。
没啥用,也慢,只是比 windows 好一点。
到明天就刚好 7 年了。不想折腾,懒得换。
9 天前
回复了 wdssmq 创建的主题 生活 跟一下「苦难教育」话题
@wdssmq #9 在正式(相对于网络对线)的论述中,我更倾向于使用相对“正统”的表达。在这样的语境中,女权不等于女拳,苦难教育也不等于没苦硬吃,我肯定的是苦难教育本身,而不是其中那些不合理的手段。

还是以消防演练举例,我认可消防演练是认可“通知:X 月 X 日 X 点,我们将进行消防演练,请各位有序撤离。”而不是“毫无征兆地谎报火情:着火啦,大家赶紧逃!”。
9 天前
回复了 wdssmq 创建的主题 生活 跟一下「苦难教育」话题
@dawn009 #5 “是认识苦难、理解苦难,等将来有一天苦难真的来临的时候能够从容应对,不至于手足无措。”
至于是叫“现实教育”还是“苦难教育”倒不用那么纠结。
9 天前
回复了 DeepSIeep 创建的主题 问与答 如果你突然得到 50w,你会买什么
存起来,毕竟这 50W 买不到我想买的东西。
11 天前
回复了 wdadad 创建的主题 问与答 你最好的幻想是什么 -我的公司提供家属院
@pkxutao #2 够狠😂
11 天前
回复了 wdssmq 创建的主题 生活 跟一下「苦难教育」话题
那我就再复制一遍

苦难教育的目的不是吃苦,是认识苦难、理解苦难,等将来有一天苦难真的来临的时候能够从容应对,不至于手足无措。这个就像消防演练一样,我认为是必要的。

苦难教育手段也不只有“没苦硬吃”一种,观看相关的记录片、教育片,了解相关历史,现场观看(或适当参与)自己父母、亲人的劳动,这些都是苦难教育,不必把苦难教育局限于“没苦硬吃”。

但教育并不总是成功,苦难教育自然也会有失败/无效,采取不合适的方法和手段甚至有可能适得其反,不必因此就把苦难教育全盘否定。九年义务教育也有不少学坏/失败的,难道要取消义务教育吗。不同的人适用不同的方法,需要施教者(尤其是父母)在教育过程中不断探索。

回到另一帖中小孩辍学送去工厂、去送外卖的例子,虽然不完全认同,但在一定程度上也能理解。在建议人(或者家长)看来,既然现状已经如此糟糕了,在没有其他更好的办法的情况下,尝试一下这种方法也未尝不可,就算死马当做活马医了。
12 天前
回复了 shoushen 创建的主题 问与答 大模型会创造吗?
会的,它们不是经常胡编乱造吗。🐶
关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5049 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 03:52 · PVG 11:52 · LAX 19:52 · JFK 22:52
♥ Do have faith in what you're doing.