以组播流方式替换运营商IPTV直播频道
前言
研究這個初衷是因為家里沒辦法收到自己想要的地波,后來入某群后發現有設備可以直接把地波串流到IP網絡,自己是網絡技術愛好者,純粹的網絡底層技術愛好,基本上研究的范疇不涉及到軟件系統,所以從一開始就沒想過要root電視root機頂盒安裝第三方之類的想法,也沒有這個能力。
但想必弄過串流的網友都想把串流融入到自家機頂盒(當然是走IP的機頂盒,廣電的無能為力),不需要看自己串流的時候頻繁切換軟件或者機頂盒,奈何運營商的IPTV又不支持自定義頻道。偶爾在網絡網上發現有文章提及到運營商的IPTV直播頻道大多使用組播技術,通過抓包取得組播地址后可以繞開機頂盒直接用電腦的VLC播放軟件可以直接播放直播節目,而我自家同時安裝了中國移動和中國電信的寬帶和IPTV,根據網上的文章我在中國移動線路上(完全不需要認證)通過VLC打開相應的RTP地址可以直接播放到直播頻道,在確認這個基礎上開始了如何替換特定頻道的研究。而我通過替換的方法已經穩定在中國移動的機頂盒上觀看了超過半年的時間。
而中國電信的機頂盒我一直認為廣東地區的直播頻道用的不是組播協議,所以也沒想過在中國電信的機頂盒上實現類似移動的替換方法,原因是教科書的誤導,認為PPPoE認證的其中一個缺點是不支持組播。而在最近的研究發現其實電信的直播頻道也有使用組播技術,只不過電信比移動更加智能能自動適應不同網絡環境,簡單的來說就是能取到組播流的網絡環境就取組播流,不能取組播流就會自動取單播流。而最最最重點的是,電信的組播流是封裝在PPPoE數據里面的,也就是在不通過PPPoE認證的情況下是沒有辦法像移動那樣直接取得組播流的,有網友反映某些地方的電信可以不認證直接取到,這個就不好評論了,但起碼實測廣東珠海地區是必須通過PPPoE認證后才能取到(光貓里的組播vlan設置可有可無)。
言歸正傳,應網友要求,寫出中國電信版IPTV盒子的替換流方法,關于中國移動版的待日后有時間再寫。在操作之前請先注意一些問題,替換的頻道沒辦法調整字幕和音軌;中國電信的盒子有些版本會先取單播流(已知華為EC6108V9C),再取組播流,導致轉臺的時候先顯示原來的頻道,要隔10多秒才會切換到替換后的頻道,這個比較煩人;最好有一定網絡基礎,對RouterOS有一定接觸和理解。
基本思路就是尋找替換目標頻道,生成一個一樣的組播源發送到機頂盒,同時控制原生組播數據發送到機頂盒避免沖突。
組播源:
本人的串流是從TVH出來,再通過VLC轉成組播串流發送到局域網內,當然有網友說可以不用TVH直接出組播串流,奈何本人TVH也同時在用。且我的應用場景組播源和機頂盒不在同一個地方,跨互聯網傳輸,一個組播源供多個不同地方的機頂盒同時使用,本人實際在用的方案比本文的解說更為復雜,還會涉及VPN和組播路由。
路由器需求:
1、支持組播代理
2、支持IGMP Snooping
本人是Routeros的粉絲,以下方案均使用ROS完成,當然理論上支持以上功能的路由器也可以,但路由器本人只用ROS,手上也沒有其他路由器。
設定場景如下:TVH、組播源、機頂盒均在同一局域網下,TVH、IPTV機頂盒、VLC組播源三者均在RouterOS同一網橋Bridge下的成員端口,即三者連接在同一個交換機。
1、 取得機頂盒網絡賬號
取得機頂盒的網絡賬號,注意是網絡賬號,在機頂盒的網絡設置菜單里面可以查詢到賬號一般是一個帶“@iptv.gd”域名的賬號,而密碼請自行查詢裝機單或者嘗試簡單密碼如“12345678”、“12341234”,不行找電信要,再高級點可以在ROS上搭個PPPoE服務器選PAP認證打開調試模式可以直接看到機頂盒發送過來的用戶名和密碼。
2、 連接網線并設置撥號連接
ROS通過網線連接到光貓的itv口,在ROS上設置撥號信息,如下圖紅色部分,interface選擇你的ROS實際連接到光貓的端口,我這個選用VRRP口的原因是我網絡和電視都是同一根線撥號,也就是網絡和電視都是同一個路由器多撥處理的,還會涉及策略路由,請大家忽略。比方說ROS接的1端口,那么interface選擇“ether1”,name暫定為“tv”
確保PPPoE連接正常連接上,“R”標記未已連接。使用Winbox的朋友請按命令行的目錄(包括后續涉及的命令)找到相應的設置項。
3、 升級ROS并安裝組播組件
原生ROS默認是沒有安裝組播代理組件的,需要手工安裝,建議在安裝前先按下圖升級ROS到最新版本
完成下載后請重啟升級,升級完成后請到https://mikrotik.com/download下載相應硬件對應的“Extra packages”軟件包,這個是一個壓縮文檔,解壓后找到“multicast-6*****.npk”,把文件通過winbox或者ftp拖到ROS根目錄后重啟ROS完成安裝。
完成組播組件安裝后你應該可以在命令行或者Winbox下進入如下目錄:
4、 設置組播代理
組播代理設置菜單主要需要確定兩個參數,組播上行和下行端口
“tv”作為上行口(upstream=yes),負責轉發來自下行口“bridge”所連接用戶發送的組播請求數據到電信側網絡。
5、 修改機頂盒接入網絡方式
把機頂盒的網絡接入方式修改為DHCP,接入到ROS“bridge”網橋所屬端口,如果ROS相關參數設置正常,機頂盒應該能順利登錄到IPTV系統。
6、 驗證組播代理工作狀態并獲取替換頻道組播地址
機頂盒轉到任意頻道,此時觀察ROS組播代理狀態目錄
如果能看到類似項目upstream-interface=tv active-downstream-interfce=bridge 那證明組播代理正在工作,而souce大概是125.x.x.x開始的組播源是電信的直播頻道源地址,所以對應239.x.x.x這個地址就是正在觀看頻道的組播地址,當然這里沒有顯示端口,端口實際上據我抓包觀察得出的結果都是udp5146,所以當前頻道完整的組播地址是rtp://239.x.x.x:5146,此時如果把電腦接到ROS bridge所屬任意成員端口應該可以打開組播地址觀看直播頻道。
到這一步你可以開始選擇替換頻道,轉到一些你認為沒有價值的頻道,記下該頻道的組播地址以作后面替換使用。(如果你發現你轉臺的時候,代理狀態能迅速刷新出新的組播源地址,那么恭喜你,如果要等10多秒才能看到組播源地址,那后面完成替換后轉臺的時候仍需要等10秒以上才能切換)
比方我選擇了原生頻道的90、91、93分別對應組播地址239.77.0.180、239.77.0.22、239.77.0.16
選好替換目標頻道后建議在沒完成后面步驟前關掉機頂盒或者轉到其他頻道,(別問我為什么,為了避免后續出現問題)
7、 搭建組播源
在產生組播流的PC上新建一個bat文件并輸入以下內容:
第一行是切換到VLC安裝目錄,目錄位置根據實際修改
第二行開始實際上一行內容,記事本自動換行了,其中http這串是TVH出來的串流地址,“kkk:kkk”是TVH的用戶名密碼,這樣的HTTP地址可以每次使用一樣的串流地址,“rtp”后面的dst=X.X.X.X 這個是輸出的組播地址,填寫第六步記下來的沒價值頻道的組播地址。根據需要替換的頻道數量編寫多個bat文件并運行。至于VLC的命令含義請自行百度,我這個命令參數是不對原來串流作任何編碼壓縮,所以出來都是原版編碼,簡單說就是無損。
運行BAT后可以通過VLC播放器打開rtp://239.x.x.x:5146測試
8、 控制bridge內組播流轉發
如果你不考慮效率和合理性可以跳過此步驟;
此時第七步負責發送組播流的PC會不斷向內網發送組播數據,因為默認情況下ROS的bridge沒有啟用IGMP Snooping,所以會把組播數據當廣播處理,也就是發送到bridge其他的所有活動端口,包括機頂盒所連接的端口,但這不是我們想要的結果,我們要的結果是在機頂盒需要的時候才發送到機頂盒,所以我們需要打開Bridge的IGMP Snooping功能設置Bridge成員端口不轉發未知組播數據。
我這個Bridge里面只有兩個端口,如果按一般的ROS默認設置,Bridge默認包含ehter2/3/4/5 多個端口,也就是需要把所有成員端口均設置為“unknown-multicast-flood=no”,以此控制機頂盒有請求時才把VLC發送的組播數據轉發到機頂盒。
9、 避免組播流沖突
設置過濾器禁止原生頻道組播流通過“tv”口代理轉發到bridge的成員端口,在ROS防火強中添加如下規則:
10、測試
此時打開機頂盒轉到用作替換用戶的頻道,機頂盒請求組播數據,即可獲取到由VLC產生的組播流,同時組播請求也會被ROS代理轉發到tv口,tv口會返回原生組播流,但立刻會被第九步的防火墻攔截,防止機頂盒收到原生組播流。
已知問題:
1、 華為EC6108V9C盒子會先使用單播源,再檢測組播,導致換臺的時候先顯示原生頻道,至少10秒以后才會切換到替換頻道。
2、 如果在觀看替換頻道時替換組播源數據中斷或者卡頓超過數秒會導致盒子以單播方式跳回原生頻道,且一旦盒子切換到單播方式后則不會切換回組播,導致替換頻道失效,必須重啟機頂盒,有些型號如EC6108V9C需要斷電重啟。
3、 機頂盒沒辦法設置音軌和字幕,希望有網友能解決這個問題。雖然可以在VLC進行轉碼并把字幕壓進視頻,但有損畫質且資源耗費巨大。
4、 ROS的組播代理即使在Bridge開啟了IGMP Snooping 后仍會把電信上游的組播數據泛洪到bridge內所有成員端口,這個問題有空的時候我打算反應給官方,希望能修復問題。
總結
以上是生活随笔為你收集整理的以组播流方式替换运营商IPTV直播频道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【软件开发底层知识修炼】十九 GDB调试
- 下一篇: java 图表 word_java Fr