一、實現目標
ios11.0以上裝置通過usb線連線電腦,在電腦端實時看到手機螢幕內容
畫質達到超清720級別,位元速率可達到1mbps以上
二、實現技術方案設計
1、手機端採用replaykit2框架,在upload extension 程序中採集到螢幕內容yuv和系統聲音pcm+麥克風聲音pcm
- (void)processsamplebuffer:(cmsamplebufferref)samplebuffer withtype:(rpsamplebuffertype)samplebuffertype3、在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上述的**在安卓和pc上面生效,但是在ios平台上面無效,雖然設定了乙個超時時間,但是這個超時永遠不會觸發,accept永久阻塞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));
為了規避這個問題,我採用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週前節目裡的女博士 此人出現在五週前的 贏在中國 節目裡。確切地說是生化學的博士後,斯坦福的。非常聰明 優秀,不然應該也讀不到這麼高。有回國創業的熱情,這就非常不容易了,按她的學識可以永遠不回來,在某個高度發達的資本主義國家...