android webrtc學習 二(H264硬解碼適配基於M79版本)

場景

Android webrtc個人覺得不太友好,對H264的支持實在是太低,不過這也正好觸發我們不斷的去學習和動手去解決遇到的問題;我使用的webrtc版本是m79這個版本,一開始是用master分支的,但考慮到master可能很多大神在修改,可能會有不穩定的情況,所以就選擇了m79版本,這個在此刻應該算是最新的穩定版本了吧!
在使用webrtc開發音視頻通話客戶端過程當中,發現當IOS使用Default編解碼的時候,Android使用Software(軟編解碼)才能和IOS互通,而當IOS改成H264編解碼時,卻發現雖然能跟IOS互通,但是Android卻沒有IOS的畫面,而IOS卻有Android的畫面,IOS跟PC端也是穩定的,那麼問題就定位在Android這裏的,無論Android改成Default還是Hard編解碼,跟IOS總是不能完美的通信;這時候查看DefaultVideoDecoderFactory、DefaultVideoEncoderFactory、HardwareVideoDecoderFactory、HardwareVideoEncoderFactory和MediaCodecVideoDecoderFactory(HardwareVideoDecoderFactory的父類)源碼發現,針對硬解碼和硬編碼來說,webrtc是做了“白名單”設置的

源碼分析和修改

MediaCodecVideoDecoderFactory解碼“白名單”修改

MediaCodecVideoDecoderFactory類是HardwareVideoDecoderFactory的父類,單看HardwareVideoDecoderFactory類並沒有意義,所以看硬解碼的代碼,從MediaCodecVideoDecoderFactory開始。
首先,我們很明確我們解不了碼是因爲解碼器並不支持H264的解碼,所以既然不支持,那麼就還沒到真正解碼的流程當中去,在該類的createDecoder方法當中。
在這裏插入圖片描述
其中的Logging是我自己加的,可以忽略不看。
可以看到,createDecoder很簡單很自然的就去創建了AndroidVideoDecoder解碼,所以這個地方應該不會是我們想要的,畢竟再去看AndroidVideoDecoder類,還是有挺多東西的,在此不做分析;接着往下看
在這裏插入圖片描述
我們看到了getSupportedCodecs方法,在裏面我看到了isH264HighProfileSupported方法,看看這方法怎麼樣:
在這裏插入圖片描述
可以看到,官方的註釋裏面寫着H264只支持QCOM(高通)和Exynos芯片,而我的測試機是華爲和OnePlus,一個是hisi,一個是曉龍,都不支持;所以在這個方法當中,索性將最後的return false改成了return true,如下:
在這裏插入圖片描述
在getSupportedCodecs方法當中,還看到了findCodecForType方法,而在findCodecForType方法當中又看到了isSupportedCodec方法
在這裏插入圖片描述
直接修改isSupportedCodec方法,將最後return的isCodecAllowed方法整個註釋掉,然後直接返回true即可,如下:
在這裏插入圖片描述
到此爲止,解碼的支持算是改完了;但是在通話之前,webrtc需要交換SDP,SDP在我的理解就是告訴對方,我自己存在着什麼實力,解碼支持了,但是編碼我也要先有這個實力纔行

HardwareEncoderFactory編碼H264支持

和解碼同樣的道理,我們在該類當中也能找到getSupportedCodecs和findCodecForType方法,對這兩個方法查看和跟蹤能看到isH264HighProfileSupported方法和isHardwareSupportedInCurrentSdkH264方法,這兩個方法的修改如下:
在這裏插入圖片描述
在這裏插入圖片描述
借鑑於:webrtc android h264編解碼適配

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章