ReplayKit2 有線投屏專案總結

2022-04-08 10:11:41 字數 2524 閱讀 8422

一、實現目標

ios11.0以上裝置通過usb線連線電腦,在電腦端實時看到手機螢幕內容

畫質達到超清720級別,位元速率可達到1mbps以上

二、實現技術方案設計

1、手機端採用replaykit2框架,在upload extension 程序中採集到螢幕內容yuv和系統聲音pcm+麥克風聲音pcm

- (void)processsamplebuffer:(cmsamplebufferref)samplebuffer withtype:(rpsamplebuffertype)samplebuffertype 

}

3、在pc端建立rtmp收流服務端,解碼,渲染;目前obs已經存在相關模組

三、遇到的問題以及解決方案

1、如果在區域網中,目前的基礎上,無線推流到pc和推流到遠端直播伺服器流程基本一樣

2、如何規避區域網的網路抖動環境,實現高畫質推流?區域網可能因為多人使用導致頻寬分配原因,以及通道干擾原因導致上行速率達不到標稱要求

採用有線方案可以解決這個問題,那麼手機如何利用usb線傳遞資料?

3、usb傳遞有線資料有兩種方案:

第一種是mifi認證,使用ios外設通訊的庫,externalaccessory

第二種是通過iproxy , 在pc端執行"iproxy pcport mobileport"的方式實現埠**,pc上連線pcport會連線到手機的mobileport,當一條tcp連線建立成功之後手機就可以利用usb線和pc實現雙向通訊了

這裡為什麼不能像安卓一樣,實現正向的**,將手機的埠**到pc上呢?這就是ios系統相對封閉的原因;

猜測安卓連線usb線的時候,pc端執行命令會在手機端出發操作實現埠**規則;而ios不行

那麼最終採用的是第二種方案。

四、推流sdk協議改造

對於採用的第二種方案,實施的時候遇到兩個問題?

第乙個如何實現由pc主動連線手機的過程,連線手機的哪個埠?

對於這個問題,這裡解決方案是,第乙個在socket上面設定套接字為reuse相關的屬性,保證埠能夠重複繫結成功,這裡假定這個1397埠只有這個程式使用

第二個是在有線投屏的時候,手機要先掃碼得到pc的乙個key,手機在啟動乙個tcp監聽後將埠號聯絡這個key一起發給我們的後台,後台通過push或者pc pull的方式,將這個資訊通知到pc端,也就是建立通道的方式

第二個問題,如何在乙個rtmp.c的主動發起連線中,修改原有的方式,先嘗試被動連線(先啟動乙個同步阻塞的監聽socket等待pc連線)。在這個邏輯中,因為等待過程是阻塞的,必然涉及到延時,在這裡遇到了坑

我們希望在 tcp socket bind乙個埠,然後listen,然後accept的時候,希望在accept這個方法實現超時邏輯,最開始是這樣實現的

int ret = ::setsockopt(m_nrealserversocket, sol_socket, so_rcvtimeo, (const

char*) &tv, sizeof

(tv));

logw(

"socket accept start 1, set timeout ret = %d

", ret);

ret = ::setsockopt(m_nrealserversocket, sol_socket, so_sndtimeo, (const

char*) &tv, sizeof(tv));

上述的**在安卓和pc上面生效,但是在ios平台上面無效,雖然設定了乙個超時時間,但是這個超時永遠不會觸發,accept永久阻塞

為了規避這個問題,我採用select監聽檔案描述符的方式,select跨平台相容性效果更好

採用以下**實現accept超時邏輯:

int fd = -1;

fd_set fdflag;

sockaddr_in client_addr;

memset(&client_addr, 0, sizeof(client_addr));

fd_zero(&fdflag);

fd_set(m_nrealserversocket, &fdflag);

logw("socket accept start, timeout = %d secs", tv.tv_sec);

bool hasprocessconnect = false;

if(!hasprocessconnect && select(m_nrealserversocket + 1, &fdflag, null, null, &tv) > 0)

// 一次事件觸發之後, 清理監控的描述符

fd_zero(&fdflag);

五、最終效果

PS2有線手柄的SPI協議

1.spi模式 與ps2採用的是spi mode3模式。並且使用低位在前方式收發資料。2.請求ps2按鍵資料 想要向ps2請示資料要傳送乙個請求命令。請求命令如下所示 cmd require 9 資料按先低位後高位傳送 3.接收ps按鍵資料 在傳送請求命令的同時,ps2會同步輸出按鍵資料。如下為無按...

不投簡歷 如何獲得月薪2萬的工作

先把方法說出來 創造你的產品,發布你的產品。2008年,我在高中時期出版一本安全圖書之後,一家安全公司的產品總監找到我,提供了月薪6k的工作,一段時間之後月薪提到稅後2萬。儘管我並非一開始的月薪就是2萬,但到今天為止,我從未投過簡歷。現在我在蘇州創業 最近都在面試 應聘者,希望這篇文章能幫助應聘者獲...

創業中的「投名狀」 leo看贏在中國 2

創業中的職業道德 本篇我想說說創業中的 投名狀 創業者投資自己事業的事兒。5週前節目裡的女博士 此人出現在五週前的 贏在中國 節目裡。確切地說是生化學的博士後,斯坦福的。非常聰明 優秀,不然應該也讀不到這麼高。有回國創業的熱情,這就非常不容易了,按她的學識可以永遠不回來,在某個高度發達的資本主義國家...