您现在的位置是:Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款 >
tiktok怎么用obs直播(抖音修改內容暫時不可用是怎么回事詳情) 02
Instagram刷粉絲, Ins買粉絲自助下單平台, Ins買贊網站可微信支付寶付款2024-06-27 13:45:03【】1人已围观
简介聲音因為版權等原因不能使用。怎樣在切入切出虛擬攝像頭時營造卡頓效果背景介紹:本人原先是android逆向工程師,后來因為工作變動,離開了協議分析這類的崗位,目前在做直播機與第三方應用兼容性分析相關分析
怎樣在切入切出虛擬攝像頭時營造卡頓效果
背景介紹:本人原先是android逆向工程師,后來因為工作變動,離開了協議分析這類的崗位,目前在做直播機與第三方應用兼容性分析相關分析,所以就有了這篇兼容性分析文章。
問題:tiktok在我們推流設備直播時,經過幾個特定步驟后切換前后置攝像頭會出現卡住的問題。
現象:直播畫面卡住不動了。
解決思路:找到點擊切換按鈕后的點擊事件回調,找到切換攝像頭的核心邏輯,來找到卡住原因。
1、如果了解ART虛擬機的同學會知道,jni函數和java函數都會調用到art虛擬機ArtMethod的Invoke函數。

輸出日志:
find target method: android.view.View.performClick
ArtMethod Invoke【22955】: ; lr:0x4af78c; libart.so: android.view.View.performClick
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: java.lang.Enum.toString
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: X.Ggh.LIZ
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: java.util.LinkedHashMap.<init>
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: java.util.HashMap.putAll
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: java.util.HashMap.put
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: X.DED.LIZ
ArtMethod Invoke【22955】: ; lr:0x2e2800; libart.so: X.D5k.onClick
通過frida hook libart.so的ArtMethod的Invoke函數,我們找到了點擊事件的回調類X.D5k.

找到這個類對應的onClick函數后,我對整個流程做個簡單的研讀,感覺發現了核心代碼在注釋直播流處理。

跟著核心代碼一路往下找到LiveCore這應該就是直播的核心代碼,其實現類為LiveCoreImpl,ILiveStream的實現類為LiveStream。


發現此處只是做了日志信息的合成和應用鏡像之類的代碼,但是又找到一個核心的類LiveStreamVideoCapture。

追蹤到這里發現鏈路斷了,又湊巧通過frida打開tiktok卡死在啟動頁上,那么接下來使用Xposed繼續理流程。
上面的代碼雖然沒有追中到切換攝像頭的核心邏輯,但是我們找到了兩個核心邏輯的類LiveStreamVideoCapture和LiveCoreImpl,分別和直播視頻流控制直播核心流程控制相關,所以Xposed繼續走的時候以這兩個類為重點,那么此處就開始放大招了,hook這兩個類的所有函數,貼上代碼。注意這里使用的classloader是application的classloader。


日志太多了,這里通過shell命令setprop做了個日志控制。



然后找到CameraVideoCapturer類的tryDeliverFrame,這里是處理相機的視頻幀,感覺越來越接近真相了,繼續hook這個方法,然后發現相機切換卡住以后,這個方法也停止調用了,那么沒辦法,繼續往上找堆棧中run方法的調用調用處。

繼續hook。


找到這個類。

至此,熟悉相機開發的同學應該知道,這就是SurfaceTexture.setOnFrameAvailableListener后,相機的可用幀會回調到這個函數,切換相機后卡頓,可用幀也同時不回調。
接下來hook原生相機。



調用的是android.hardware.Camera,也就是camera1相關的api,切換卡頓的時候并沒有調用Camera.open函數。


首次開直播的時候調用了這兩個函數,點擊切換相機的時候并沒有調用,在X.HCF這個類里找到switchCamera函數,那么猜測首次開相機,和切換前后相機走的并不是同一個流程,因為這個bug只有在切換相機時才會出現,所以我們就不關注首次開相機的流程。


果然,切換相機的時候走了這個流程,這是又發現了LiveStreamVideoCapture這個核心類,那么簡單進去看看SwitchCaptureRunnable這個有沒有被創建。


經過測試,發現這個類只會被創建一次,而run方法每次切換都會被調用,而且卡住的情況下也會被調用,那么結合上面Camera.open卡住時沒有調用,可以大膽的猜測中間過程某個條件不滿足被return了。根據堆棧信息繼續往下找幾個關鍵點。


發現CameraVideoCapture里也有切換相機的流程,切一步步往下走,能調用到上面我們hook過的X.HCF的switchCamera,那么我們就看看這里的switchCamera有沒有調用吧。
•情況一:先滑動直播界面,再按home鍵,然后回到tiktok,再切換相機,此時status()函數返回1,走了后續Camera.open流程。


•情況二:先滑動界面,再切換相機,然后按home鍵,接著回到tiktok,最后切換相機,此時status()函數返回2,沒走后續Camera.open流程。

