Python實(shí)現(xiàn)minicap協(xié)議解析并通過PyQt渲染

說起Minicap絮姆,不得不提到STF,STF (Smartphone Test Farm) 是一個(gè)開源的web架構(gòu)應(yīng)用,用戶可通過瀏覽器遠(yuǎn)程操作Android設(shè)備篙悯、調(diào)試Android應(yīng)用蚁阳、在設(shè)備上進(jìn)行測試,實(shí)現(xiàn)真正意義云端使用鸽照、調(diào)試螺捐、測試、管理真機(jī)器移宅。STF出現(xiàn)以后归粉,國內(nèi)幾個(gè)大互聯(lián)網(wǎng)公司也紛紛跟進(jìn)效仿,出現(xiàn)了類似的真機(jī)調(diào)試漏峰、管理平臺(tái)糠悼,較為知名的有騰訊Wetest官觅、阿里MQC谅畅、百度MTC熊锭、TestIn等翘地∶┙可見遠(yuǎn)程真機(jī)調(diào)試在移動(dòng)研發(fā)領(lǐng)域的作用還是受到了比較高的重視嘶朱,也能為公司以及用戶帶來比較直接的收益挑秉。下面是STF官方的介紹動(dòng)畫捶朵。

STF

minicap簡介

minicap屬于STF框架的一個(gè)工具贤壁,由STF團(tuán)隊(duì)自身開發(fā)悼枢,屬于較為核心的一部分,minicap運(yùn)行于android設(shè)備端脾拆,負(fù)責(zé)設(shè)備屏幕視頻的實(shí)時(shí)采集并通過socket接口發(fā)送馒索,github下載地址:https://github.com/openstf/minicapmicicap。minicap采集屏幕的原理很簡單:通過ndk的截屏接口不停的截屏并通過socket接口實(shí)時(shí)發(fā)送名船,這樣客戶端便可以得到一序列的圖片流绰上,圖片流合成后就成為視頻;

構(gòu)建minicap

micicap由Android ndk開發(fā)渠驼,包含一個(gè)可執(zhí)行的二進(jìn)制文件以及一個(gè)so文件蜈块,運(yùn)行minicap前,需要通過adb命令將設(shè)備對應(yīng)CPU架構(gòu)以及設(shè)備對應(yīng)SDK版本的minicap文件拷貝到設(shè)備后迷扇,再執(zhí)行百揭。由于github上并沒有上傳編譯完成后的產(chǎn)物,因此我們需要自行編譯蜓席。

編譯依賴環(huán)境:

1)信峻、NDK;

2)、make瓮床;

3)、git;

環(huán)境依賴較為簡單隘庄,如果沒有NDK以及make環(huán)境的踢步,可自行百度安裝;

構(gòu)建過程:

1)丑掺、通過git下載minicamp源碼:

git clone https://github.com/openstf/minicap.git

2)获印、micicap項(xiàng)目還依賴于libjpeg-turbo,首先我們需要在minicap引入libjpeg-turbo項(xiàng)目源碼:

git submodule init

git submodule update

3)街州、執(zhí)行ndk-build兼丰,構(gòu)建完成后,minicap編譯后的產(chǎn)物將會(huì)在libs目錄下找到唆缴;

ndk-build

運(yùn)行minicap

1)鳍征、獲取設(shè)備CPU支持的ABI,minicap針對4種不同的ABI構(gòu)建了不同的so文件和可執(zhí)行文件面徽,分別是:x86_64/x86/arm64-v8a/armeabi-v7a艳丛;

ABI=$(adb shell getprop ro.product.cpu.abi|tr -d'\r')

2)、拷貝對應(yīng)ABI版本的文件到設(shè)備趟紊,這里使用的是adb push氮双;

adb push libs/$ABI/minicap /data/local/tmp/

3)、獲取設(shè)備對應(yīng)的SDK版本霎匈;

SDK=$(adb shell getprop ro.build.version.sdk|tr -d'\r')

4)戴差、只有可執(zhí)行文件是不夠的,我們還需要拷貝對應(yīng)sdk版本的共享庫到設(shè)備铛嘱;

adb push jni/minicap-shared/aosp/libs/android-$SDK/$ABI/minicap.so /data/local/tmp/

5)暖释、每次啟動(dòng)minicap,我們都需要設(shè)置LD_LIBRARY_PATH弄痹,不然會(huì)提示找不到公共庫饭入,-P后面的參數(shù)為:{RealWidth}x{RealHeight}@{VirtualWidth}x{VirtualHeight}/{Orientation},可以指定采集的實(shí)際大小肛真、虛擬大小以及屏幕方向谐丢,實(shí)際大小一般設(shè)置成設(shè)備物理分辨率大小,虛擬大小是通過socket接口發(fā)送的大小蚓让,屏幕實(shí)際窗口大小我們可以通過adb命令獲惹馈;

adb shell dumpsys window | grep -Eo 'init=\d+x\d+' | head -1 | cut -d= -f 2

6)历极、啟動(dòng)minicap窄瘟,下面我們假設(shè)獲取到的實(shí)際屏幕大小是1080x1920,需要發(fā)送的虛擬窗口大小是540x960趟卸,采集的屏幕方向是縱向蹄葱;

adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0

