移動端android和ios解碼器自適應軟硬解方案
阿新 • • 發佈:2019-02-19
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專案 |----支援告知上層軟解碼或者硬解碼模式 |----只在預設開啟硬解碼的前提下做軟硬體自適應,不然就不支援