羅玉萍 王振皆 王瑩
摘? 要:在物聯(lián)網(wǎng)與消費(fèi)電子急速發(fā)展的過(guò)程中,越來(lái)越多的同屏器出現(xiàn)在我們的視野中。本文研究的是基于Linux系統(tǒng)的同屏器是如何通過(guò)USB數(shù)據(jù)線獲取Android系統(tǒng)的視頻流,從而實(shí)現(xiàn)同步播放的功能,并對(duì)其中涉及到的screenrecord截屏技術(shù)、ADB技術(shù)、libusb技術(shù)、alsa聲卡技術(shù)、AOA技術(shù)進(jìn)行探究。
關(guān)鍵詞:消費(fèi)電子;同屏器;視頻流
中圖分類號(hào):TP316? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2019)15-0015-03
Research on the Implementation of Wired and Same Screen Technology in
Linux and Android Systems
LUO Yuping,WANG Zhenjie,WANG Ying
(Guangzhou Hangxin Aviation Technology Co.,Ltd.,Guangzhou? 510663,China)
Abstract:In the rapid development of IoT and consumer electronics,more and more simultaneous screen appear in our field of vision. This paper studies how the simultaneous screen based on Linux system obtains the video stream of Android system through USB data cable,so as to realize the function of synchronous playback,and explores the screenrecord screenshot technology,ADB technology,libusb technology,alsa sound card technology and AOA technology involved in it.
Keywords:consumer electronics;simultaneous screen;video stream
0? 引? 言
近年來(lái),隨著智能手機(jī)的爆炸式增長(zhǎng),無(wú)線同屏技術(shù)也緊跟其后。目前基本上所有新版的Android手機(jī)系統(tǒng)都自有DLNA、Miracast同屏協(xié)議,蘋(píng)果手機(jī)自有AirPlay協(xié)議。作為一項(xiàng)新一代的無(wú)線同屏技術(shù),無(wú)疑對(duì)Wi-Fi的帶寬和穩(wěn)定性都有極大的要求,并且其成本較高,于是在市場(chǎng)的推動(dòng)下,USB有線同屏技術(shù)應(yīng)運(yùn)而生,從而解決了無(wú)線同屏過(guò)程中存在的弊端。由于成本較低,操作簡(jiǎn)單,后續(xù)發(fā)展過(guò)程中有線同屏器也廣受消費(fèi)者的青睞。
1? 基于Linux系統(tǒng)的有線同屏器介紹
1.1? USB有線同屏器的概念
同屏器就是把手機(jī)、平板和電腦上的圖片、視頻、音樂(lè)等推送到顯示屏(電視機(jī)、投影儀等)上播放,實(shí)現(xiàn)小屏到大屏的一個(gè)過(guò)程。簡(jiǎn)單來(lái)說(shuō),同屏器就是手機(jī)、平板端投影到大屏幕的轉(zhuǎn)換設(shè)備,相當(dāng)于一塊“放大鏡”,無(wú)論在家庭、教育、會(huì)議上應(yīng)用都是非常廣泛的。在家里,只需要一根數(shù)據(jù)線,就可以將手機(jī)的內(nèi)容分享到電視上,家人一起觀看,其樂(lè)融融;在課堂上,老師可以將課件推送到大屏幕上,實(shí)現(xiàn)課件的分享,有效地提高上課效率;在會(huì)議上也一樣,甚至可以投成多分屏,實(shí)現(xiàn)多個(gè)內(nèi)容同時(shí)分享,簡(jiǎn)單方便。
1.2? USB有線同屏器的實(shí)現(xiàn)框架
USB同屏操作簡(jiǎn)單,即插即用,成本低、幾乎實(shí)現(xiàn)零延時(shí)。USB有線同屏器實(shí)現(xiàn)同屏過(guò)程需以下設(shè)備:Android設(shè)備、USB設(shè)備、Linux設(shè)備(同屏器)、顯示設(shè)備。Android設(shè)備與Linux設(shè)備通過(guò)USB數(shù)據(jù)線連接,最后輸送到顯示設(shè)備顯示,如圖1所示。其中,Android與Linux設(shè)備之間要解決視頻流問(wèn)題需要解決五大技術(shù)問(wèn)題:screenrecord技術(shù)、ADB技術(shù)、libusb技術(shù)、alsa聲卡驅(qū)動(dòng)技術(shù)、AOA技術(shù)。
對(duì)于大部分開(kāi)發(fā)者來(lái)說(shuō),之前都有屬于自己的一套比較成熟的代碼框架,然后再在其基礎(chǔ)上添加所需模塊,這樣開(kāi)發(fā)速度會(huì)極大地縮短。像這個(gè)同屏器,如果前期設(shè)備已經(jīng)帶有成熟USB開(kāi)發(fā)模塊,其他模塊的添加和測(cè)試就會(huì)相對(duì)容易。
2? USB有線同屏器核心技術(shù)
2.1? screenrecord截屏技術(shù)
screenrecord是Android系統(tǒng)的一個(gè)shell命令,如何能讓screenrecord在Linux系統(tǒng)上運(yùn)行,是首先必須要解決的問(wèn)題。這就需要在Ubuntu下對(duì)Android源碼進(jìn)行修改、編譯及運(yùn)行。這個(gè)工作量也不小,首先是要修改環(huán)境變量,編譯工具鏈,讓這個(gè)源碼能正常通過(guò)。其實(shí)說(shuō)到底,就是為了能夠在Linux環(huán)境下使用screenrecord程序,以至達(dá)到錄屏的效果。screenrecord可能會(huì)遇到有些設(shè)備可能無(wú)法直接錄制,原因是分辨率太高,如果遇到此類問(wèn)題,請(qǐng)?jiān)囍付ㄝ^低的分辨率。雖然Android是開(kāi)源的,但是對(duì)于Android系統(tǒng)不同品牌商都會(huì)對(duì)其定制一些內(nèi)容,不是所有的都通用,這個(gè)就需要開(kāi)發(fā)者去手動(dòng)修改獲取手機(jī)的分辨率。另外一個(gè)比較突出的問(wèn)題就是錄制視頻的時(shí)候聲音不會(huì)被錄下來(lái),這就是后面講到的必須要用alsa-lib庫(kù)將Android聲音做傳輸。
2.2? ADB技術(shù)
ADB的全稱是Android Debug Bridge,簡(jiǎn)單地來(lái)說(shuō),它是Android SDK中的一個(gè)工具。使用ADB可以直接操作管理Android模擬器或者真實(shí)的Andriod設(shè)備。ADB的主要功能有:(1)在Android設(shè)備上運(yùn)行Shell(命令行);(2)管理模擬器或設(shè)備的端口映射;(3)在計(jì)算機(jī)和設(shè)備之間上傳和下載文件;(4)將電腦上的本地apk軟件安裝至Android模擬器或設(shè)備上。
ADB在同屏器上的運(yùn)行原理是同屏器端的adb server與手機(jī)端的守護(hù)進(jìn)程adbd建立連接,然后同屏器端的adb client通過(guò)adb server轉(zhuǎn)發(fā)命令,ADB接收命令后解析運(yùn)行。
ADB是一個(gè)C/S架構(gòu)的應(yīng)用程序,由三部分組成:(1)運(yùn)行在同屏器端的adb client;(2)運(yùn)行在同屏器端的adb server;(3)運(yùn)行在設(shè)備端的常駐進(jìn)程adb demon。
對(duì)于開(kāi)發(fā)者來(lái)說(shuō),一旦完成ADB程序在Linux的移植,就可以用命令去和手機(jī)端建立連接,監(jiān)聽(tīng)手機(jī)端的數(shù)據(jù)。這個(gè)步驟就基本完成了。
2.3? libusb技術(shù)
libusb設(shè)計(jì)了一系列的外部API為應(yīng)用程序所調(diào)用,通過(guò)這些API應(yīng)用程序可以直接操作硬件。從libusb的源代碼可以看出,這些API調(diào)用了內(nèi)核的底層接口,和kernel driver中所用到的函數(shù)所實(shí)現(xiàn)的功能差不多,只是libusb更加接近USB規(guī)范,使得libusb的使用也比開(kāi)發(fā)內(nèi)核驅(qū)動(dòng)相對(duì)容易的多??偟膩?lái)說(shuō),使用libusb開(kāi)發(fā)庫(kù)可以很方便的與USB通信。在使用這個(gè)庫(kù)之前需要做幾件事情:(1)libusb的安裝。在ubuntu中使用sudo apt-get isntall libusb*可以快速的安裝,無(wú)論什么方法,最后能安裝成功就行;(2)確定供應(yīng)商ID和產(chǎn)品ID,通過(guò)這兩個(gè)ID可以確定我們的USB設(shè)備使用lsusb命令查看,然后使用libusb-v查看具體信息,這兩個(gè)ID經(jīng)常要用到;(3)確定傳輸方式、輸入端點(diǎn)、輸出端點(diǎn)。
2.4? alsa聲卡驅(qū)動(dòng)技術(shù)
alsa是Linux下的一個(gè)聲卡驅(qū)動(dòng),它是一個(gè)完全開(kāi)放源代碼的音頻驅(qū)動(dòng)程序集,除了像OSS那樣提供了一組內(nèi)核驅(qū)動(dòng)程序模塊之外,alsa還專門(mén)為簡(jiǎn)化應(yīng)用程序的編寫(xiě)提供了相應(yīng)的函數(shù)庫(kù),與OSS提供的基于ioctl的原始編程接口相比,alsa函數(shù)庫(kù)使用起來(lái)要更加方便一些。
alsa的主要特性包括:高效地支持從消費(fèi)類入門(mén)級(jí)聲卡到專業(yè)級(jí)音頻設(shè)備所有類型的音頻接口,完全模塊化的設(shè)計(jì),支持對(duì)稱多處理(SMP)和線程安全,對(duì)OSS的向后兼容,以及提供了用戶空間的alsa-lib庫(kù)來(lái)簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)。
對(duì)于一個(gè)應(yīng)用程序開(kāi)發(fā)者,或者嵌入式應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),接觸到主要是alsa-lib編譯出來(lái)的庫(kù)libasound。alsa在移植過(guò)程中難點(diǎn)是要結(jié)合自身設(shè)備的USB Audio Driver去修改,一旦完成,將會(huì)事半功倍。
2.5? AOA技術(shù)
在同屏器中Android與USB的通信方式是基于AOA協(xié)議實(shí)現(xiàn)的,這種方式也稱為配件模式。此模式下,與Android終端通信的另一端設(shè)備稱為Android配件。在USB通信中,Android終端充當(dāng)USB從機(jī),Android配件(即同屏器)充當(dāng)USB主機(jī)。
在同屏器中運(yùn)用到AOA協(xié)議的其一功能:音頻是否支持從配件輸出,即從Android設(shè)備輸出到同屏器。所以開(kāi)發(fā)者只需要根據(jù)協(xié)議內(nèi)容去判斷Android手機(jī)的聲音是否支持從同屏器輸出即可。
3? 解決同步技術(shù)策略
3.1? 同屏過(guò)程解決卡頓丟幀對(duì)策
當(dāng)我們按著框架流程走的時(shí)候,我們會(huì)發(fā)現(xiàn)總會(huì)存在這樣或者那樣的問(wèn)題,而這個(gè)同屏器在實(shí)現(xiàn)過(guò)程中,比較常見(jiàn)的問(wèn)題是視頻卡頓。而導(dǎo)致視頻卡頓的原因大致有以下三種:(1)軟件編碼和壓縮算法不先進(jìn);(2)硬件性能不夠,導(dǎo)致無(wú)法快速處理數(shù)據(jù)流;(3)數(shù)據(jù)傳輸環(huán)境影響。
解決方案:(1)現(xiàn)在基本上都是用H.264協(xié)議進(jìn)行編解碼,使用H.264協(xié)議對(duì)編解碼算法要求相對(duì)較高,對(duì)視頻的損傷也較大。如果要追求流暢度,則勢(shì)必要犧牲畫(huà)質(zhì)的清晰度,提高壓縮比,從而導(dǎo)致傳輸數(shù)據(jù)量增大,引起卡頓。所以開(kāi)發(fā)者必須清楚的計(jì)算,把清晰度保持在合理范圍,而且也能保證流暢度;(2)硬件性能不夠這個(gè)是硬性條件,一般在前期規(guī)劃的時(shí)候就已經(jīng)研究好了,出現(xiàn)這種情況的機(jī)會(huì)相對(duì)較小。其實(shí)硬件條件就是性能和成本之間的衡量;(3)數(shù)據(jù)傳輸環(huán)境的影響是最大的,也是比較主觀的一方面。因使用的USB 2.0傳輸協(xié)議,傳輸速率基本上已經(jīng)極高了,性能也穩(wěn)定。對(duì)不同開(kāi)發(fā)者來(lái)說(shuō),如何調(diào)整視頻流的質(zhì)量和速率,這是體現(xiàn)技術(shù)能力的關(guān)鍵一步,只有協(xié)調(diào)好才能達(dá)到最佳效果。
3.2? 同屏過(guò)程縮短latency對(duì)策
同屏最佳效果就是要達(dá)到手機(jī)屏幕和輸出的大屏幕實(shí)現(xiàn)零延時(shí),這樣消費(fèi)者無(wú)論是觀看影片或者是玩游戲,都能有最佳的體驗(yàn)。在所有硬件條件都滿足的情況下,可嘗試改善latency的方法有以下幾種:(1)在不超限的情況下,提高CPU或者DDR的頻率,即提高CPU處理能力;(2)試著降低分辨率,即減少要處理的數(shù)據(jù)量;(3)加大視頻流的傳輸速率,縮短延時(shí),比如設(shè)置的默認(rèn)是3M/s,可以提高至6M/s試試。
當(dāng)然,不是所有的方法都是一蹴而就的,而是需要開(kāi)發(fā)者不斷去嘗試,找到一個(gè)最佳值。latency為500ms,當(dāng)你在玩游戲的時(shí)候就會(huì)發(fā)現(xiàn)有些不同步了,一旦降到5ms,基本上無(wú)任何阻礙的感覺(jué),順暢無(wú)比。
4? 結(jié)? 論
本文是對(duì)基于Linux系統(tǒng)的USB有線同屏技術(shù)在Android設(shè)備運(yùn)用的講述,包括其功能展示,實(shí)現(xiàn)原理,流程框圖,模塊的組成,知識(shí)點(diǎn)的整合,重點(diǎn)難點(diǎn)及解決方法。雖然同屏器涉及到的技術(shù)點(diǎn)不是特別多,但是真正做到穩(wěn)定性好、性能強(qiáng)大很難。同屏器目前的市場(chǎng)很大,很多項(xiàng)目管理者都是急匆匆的完成其功能,并沒(méi)有對(duì)其進(jìn)行深一步的優(yōu)化,所以出現(xiàn)的問(wèn)題也很多。希望管理者在部署、規(guī)劃項(xiàng)目時(shí),能多關(guān)注細(xì)節(jié)問(wèn)題,從用戶的角度出發(fā),解決存在的問(wèn)題,使用戶的體驗(yàn)更好。
參考文獻(xiàn):
[1] 邊海龍,賈少華.USB 2.0設(shè)備的設(shè)計(jì)與開(kāi)發(fā) [M].北京:人民郵電出版社,2004.
[2] 工業(yè)和信息化部人才交流中心,恩智浦(中國(guó))管理有限公司.微控制器USB的信號(hào)和協(xié)議實(shí)現(xiàn) [M].北京:電子工業(yè)出版社,2018.
[3] 張大偉.深入理解Android 卷Ⅲ [M].北京:機(jī)械工業(yè)出版社,2015.
作者簡(jiǎn)介:羅玉萍(1988.06-),女,漢族,廣東湛江人,嵌入式軟件工程師,工學(xué)學(xué)士,研究方向:信息工程。