7)氏义、端口轉(zhuǎn)發(fā),通過adb forward命令图云,可以把minicap端口映射到我們PC指定的端口惯悠,localabstract:minicap是UNIX域名的SOCKET名稱,把minicap的socket端口映射到PC的1313端口竣况,這樣我們就可以在PC通過連接1313端口獲取到設(shè)備的實(shí)時(shí)視頻流克婶;

adb forward tcp:1313 localabstract:minicap

minicap協(xié)議解析

minicap啟動(dòng)并用adb forward命令映射端口后,我們就可以通過socket與minicap建立連接丹泉。

1)情萤、Global header

minicap協(xié)議是一種簡單的二進(jìn)制流推送流協(xié)議,一旦與minicap建立連接摹恨,minicap首先會(huì)推送長度為24字節(jié)的global header筋岛,global header只會(huì)推送一次,后續(xù)推送的數(shù)據(jù)不會(huì)再包括global header睬塌,而是不斷的推送實(shí)時(shí)圖片流數(shù)據(jù)泉蝌,直到客戶端關(guān)閉socket連接。

Global header binary format

Global header說包含了基本的一些信息揩晴,如minicap的版本信息勋陪、頭長度、實(shí)際大小以及虛擬大小硫兰、設(shè)備方向等诅愚,這些信息我們可以保存起來,方便后面使用劫映,這里我使用python解析了Global header违孝,代碼參考如下:

2)、Frame binary format

接下來泳赋,minicap會(huì)不斷的推送一幀一幀的圖片流雌桑,每一幀都包含兩部分信息:0-3字節(jié),表示這一幀圖片的長度n祖今,由4個(gè)字節(jié)的32位整型小端格式存儲(chǔ)校坑;4-(n+4)字節(jié),是具體的圖片數(shù)據(jù)千诬,由JPG格式存儲(chǔ)耍目,這部分才是我們想要的最關(guān)鍵數(shù)據(jù);

Frame binary format

至此徐绑,我們完成了minicap協(xié)議的解析邪驮,并獲取到了minicap推送過來的每一幀圖片。需要注意的是傲茄,由于minicap是實(shí)時(shí)推送流毅访,因此流的數(shù)據(jù)可能會(huì)比較大沮榜,客戶端獲取的buffer需要盡可能的大,不然我們在渲染每一幀的時(shí)候喻粹,可能會(huì)出現(xiàn)卡頓的現(xiàn)象敞映,具體多大合適,我們可以稍微推算一下磷斧,一張由minicap推送過來的1080x1920大小的png圖片,大概是100-200KB捷犹,minicap宣稱幀率可以達(dá)到20 FPS左右弛饭,因此我們的buffer可以設(shè)置為:200KB * 20 = 4096000字節(jié),每隔一秒recv()一次萍歉;

PyQt實(shí)時(shí)渲染

獲取到圖片流數(shù)據(jù)后侣颂,我們可以使用PyQt中的paintEvent進(jìn)行渲染,下面的refreshFrame()方法枪孩,關(guān)聯(lián)了獲取圖片線程中的一個(gè)信號槽憔晒,一旦獲取圖片線程從minicap解析到一幀的圖片,便會(huì)通知refreshFrame()中的self.update()方法蔑舞,self.update()方法則會(huì)調(diào)用paintEvent進(jìn)行界面的刷新:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒担,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子攻询,更是在濱河造成了極大的恐慌从撼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧栖,死亡現(xiàn)場離奇詭異低零,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拯杠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門掏婶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潭陪,你說我怎么就攤上這事雄妥。” “怎么了畔咧?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵茎芭,是天一觀的道長。 經(jīng)常有香客問我誓沸,道長梅桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任拜隧,我火速辦了婚禮宿百,結(jié)果婚禮上趁仙,老公的妹妹穿的比我還像新娘。我一直安慰自己垦页,他們只是感情好雀费,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痊焊,像睡著了一般盏袄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薄啥,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天辕羽,我揣著相機(jī)與錄音,去河邊找鬼垄惧。 笑死刁愿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的到逊。 我是一名探鬼主播铣口,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼觉壶!你這毒婦竟也來了脑题?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤掰曾,失蹤者是張志新(化名)和其女友劉穎旭蠕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旷坦,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掏熬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秒梅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旗芬。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捆蜀,靈堂內(nèi)的尸體忽然破棺而出疮丛,到底是詐尸還是另有隱情,我是刑警寧澤辆它,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布誊薄,位于F島的核電站,受9級特大地震影響锰茉,放射性物質(zhì)發(fā)生泄漏呢蔫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一飒筑、第九天 我趴在偏房一處隱蔽的房頂上張望片吊。 院中可真熱鬧绽昏,春花似錦、人聲如沸俏脊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爷贫。三九已至认然,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漫萄,已是汗流浹背季眷。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卷胯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓威酒,卻偏偏與公主長得像窑睁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子葵孤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評論 25 707
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,821評論 24 176
  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,916評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理担钮,服務(wù)發(fā)現(xiàn),斷路器尤仍,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 北風(fēng)在放縱箫津,天空在化藍(lán),音樂在撫平宰啦,走過幾十街苏遥,繞過幾十路,一直不停地行走赡模,時(shí)而如浮如萍田炭,漠然來到萱陽橋邊,遠(yuǎn)處的...
    芳華拾柒閱讀 333評論 0 1