從日志看switchCamera兩種情況都走了,再結合switchCamera的源碼看,源碼里的status()函數的返回值決定了是否繼續往下調用切換相機的流程,很遺憾的是,兩種情況都出現了,而且都會卡住(為什么兩個status值會不一樣呢,這里先留個坑,最后來填)。這可把我難住了!
就在這時腦子突然開竅,既然畫面卡住,那么必然有錯誤信息回調,果然一搜索CameraVideoCapture這個核心類有onError函數,毫不猶豫hook它,發現每次出錯時,這個函數的錯誤碼都會報-421錯誤(截圖省略-421錯誤碼的測試過程)。


錯誤信息非常明確的告訴我們是因為相機不支持縮放,導致的打開相機失敗,那么至此相機卡住的直接原因找到了,但是還沒找到為什么特殊的操作流程后會卡住,而正常的操作不會。于是乎繼續跟著堆棧信息往上找。

發現走進了這里的流程,導致的相機進縮放流程,為了驗證猜想,我決定在這個函數調用前,把message里的what字段改成2,讓它不走這個流程,來看看是不是就不會導致界面卡住,于是就有了下面這段代碼。

經過這一番篡改,果真隨便怎么折騰,直播界面都不會卡住了。那么我只要找到那里給handler發送的這個message就應該離真想很近了。


然后找這個handler的sendMessage相關切message的what字段賦值為1的函數。

然后我找到了它,這個函數還和縮放相關,那就八九不離十了。


按之前的堆棧繼續hook,發現卡住的時候這些方法確實都走了,而正常的時候是不走的,那么在X.Dvc的LIZ繼續用拋堆棧大法。
得到如下兩種堆棧:
•X.DCM接收到了touch事件,然后交由X.DCc這個類進行手勢判斷,發現是需要執行縮放的手勢,于是執行了相機的縮放功能(由于我們業務原因需要隱藏底部NavigationBar,在Window底部上劃會顯示NavigationBar,上劃的手勢同時觸發了控件的以為需要執行相機縮放),但是我們的虛擬攝像頭又不支持縮放,導致打開相機失敗,畫面就卡在了之前相機拿到的最后一幀。

X.DCc類

X.DCO的invoke方法

•點擊tiktok的切換相機Button,觸發進入相機的縮放,這里就和我們之前的點擊事件聯系上了,紅框部分就是補上了之前沒關注但是最重要的相機縮放功能判斷部分。


至此,我們已經把相機卡住的直接原因和根本原因都找到了,先手勢再點擊切換相機觸發了進入相機縮放功能判斷流程,由于我們的虛擬相機不支持縮放,導致打開相機失敗,卡在相機的最后一幀(也可能是黑屏)。所以只要交付給framework組開發人員,讓他們支持相機縮放相關功能就可以了。
接下來來填前面留下的坑,為什么退到后臺會導致status函數的返回值不一樣?
我們回到CameraVideoCapturer類,看看這個status()函數到底是個什么鬼!

發現他是父類ExternalVideoCapturer的函數,而且就是返回個字段,那再看看他那里進行了賦值。

通過AndroidStudio自帶的字段讀寫索引功能,很容易找到父類里的start、stop和release函數,以及自身的onErrorOnHandler函數里(也就是我們之前拋-421錯誤堆棧的函數)。如果熟悉相機開發的同學應該知道,一般我們界面退到后臺會釋放相機,然后回到前臺重新打開。那么接下來我們把這幾個函數都hook一下,來驗證猜想。

這里我多hook了一個onCaptureStarted函數,這個函數會調用父類的onStart函數,想看看是否會有調了o
很赞哦!(899)
相关文章
- 01 youtube 買粉絲s music 買粉絲 2019(如何讓YTmusic在后臺播放)
- 01 youtube 買粉絲s music 2020 youtube 買粉絲s music(今日新聞淺談:Youtube Music 也加入串流音樂服務大混戰)
- 01 上海鮮購貿易有限公司(重慶公路運輸(集團)有限公司的商貿經營)
- 01 下列不屬于技術商品的貿易類型是(與普通商品貿易相比,技術貿易有哪些特點)
- 01 下載ins怎么注冊不了(ins不能注冊怎么回事)
- 01 youtube 買粉絲s downloader app 買粉絲 apk windows(怎樣將Youtube上影片download在電腦上)
- 01 上海高鐵站到外灘多長時間(上海虹橋高鐵站站到外灘怎么走)
- 01 上海麟遠國際貿易有限公司(上海尤心企業控股有限公司)
- 01 上海鷹德貿易有限公司(德國有什么著名的企業?)
- 01 下列哪種行為可能會引起國際貿易爭端(國際貿易)
热门文章
站长推荐
01 youtube 買粉絲s movies full version中文翻譯(youtube評論翻譯成中文設置)
01 上海高考考外地大學有優勢嗎(本省考生考外省大學有優勢嗎)
01 下載youtube軟件電腦版哪個好玩(哪個音樂軟件音質最好?)
01 youtube 買粉絲s songs 2021(幫忙翻譯一段IPHONE廣告)
01 下載ins原圖的軟件免費(ins怎么下載原圖?)
01 下載ins什么追隨者好(請介紹一下歌特音樂和文化)
01 上海鼎邦國際貿易有限公司(上海鼎邦紅木家具有限公司怎么樣?)
01 youtube 買粉絲s music 買粉絲s 2020 playlist youtube(今日新聞淺談:Youtube Music 也加入串流音樂服務大混戰)