抓包

  1. 使用祖传的AX88179 USB转RJ-45把机顶盒和电脑用网线连起来。
  2. 控制面板,网络适配器里按住ctrl全选AX88179和你的电脑LAN口右键桥接,若一次性桥接不成功,单独右键加入桥接。
  3. 打开wireshark抓AX88179网络的包,然后再机顶盒开机,遥控板进入直播,随便按几下。保存到本地。
  4. 搜索栏输入http,右键追踪http流,搜索igmp,直至找到直播源地址,点一下,自动选中该流。
    searchhttp.png
    searchigmp.png
  5. 保存该流数据。
    saveigmp.png
  6. 使用gcc编译以下源码出来的./a.out整理数据流文件(仅供参考,可能各地区获取的格式并不一样)
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<termios.h>
    #include <ctype.h>
    #define BOOL int
    #define TRUE 1
    #define FALSE 0
    char * DASH;
    char * BUFFER;
    FILE * FP;
    FILE * FP2;
    char PATH[99999][99];
    struct termios init_setting;
    void my_exit()
    {
    tcsetattr(0,TCSANOW,&init_setting);
    printf("\033[?25h\n");
    exit(0);
    }
    int main(int argc, char *argv[]){
    if(signal(SIGINT,my_exit) == SIG_ERR){ //信号注册函数
    perror("signal");
    exit(-1);
    }
    atexit(my_exit);
    struct termios new_setting;
    struct termios new_settingback;
    tcgetattr(0,&init_setting);
    //tcgetattr(0,&new_settingback);
    new_setting=init_setting;
    new_setting.c_cflag&=~CREAD;
    new_setting.c_lflag&=~ECHO;
    new_setting.c_lflag&=~ICANON;
    tcsetattr(0,TCSANOW,&new_setting);

    DASH=(char *)malloc(8999999);
    BUFFER=(char *)malloc(1999999);
    int lines;
    char path[39999];
    lines=0;
    char Path;
    //char txt[999999]; //segment error
    char buffer[200];
    int pleng;
    printf("\r输入文件路径,按回车键结束:\033[K");
    fflush(stdout);

    while(TRUE){
    strcpy(path,"");
    strcpy(&Path,"");
    pleng=0;
    while((Path=getchar()) != '\0'){
    if(Path == '\x7f'){
    if(isascii(path[pleng-1]) && pleng > 0){
    path[pleng-1]='\0';
    pleng=pleng-1;
    printf("\b \b");
    fflush(stdout);
    continue;
    }
    else if(!isascii(path[pleng-1]) && pleng > 0){
    path[pleng-3]='\0';
    path[pleng-2]='\0';
    path[pleng-1]='\0';
    printf("\b\b \b\b");
    fflush(stdout);
    pleng=pleng-3;
    continue;
    }
    continue;
    }

    if(Path == '\r' || Path == '\n' || Path == '\0'){
    break;
    }
    pleng++;
    strncat(path,&Path,1);
    printf("%c",Path);
    fflush(stdout);

    }
    strcpy(PATH[0],path);
    fflush(stdout);
    if(strcmp(PATH[0],"")!=0){
    FP = fopen(PATH[0], "r+");
    if (FP == NULL) { // 判断文件是否打开成功tf"); 1;
    continue;
    }
    break;
    }
    }
    printf("%s",PATH[0]);
    FP2 = fopen("iptv.m3u8", "w+");
    while (fgets(BUFFER,1999999,FP)){
    strcat(DASH,BUFFER);
    }

    int si;
    char m3u8[1999999];
    char NAME[2999999];
    BOOL record=FALSE;
    BOOL recordNAME=FALSE;
    for (si=0;si<strlen(DASH);si++){
    if (recordNAME == TRUE){
    if (DASH[si]=='"'){
    recordNAME=FALSE;
    printf("%s ",NAME);
    fprintf(FP2,"%s ",NAME);
    strcpy(NAME,"");
    continue;
    //break;
    }
    strncat(NAME,&DASH[si],1);
    }
    if (record == TRUE){
    if (DASH[si]=='|'){
    record=FALSE;
    printf("%s\n",m3u8);
    fprintf(FP2,"%s\n",m3u8);
    strcpy(m3u8,"");
    continue;
    }
    if (DASH[si]=='"' ){
    continue;
    }
    strncat(m3u8,&DASH[si],1);
    }

    if (DASH[si]=='"' && DASH[si-1]=='=' && DASH[si-2]=='e' && DASH[si-3]=='m' && DASH[si-4]=='a' ){
    recordNAME=TRUE;
    }
    if (DASH[si]=='=' && DASH[si-1]=='L' && DASH[si-2]=='R' && DASH[si-3]=='U' && DASH[si-4]=='l' ){
    record=TRUE;
    }
    }
    }

    openwrt和iptv接入

  7. 借助openwrt的udpxy转发,原理不明。。将openwrt和光猫的iptv接入同一路由器配置一下就可以看了。
    openwrtudpxy.png
  8. Interface
    openwrtinterface.png
  • 这里我要提一下,因为openwrt用静态地址一直无法正常联网,多加一个DHCP什么都解决了,但是ip不固定了,所以要从你主路由上为openwrt保留一个静态地址。

