1. 程式人生 > >移動端android和ios解碼器自適應軟硬解方案

移動端android和ios解碼器自適應軟硬解方案

0.小結

之前因為專案需要,需要做軟硬解自適應,看了很多專案,最後自己總結了下,終於做好了軟硬解自適應,下面
下面我將這些思路分享出來。

1.簡介

考慮到後面我們需要加大播放效能,比如播放全幀率1080P或者全幀率1080P以前的視訊,這個時候,我
們就要採取硬解碼的方式。但是如果要真正做的好,就要做到內部軟硬解自適應,參考專案比較多,比如
ijkplayer和ios 專案iOS-H264_FFMpeg-VideoToolbox_VideoPlayer.

2.為什麼我們需要去做軟硬解自適應?

原因有很多,比如第三方對接,如果我們內部不做到軟硬解自適應,那麼會出現很多問題,比如底層開啟
硬解碼不成功,那麼就不出影象了,又比如裝置出的碼流是H265,那麼有些早期的手機就不能播放,這
個時候需要自動切換到軟解碼。

3.怎麼樣去做ios軟硬解自適應?

參考了ios的專案ijkplayer,iOS-H264_FFMpeg-VideoToolbox_VideoPlayer,Kxmovie專案。發現
各有不同指出,其中ijkplayer做的最好。
解說ijkplayer
|----控制元件IJKGLVIEW基於UIView
|----控制元件建立的時候不會去建立opengl專案
|----開啟播放的時候,如果上層配置硬解碼,那麼會去檢測是否可以硬解碼
|----如果發現可以,那麼使用yuv420sp_vbt的opengl專案繪製
|----如果發現不能硬解碼,那麼自動切換軟解碼,繪製的時候使用yuv420p的opengl專案繪製
|----評價:效能強悍,軟硬解效率高,自適應好

解說iOS-H264_FFMpeg-VideoToolbox_VideoPlayer
|----控制元件AAPLEAGLLayer基於CAEAGLLayer
|----這個控制元件其實不算控制元件,可以唄UIVIEW新增到自身的layer中
|----開啟播放的時候,需要寫死硬解碼,如果硬解碼成功,那麼預設走yuv420sp_vbt的opengl專案
|----開啟播放的時候,需要寫死軟解碼,如果軟解碼成功,那麼預設走yuv420sp_vbt的opengl專案,
     需要轉換YUV到CVPixelBufferRef, 再繪製,太耗效能
|----評價:硬解碼時候效能強悍,軟解碼的時候效能差的要死,多次拷貝YUV資料

解說Kxmovie
|----控制元件KxmovieView基於UIView
|----開啟播放的時候,只支援軟解碼
|----配置自身的CAEAGLLayer,實現YUV420P的opengl繪製
|----評價:軟解碼的效能強悍,是直接YUV420P格式繪製

總結Decoder
|----需要建立新控制元件GLView基於UIVIEW,具備建立的時候除了opengl專案,其他都初始化好
|----支援解碼器判斷到軟解和硬解的時候,在繪製前配置好YUV420sp_vbt專案或者YUV420P專案
|----支援兩種繪製,一種是軟解傳y,u,v資料,一種是傳CVPixelBufferRef
|----支援碼流發生變化的時候,主動刪除opengl專案,自動切換到新的opengl專案
|----支援告知上層軟解碼或者硬解碼模式
|----只在預設開啟硬解碼的前提下做軟硬體自適應,不然就不支援

4.怎麼樣去做android軟硬解自適應?

主要參考了android的專案ijkplayer,android_mediacodec_rtsp_h264,MediaCodecExample
er。ijkplayer做的最好但是不適合我當前專案。
解說ijkplayer
|----看了很多,但是不適用,原因是它是jni通過sdl繪製,暫時不深入
|----評價:效能強悍,軟硬解效率高,自適應好

解說ijkplayer和android_mediacodec_rtsp_h264
|----控制元件整合surfaceview
|----使用流的方式,傳給mediacodec,對我啟發比較大
|----評價: 硬解碼效能不錯,沒有軟解碼

總結Decoder:
|----控制元件GLView基於GLSurfaceView,建立的時候,設定繪製模式為自動繪製,建立texture和
     surface
|----預設是建立opengl 硬解碼模式的opengl專案
|----如果底層查到不支援硬解碼,那麼通知上層去設定YUV的快取,然後YUV共享記憶體地址到底層
|----如果檢測到不支援硬解碼,在onDrawFrame中刪除硬解碼的opengl專案,建立新的opengl專案
|----支援碼流發生變化的時候,主動刪除opengl專案,自動切換到
     新的opengl專案
|----支援告知上層軟解碼或者硬解碼模式
|----只在預設開啟硬解碼的前提下做軟硬體自適應,不然就不支援