本發(fā)明屬于嵌入式計算機領域,涉及一種地鐵列車lcd屏的視頻傳輸方法。
背景技術:
隨著城市的不斷發(fā)展和人口數量持續(xù)增多,地鐵作為緩解地面交通壓力的最佳方式,運營模式逐漸由以車輛為中心轉向以乘客為中心。pis(乘客信息系統(tǒng))的出現(xiàn)正滿足了這種新型運營模式的需求,它依靠現(xiàn)代科技成熟可靠的網絡技術、多媒體技術和顯示技術進行信息多樣化的顯示。通過在地鐵空間里建立起動態(tài)乘客信息顯示,讓乘客即便身處地下空間,仍然能夠時刻保持與外部世界的信息交流。pis為乘客提供了豐富的信息資源,已經成為地鐵列車不可分割的一部分。
lcd屏作為pis的重要組成部分,可為乘客提供列車運行狀態(tài)、站點信息以及媒體視頻信息。目前,地鐵列車lcd屏的顯示方案多基于差分vga技術,依靠vga模擬信號進行視頻傳輸,但是該方法不能滿足高清要求,并且在長距離傳輸過程中抗干擾能力差。隨著視頻技術的發(fā)展以及乘客對信息需求的提高,對車載lcd屏顯示效果的要求也越來越高,該方法已經不能滿足要求。
隨著網絡技術的發(fā)展,流媒體技術作為基于以太網數字媒體技術顯示方案的一種,在嵌入式領域逐步應用起來。地鐵列車上采用流媒體方案,一般基于udp組播方式對所有l(wèi)cd屏進行視頻傳輸。地鐵列車司機室車廂的結構如圖1所示,由一個機箱、一個媒體控制器和一個觸摸屏組成,機箱內含有視頻服務器、語音報站控制器和交換機等三個設備。媒體控制器是一個具有數字顯示輸出功能的設備,觸摸屏用于查看列車實時監(jiān)控信息。地鐵列車客室車廂結構如圖2所示,由交換機a和交換機b組成,均連接了五個lcd屏和兩個攝像頭,交換機a還連接有一個dvr(硬盤錄像機)。為提高客室車廂交換機的端口使用率,5個lcd屏通過以太網線級聯(lián)懸掛在交換機的同一個端口上,根據lcd屏上撥碼開關的數值進行區(qū)分。例如lcda1撥碼開關數值為1,lcda2撥碼開關數值為2,以此類推。各個車廂內的交換機互相連接構成一個局域環(huán)網,地鐵列車整體的網絡拓撲圖如圖3所示。
在一列地鐵中,lcd屏、攝像頭、dvr等設備數量都較多,使用時會占用一部分通信帶寬,當在司機室需要通過觸摸屏查看列車上的實時監(jiān)控時,所有客室車廂內的攝像頭都會向網絡上發(fā)送數據。同時,視頻服務器也在傳送給lcd屏1080p高清視頻數據,這些帶寬消耗都會加重列車網絡的負荷,容易造成網絡瞬時擁塞而引發(fā)數據丟失。由于lcd屏采用級聯(lián)的方式連接,當列車網絡上發(fā)生數據丟失的現(xiàn)象時,如果最靠近交換機端口的lcd屏沒有收到數據,則后面級聯(lián)的屏也不會收到該數據。而流媒體技術采用的服務模型具有盡力而為的特點,并不能保證數據的可靠傳輸,不能進行網絡擁塞控制,也不能重傳丟失的數據,這會造成lcd屏出現(xiàn)馬賽克和卡頓的問題,影響lcd屏的顯示效果,降低乘客對地鐵的乘坐體驗。針對這種現(xiàn)狀,本文提出一種新的lcd屏視頻傳輸方法。
如圖4所示,地鐵列車視頻服務器采用基于arm架構的數字媒體處理器,并且連接一個dvi-d接口、兩片ddr3緩存、一塊視頻信號采集芯片以及一個百兆網交換機。
地鐵列車內的所有交換機與各個節(jié)點設備共同構成一個環(huán)形局域網。交換機采用基于arm+fpga架構的處理器,如圖5所示,連接兩塊以太網交換機處理芯片和一個硬件看門狗。節(jié)點設備通過交換機面板和背板上的網口連接到以太網交換機處理芯片。
地鐵列車lcd屏作為視頻客戶端,通過lcd屏控制器來控制,如圖6所示。lcd屏控制器采用基于arm架構的多核處理器作為控制核心,并且連接一片norflash存儲器、一片ddr3緩存、一個視頻解碼器、一個百兆網交換機、一個撥碼開關以及一個lcd液晶屏。
視頻服務器通過dvi-d接口與列車司機室的媒體控制器連接。當地鐵列車運行時,視頻服務器通過dvi-d接口采集數字視頻信號,在內部按照h264格式編碼。視頻數據發(fā)送前,按照rtp(實時傳輸協(xié)議)格式打包,組播方式發(fā)送到以太網。車廂內的交換機對視頻數據進行分組轉發(fā),凡是加入到指定組播組里的lcd屏全都可以接收到視頻數據。lcd屏與視頻服務器建立rtsp(實時流傳輸協(xié)議)連接,創(chuàng)建緩沖區(qū),將接收到的視頻數據存放至緩沖區(qū),之后將視頻數據送入視頻管道進行解碼播放。
技術實現(xiàn)要素:
本發(fā)明要解決的技術問題是一種地鐵列車lcd屏的視頻傳輸方法,改善地鐵列車lcd屏播放媒體視頻信息時的顯示效果,提高乘客的感官質量。
本發(fā)明的技術方案:
地鐵列車lcd屏的視頻傳輸方法,包括視頻服務器模塊、交換網絡模塊和視頻客戶端模塊,如圖7所示。
視頻服務器模塊分為三個線程:網絡狀態(tài)獲取線程、原始視頻數據處理線程和錯誤恢復線程。網絡狀態(tài)獲取線程創(chuàng)建一個定時器,如果到達定時時間,則向交換網絡模塊請求獲取網絡丟包數以及端口流量,否則繼續(xù)計時。根據交換網絡模塊反饋的具體數值,分析網絡狀態(tài),動態(tài)調整視頻流發(fā)送碼率,以緩解網絡壓力,之后繼續(xù)等待定時時間的到達。原始視頻數據處理線程會創(chuàng)建一個用于發(fā)送原始視頻數據的組播組1,通過dvi-d接口實時采集視頻信號并編碼。編碼后檢測幀數據大小是否超過以太網的mtu(最大傳輸單元),如果超過,則先進行拆包操作,然后進行rtp封包,如果沒有超過,則直接進行rtp封包。封包結束后,將數據存放至本地緩存。根據幀的大小動態(tài)調整發(fā)包間隔,減緩對網絡的瞬時沖擊,按照發(fā)包間隔組播發(fā)送至以太網,然后繼續(xù)采集視頻信號。錯誤恢復線程會創(chuàng)建一個用于接收nak(沒有應答)和錯誤重傳的組播組2,nak內包含視頻客戶端請求重傳數據的序列號。如果沒有收到來自客戶端的nak,則繼續(xù)等待,如果收到,則解析出待重傳的數據包序列號,在本地緩存中查找是否存在該序列號的數據。如果存在,則將該數據組播重傳給所有視頻客戶端,之后繼續(xù)等待接收nak,如果不存在,則返回繼續(xù)等待下一個新的nak。
交換網絡模塊分為兩個線程:數據分組轉發(fā)線程、網絡狀態(tài)反饋線程。數據分組轉發(fā)線程首先打開交換機處理芯片的所有端口,初始化端口狀態(tài)、寄存器狀態(tài)和mdio(管理數據輸入輸出)總線。之后等待數據進入交換網絡模塊,如果沒有數據進入,則繼續(xù)等待,如果有,交換機處理芯片根據mac地址表進行數據的分組轉發(fā),之后繼續(xù)等待數據進入。網絡狀態(tài)反饋線程創(chuàng)建udp套接字,綁定端口號,等待來自視頻服務器模塊獲取網絡丟包數以及端口流量的請求。如果沒有收到請求信息,則繼續(xù)等待,如果收到,則讀取寄存器獲得當前的丟包數和端口流量,獲取本地時間。按照網絡狀態(tài)報文的格式封裝打包,將丟包數、端口流量、時間三個信息一起反饋給視頻服務器模塊,之后繼續(xù)等待來自視頻服務器模塊的請求。網絡狀態(tài)報文的格式定義如下:前兩個字節(jié)表示報文的包頭;從第三個字節(jié)開始的兩個字節(jié)表示報文的長度;從第五個字節(jié)開始的四個字節(jié)是時間戳,表示獲取到丟包數和端口流量的時間,以毫秒為單位;從第九個字節(jié)開始的四個字節(jié)表示丟包數,從第十三個字節(jié)開始的四個字節(jié)表示端口流量,從第十七個字節(jié)開始的兩個字節(jié)表示報文的包尾。
視頻客戶端模塊分為兩個線程:原始視頻數據接收線程、錯誤反饋和恢復線程。原始視頻數據接收線程啟動后,讀取撥碼開關的數值,構建視頻管道,開辟用于存放視頻數據的緩沖區(qū),創(chuàng)建udp套接字加入到組播組1中,與視頻服務器模塊建立rtsp連接,等待視頻數據到達。接收到數據后,判斷是否是視頻數據,如果不是則繼續(xù)等待,如果是視頻數據,將其放置到緩沖區(qū),并檢測前后兩次數據包序列號是否連續(xù),如果不連續(xù),則判定發(fā)生丟包,觸發(fā)錯誤反饋和恢復線程進行相應操作,之后繼續(xù)等待視頻數據,如果連續(xù),則直接將數據送入視頻管道進行解碼播放,之后繼續(xù)等待視頻數據。錯誤反饋和恢復線程啟動后,創(chuàng)建udp套接字加入到組播組2中,并創(chuàng)建一個丟失隊列用來記錄丟失數據包的序列號,之后一直等待丟包事件的發(fā)生,如果沒有丟包事件發(fā)生,則繼續(xù)等待,如果被丟包事件觸發(fā),將最新丟失數據包的序列號更新至丟包序列中,并根據撥碼開關的數值判斷是否需要發(fā)送nak。如果需要,則向組播組2中發(fā)送nak,數據重新到達后按照序列號插入到緩沖區(qū)中,并刪除丟失隊列里對應的序列號,之后返回繼續(xù)等待丟包事件;如果不需要,則直接等待重傳數據的到達即可。
本發(fā)明的有益效果在于交換機可以向視頻服務器反饋當前網絡狀態(tài),使得視頻服務器可及時控制視頻數據發(fā)送的大小和速率,減緩網絡壓力,降低丟包現(xiàn)象。視頻客戶端檢測到丟包發(fā)生后,每個交換機上只選取一個lcd屏進行nak反饋,減少列車主干網流量,視頻服務器收到nak反饋后對數據進行重傳恢復。交換機、視頻服務器和視頻客戶端互相配合完成列車網絡的擁塞控制和視頻數據的錯誤恢復,從而為地鐵列車lcd屏提供可靠的視頻數據傳輸,改善屏幕的播放效果,提高乘客感官體驗。
附圖說明
圖1是本發(fā)明地鐵列車司機室車廂的結構圖。
圖2是本發(fā)明地鐵列車客室車廂的結構圖。
圖3是本發(fā)明地鐵列車的網絡拓撲圖。
圖4是本發(fā)明視頻服務器控制器硬件結構圖。
圖5是本發(fā)明交換機控制器硬件結構圖。
圖6是本發(fā)明lcd屏控制器硬件結構圖。
圖7是本發(fā)明的設計方法流程圖。
圖8是本發(fā)明視頻服務器模塊流程圖。
圖9是本發(fā)明交換網絡模塊流程圖。
圖10是本發(fā)明視頻客戶端模塊流程圖。
圖11是本發(fā)明視頻客戶端模塊的視頻管道結構圖。
具體實施方式
以下結合技術方案和附圖,詳細說明本發(fā)明的具體實施方式。
本發(fā)明共包含三個模塊,視頻服務器模塊、交換網絡模塊以及視頻客戶端模塊。視頻服務器模塊負責視頻信號采集和編碼輸出,并具有錯誤恢復以及擁塞控制的功能;交換網絡模塊負責數據轉發(fā)、監(jiān)測流量和丟包信息,并向視頻服務器模塊反饋網絡狀態(tài)信息;視頻客戶端模塊負責解碼播放,當檢測到數據的丟失后,根據網絡拓撲決策是否發(fā)送nak,待重傳數據到達后重新組幀,待收到一個完整幀之后解碼播放。
(1)視頻服務器模塊
本模塊分為三個線程:網絡狀態(tài)獲取線程、原始視頻數據處理線程和錯誤恢復線程,如圖8所示。網絡狀態(tài)獲取線程首先創(chuàng)建一個定時器,如果定時時間未到,繼續(xù)計時,如果定時時間已到,向交換網絡模塊發(fā)出獲取網絡丟包數以及端口流量的請求,等待交換網絡模塊反饋網絡狀態(tài)報文。如果沒有接收到該報文,則繼續(xù)等待,如果接收到該報文,則對報文進行解析,獲取當前的丟包數量,并根據前后兩次報文中時間戳的差值和端口流量的差值,計算傳輸速率。如果檢測到網絡上存在丟包或者網絡負荷過大的情況時,降低編碼復雜度和發(fā)送碼率,以緩解網絡壓力和丟包的發(fā)生,如果沒有發(fā)生丟包或網絡負荷過大的現(xiàn)象,說明當前網絡狀態(tài)正常,則將編碼復雜度和發(fā)送碼率恢復至正常水平。調整編碼復雜度和發(fā)送碼率后重置定時器,開始新一輪的定時。
原始視頻數據處理線程會創(chuàng)建一個用于發(fā)送原始視頻數據的組播組1,通過dvi-d接口實時采集視頻信號,并按照h264格式編碼。判斷編碼后幀數據的大小,如果超過了以太網的最大傳輸單元mtu,則需要計算拆包個數,執(zhí)行拆包操作,之后進行rtp封包,如果沒有超過,則可直接進行rtp封包。按照rtp格式封包時,會將數據包序列號,時間戳等信息封裝進去,第一個數據包的序列號隨機生成,之后序列號依次累加,封包結束后將數據存放至本地緩存??紤]到待發(fā)送的幀數據過大時,拆包個數必然增加,導致以太網流量會突然增大,可能會造成網絡瞬時擁塞,所以視頻服務器模塊在將數據發(fā)送到以太網前,會根據拆包個數動態(tài)調整發(fā)包間隔,減緩對網絡的瞬時沖擊。將rtp格式的數據包按照發(fā)包間隔發(fā)送至組播組1,之后繼續(xù)采集視頻信號。
錯誤恢復線程會創(chuàng)建一個用于接收nak和錯誤重傳的組播組2,設置用于接收數據的超時時間,檢測時間是否超時。如果時間超時,則重置超時時間,繼續(xù)檢測時間是否超時,如果沒有超時,則判斷是否接收到數據;如果沒有接收到任何數據,則繼續(xù)判斷時間是否超時,如果接收到數據,則判斷數據是否是來自視頻客戶端的nak;如果不是,則重置定時器,繼續(xù)檢測時間是否超時,如果是,則解析nak數據包中包含的數據包序列號,在本地緩存中查找是否存在待重傳序列號的數據;如果存在,說明該數據可恢復,按照組播的方式重傳給所有的視頻客戶端,重置超時時間,繼續(xù)檢測時間是否超時,如果不存在,說明數據已經不能被恢復,則重置超時時間,繼續(xù)檢測時間是否超時。
(2)交換網絡模塊
如圖9所示,交換網絡模塊分為兩個線程:數據分組轉發(fā)線程、網絡狀態(tài)反饋線程。數據分組轉發(fā)線程首先打開兩塊以太網交換機處理芯片的所有端口,初始化端口狀態(tài)和寄存器狀態(tài),打開mac地址學習功能,加載驅動,初始化mdio總線。如果沒有數據進入交換網絡模塊,則繼續(xù)等待,如果有數據進入交換網絡模塊需要轉發(fā)時,交換機處理芯片解析該數據,記錄數據的源mac地址和目的mac地址。進行mac地址學習,之后根據目的mac地址查詢mac地址表。如果能在表中找到目的mac地址與出口的映射關系,則按照對應出口分組轉發(fā),之后繼續(xù)等待數據進入,如果在mac地址表中沒有找到對應出口,則通過除入口之外的所有其他端口進行轉發(fā),之后繼續(xù)等待數據進入交換網絡模塊。
網絡狀態(tài)反饋線程創(chuàng)建udp套接字,綁定端口號,等待來自視頻服務器模塊的請求。如果沒有來自視頻服務器模塊獲取網絡丟包數以及端口流量的請求,則繼續(xù)等待,如果有,則使用smi(系統(tǒng)管理中斷)接口往流量統(tǒng)計操作寄存器寫入獲取端口流量的命令,再讀取流量統(tǒng)計操作寄存器的第一個字節(jié)獲得32位數據流量的低16位,讀取流量統(tǒng)計操作寄存器的第二個字節(jié)獲得32位數據流量的高16位,通過計算獲得端口流量。再使用smi接口直接從低位丟包計數器中讀取32位丟包數的低16位,從高位丟包計數器中讀取高16位,計算獲得丟包數。獲取交換機的本地時間,以微秒為單位進行轉換,再按照網絡狀態(tài)報文的格式打包發(fā)送給視頻服務器模塊,之后繼續(xù)等待來自視頻服務器模塊獲取網絡丟包數以及端口流量的請求。
(3)視頻客戶端模塊
本模塊分為兩個線程:原始視頻數據接收線程、錯誤反饋和恢復線程,如圖10所示。原始視頻數據接收線程與視頻服務器模塊建立rtsp連接,并加入到用于發(fā)送原始視頻數據的組播組1中。讀取設備撥碼開關的數值并保存。開辟25個2m的緩沖區(qū)存放視頻數據,防止因存放空間不夠造成的數據丟失?;趃streamer框架搭建視頻管道,視頻管道結構框圖如圖11所示,由apprsrc、h264parse、imxvpudec、imxg2dvideosink四個插件通過srcpad(輸入襯墊)和sinkpad(輸出襯墊)連接組成。appsrc作為源插件,用來接收完整的幀數據,之后將數據推送到h264parse插件,按照h264格式對數據進行解析,再通過imxvpudec插件解碼,所得碼流將色彩空間轉換成rgb,以適應imxg2dvideosink播放插件的媒體能力,最終通過imxg2dvideosink插件將傳輸的視頻流顯示到lcd屏上。視頻管道搭建成功后,等待接收來自組播組1的數據,當收到數據后,判斷是否是視頻數據,如果不是則繼續(xù)等待接收數據,如果是則將其放置到緩沖區(qū),并檢測前后兩次數據包的序列號是否連續(xù)。如果連續(xù)說明沒有丟包,則繼續(xù)判斷是否已經收到了一幀完整數據,如果是則從緩沖區(qū)中取出該幀數據送入視頻管道進行解碼播放,之后繼續(xù)等待接收數據,如果沒有收到一幀完整數據,則返回繼續(xù)等待接收數據;如果數據包序列號不連續(xù),則判定發(fā)生丟包,觸發(fā)錯誤反饋和恢復線程進行相應操作,之后繼續(xù)等待接收數據。
錯誤反饋和恢復線程創(chuàng)建udp套接字,并加入用于接收nak和錯誤重傳的組播組2。創(chuàng)建一個丟失隊列,用于記錄丟失數據包的序列號,之后一直等待丟包事件的觸發(fā)。如果沒有丟包事件發(fā)生,則繼續(xù)等待,如果被丟包事件觸發(fā),則將最新丟失的數據包序列號更新至丟包序列中。根據撥碼開關的數值判斷是否是網絡拓撲中最靠近交換機端口的lcd屏。如果是則將帶有丟包序列號的nak反饋給視頻服務器模塊,然后等待重傳數據的到達,如果不是則不需要發(fā)送nak反饋,直接等待重傳數據到達即可。如果接收到重傳數據,按照數據包的序列號將其插入到緩沖區(qū)中合適的位置上,并更新丟失隊列,刪除丟失隊列中已經恢復的數據包的序列號,之后繼續(xù)等待丟包事件的發(fā)生;如果沒有接收到,則繼續(xù)等待重傳數據的到達。