在OpenWrt上使用udpxy同时实现在机顶盒和Potplayer等直播流软件观看IPTV直播的方法

一、需求背景

本文需要实现以下两个目标:

  1. OpenWrt 接入光猫的 IPTV 口,电视机顶盒可通过接入路由器观看 IPTV
  2. OpenWrt 使用 udpxy 提供直播源节目列表,可以使用Potplayer等直播流软件观看 IPTV 直播

参考文献:
单线融合IPTV到家庭局域网最简单的方法:路由+桥接混合模式
udpxy 是一个 IPTV 流转发工具,作为一个 UDPHTTP 的组播流转发守护进程它将组播 UDP 流转发到 HTTP 客户端。

二、网络拓扑结构

在这里插入图片描述
如上图所示,本文采用的是双线的连接方式,即使用两条网线连接光猫和路由器,分别提供访问Internet和接入IPTV的能力。之后再通过路由器分发路由,使各类设备可以正常上网和播放IPTV直播流,和电视盒子可以正常使用IPTV。

三、环境准备

  1. 路由器的OpenWrt系统需要安装 udpxyluci-app-udpxy,前者是提供组播能力的核心,即将IPTV的直播流转发到家庭网络的能力。后者是提供GUI的配置方式。
  2. 路由器的OpenWrt系统需要支持VLAN设置能力(一般都是支持的)
  3. 确认IPTV的VLAN ID(可与宽带师傅确认或者在网上寻找)
  4. 寻找所在地区的运营商可用播放源

四、详细配置

1. OpenWrt配置IPTV

(1)配置br-lan启用vlan

在luci中选择 网络 - 接口 - 设备 的配置菜单,点击br-lan配置,修改vlan的配置
在这里插入图片描述
按以下步骤,切换到 网桥VLAN过滤,先 启用VLAN过滤,之后先添加两个VLAN
br-lan是绑定所有lan口的网桥设备,默认由编译时的DTS文件确认,可以在 常规设备选项中的 网桥端口 进行选定网络端口。
首先确认lan口的顺序,以及需要给IPTV用的两个lan口,一个用于接入光猫的IPTV端口,另一个用于给电视机顶盒接入的端口。
本文使用的 lan1lan2 口用于IPTV,IPTV的 VLAN ID48(前文提到可以找宽带师傅确认),按照如下进行配置。VLAN ID 1 是直接用于上网的配置(ID可以任意),即这里的lan3,设备接入这个网口可以直接使用。而VLAN ID 48就是IPTV的网络端口。
如果某个网络端口属于指定的VLAN,则选择 未打标签(untagged),而不属于的则选择 非成员
在这里插入图片描述

需要注意的是,此处修改了 br-lan 的配置,要同时修改lan接口的配置,设备要从br-lan修改为br-lan.1,否则可能无法正常上网。
在这里插入图片描述

(2)增加IPTV的防火墙

在luci中选择 网络 - 防火墙 - 常规设置 的配置菜单,点击 添加 按钮进行添加IPTV的防火墙区域
在这里插入图片描述

按如下方式进行配置,允许转发到目标区域 选择 lan 的防火墙区域,可以实现后面的IPTV组播到lan的网络中。(涵盖的网络可以等后面配置了接口之后进行选择)
在这里插入图片描述

(3)增加IPTV的接口

在luci中选择 网络 - 接口 - 接口 的配置菜单,点击 添加新接口... 进行新增IPTV的接口
在这里插入图片描述
在常规设置中,协议 选择 DHCP客户端设备选择刚刚建立的vlan设备,本文是 br-lan.48
在这里插入图片描述
在防火墙设置中选择 刚刚建立的 IPTV 的防火墙
在这里插入图片描述
在DHCP服务器中选择 忽略此接口在这里插入图片描述按以上步骤配置之后,建立了VLAN ID防火墙,和接口之后,此时电视盒子接入路由器指定端口,即可正常播放IPTV的内容了,同时接口也会获得一个IP地址
在这里插入图片描述

2. OpenWrt配置udpxy