xVeTe

  1. 方法1:完全自制m3u8和匹配的xml文件,能播放,但要显示节目就比较难搞了。我这里提供shell脚本帮助生成。(各地区和用以上c程序生成的内容可能不一样,仅供参考)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#m3u8
a=0 \
echo '#EXTM3U' >>./iptv1.m3u8 &&  while read line ;do  
echo "#EXTINF:-1 tvg-id=\"$a\"  tvg-name="$(printf "$line" | awk '{printf $1}')"  ,"$(printf "$line" | awk '{printf $1}')"" >> ./iptv1.m3u8
echo ""$(printf "$line" | awk '{printf $2}')"" >> ./iptv1.m3u8
a=$((a+1))
done <<EOF
$(cat /Users/cb/Downloads/new.m3u8 )
EOF

#xml 只有匹配作用,没有节目表,可通过检测
a=0 \
echo '#EXTM3U' >>./iptv1.m3u8 &&  while read line ;do  
echo "#EXTINF:-1 tvg-id=\"$a\"  tvg-name="ChannelName"  ,ChannelName" >> ./iptv1.m3u8
echo "$line" >> ./iptv1.m3u8
a=$((a+1))
done <<EOF
$(cat /Users/cb/Downloads/new.m3u8 )
EOF
  • 以下为最终整理修改出来的m3u8文件模板
    1
    2
    3
    4
    #EXTM3U
    #EXTINF:-1 tvg-id="1" tvg-name=xxxx高清 ,xxxx高清
    http://192.168.2.97:4022/udp/xxx.xx.xxx.xxx:xxxx
    ...
  1. 方法2:仅生成m3u8文件,然后在Plex使用第三方的EPG频道节目列表(xml),然后再Plex筛选(注意Plex里频道不能重复,不然一直报错进不去,所以没在这份表上的频道要被舍弃,要不然就要选错误的节目表)

    1
    2
    3
    4
    5
    6
    #节目总表:http://epg.51zmt.top:8000/e.xml
    #央视和各省卫视:http://epg.51zmt.top:8000/cc.xml
    #地方及数字付费:http://epg.51zmt.top:8000/difang.xml

    #详情参考https://github.com/supzhang/epg 项目
    #这里有进阶用法,如果你会的话,可以尝试用该项目获取节目表,然后用方法一喂给xVeTe
  2. 最优方法(使用https://github.com/fanmingming/live 该项目的m3u8模板和xml信息)

  3. 下载https://live.fanmingming.com/tv/m3u/demo.m3u ,将直播源链接替换成自己的

  4. https://live.fanmingming.com/e.xml

  5. 直接编辑xteve,将https://live.fanmingming.com/e.xml 填入xml,将自己的demo.m3u填入m3u8

    Plex

  6. 简单设置一下就可以了
    plex.png