在luci中选择 服务 - udpxy 的配置菜单,选择 已启用 开启 udpxy 功能,HTTP 监听接口 选择网络的lan接口(即局域网接口),多播订阅源网络组播订阅源接口 都是选择IPTV的接口,这样配置之后即可使用udpxy
在这里插入图片描述

3. 增加udpxy的防火墙规则

为了保证lan区域可以正常与iptv区域通信,并使用udpxy,需要在luci中选择 网络 - 防火墙 - 常规设置 - 通信规则 的配置菜单增加以下三个防火墙规则

(1)Allow-UDPXY

协议选择TCP源区域选择lan区域目标口选择在udpxy配置的端口操作选择接收
在这里插入图片描述

(2)Allow-IGMP

协议选择IGMP源区域选择lan区域操作选择接收
在这里插入图片描述

(3)Allow-Multicast

协议选择UDP源区域选择lan区域目标地址 需要根据IPTV的直播源的组播地址进行配置,本文使用的239.0.0.0/8操作选择接收
在这里插入图片描述

4. 验证可用性

按如上配置之后,即可正常进行udpxy组播功能了。可以按如下方式进行验证

(1)登录 OpenWrt IP地址:udpxy端口/status 查看udpxy的状态

本文的使用的链接为http://192.168.10.1:4022/status,如果可以正常访问,则可以看到udpxy正在运行的状态,即为OpenWrt已经正常运行了。
在这里插入图片描述

(2)使用直播源地址进行验证

在网上寻找适用于本地的播放源地址,按照如下方式进行组装播放地址:
http://OpenWrt IP地址:udpxy端口/udp/组播地址
比如,文章使用CCTV1的地址:239.20.0.96:3016,则播放地址为:
http://192.168.10.1:4022/udp/239.20.0.96:3016
Potplayer播放器中播放此地址,如果可以播放成功,则配置成功。
在这里插入图片描述

五、制作节目源列表

我们可以制作一个m3u格式的文件,将其放到OpenWrt提供的http服务中,里面记录了所有节目源的节目单,这样在Potplayer等播放器可以直接加载此节目单,无需记住每一个节目源,格式如下:

#EXTM3U

#EXTINF:-1,节目名1
http://OpenWrt IP地址:udpxy/udp/节目源1
#EXTINF:-1,节目名2
http://OpenWrt IP地址:udpxy/udp/节目源2
#EXTINF:-1,节目名3
http://OpenWrt IP地址:udpxy/udp/节目源3
...
#EXTINF:-1,节目名n
http://OpenWrt IP地址:udpxy/udp/节目源n

例如以CCTV1 为例,将有如下文件

#EXTM3U

#EXTINF:-1,CCTV1
http://192.168.10.1:4022/udp/239.10.0.202:1025
#EXTINF:-1,CCTV1
http://192.168.10.1:4022/udp/239.20.0.104:2006
#EXTINF:-1,CCTV1FHD
http://192.168.10.1:4022/udp/239.20.0.96:3016
#EXTINF:-1,CCTV1超清
http://192.168.10.1:4022/udp/239.10.0.48:1025
#EXTINF:-1,CCTV1高清
http://192.168.10.1:4022/udp/239.10.0.114:1025

将此文件保存为.m3u格式,并上传到OpenWrt/www/目录下,此时通过HTTP访问 http://OpenWrt IP地址/文件.m3u,可以将下载到此.m3u文件,在PotPlayer使用此链接可以加载节目列表,点击即可进行播放。
例如文件名为 iptv.m3u,则访问http://192.168.10.1/iptv.m3u,效果如下:
在这里插入图片描述

六、使用tcpdump抓包获取节目源信息

OpenWrt 中安装 tcpdump 包,可以通过抓包的方式获取正在播放的节目源的地址,这样就可以制作自己的节目单了。
命令如下:

tcpdump -i iptv的接口 -n udp -vv -s 0

IPTV的接口是在前面已经定义好了的接口信息,一般是 br-lan.vlan_id,本文使用的是 br-lan.48,在终端输入 tcpdump -i br-lan.48 -n udp -vv -s 0 命令之后,将会有大量的包信息输出,此时可以看到会有很多重复的打印,可以分析得到 239.10.0.18:1025 即是正在播放节目的直播源。
在这里插入图片描述

### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 70 面 0 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2: 使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值